:hover
Pseudoklasse:target
PseudoklasseHTML
-Attribut hidden
AJAX
-Anfragen<label>
<input type="checkbox"> Unsichtbares Entdecken?
</label>
<div hidden>
Man sieht mich nicht
</div>
const checkElem = document.querySelector('[type="checkbox"]');
const hiddenElem = document.querySelector('[hidden]');
const updateHidden = _ => {
if (checkElem.checked)
hiddenElem.removeAttribute("hidden");
else
hiddenElem.setAttribute("hidden", "");
};
checkElem.addEventListener('change', updateHidden);
updateHidden();
CSS
-Eigenschaft visibility
visible
ist der Standardwert, das Element wird dargestellthidden
nimmt das Element weiterhin Platz im Layout ein, wird aber nicht dargestelltcollapse
nimmt das Element weder Platz im Layout ein, noch wird es dargestelltcollapse
vollständig ausblendenhidden
: Elemente werden ausgeblendet, ohne dabei zwingend Kindelemente zu beinflussenhover
-Effekte, erlaubt auch Animationenhover
-Ereignisse aus{% for image in page.images %}
<div class="item">
<div class="decoration">
<img src="{{ image.url }}">
<a href="{{ image.cite }}" rel="author">{{ image.name }}</a>
</div>
</div>
{% endfor %}
.item {
float: left;
}
.item .decoration {
visibility: hidden;
width: 100px;
margin: 5px;
border: 5px solid red;
text-align: center;
}
.item .decoration img,
.item:hover .decoration {
visibility: visible;
}
visibility: collapse
und display: flex
collapse
ist für Flexboxen wohldefiniert (und gut implementiert)collapse
sinnvoll nutzbar<ul>
<li id="escort">
<a href="#escort">Escort</a>
<ul>
<li>Dorado</li>
<li>Route 66</li>
<li>Watchpoint: Gibraltar</li>
</ul>
</li>
<li id="control">
<a href="#control">Control</a>
<ul>
<li>Ilios</li>
<li>Lijang Tower</li>
<li>Nepal</li>
<li>Oasis</li>
</ul>
</li>
</ul>
ul > li {
display: flex;
flex-flow: column;
}
ul > li:not(:target):not(:hover) > ul {
visibility: collapse;
}
CSS
-Eigenschaft display
inline
, block
, inline-block
, flex
, …none
display
-Eigenschaftennone
muss irgendwie wieder den ursprünglichen Wert erhalten.hidden
-Klasse mit display
daher nicht möglichCSS
-Eigenschaft opacity
{% for i in (0..10) %}
<div style="opacity: {{ i | divided_by: 10.0 }};">
{{ i | times: 10 }}% Deckkraft
</div>
{% endfor %}
div {
padding: 10px;
margin: 10px;
text-align: center;
background-color: lime;
}
CSS
CSS
-Eigenschaften werden nicht unmittelbar angewendet, sondern zeitabhängig verändertall
möglichtransition-timing-function
<!-- Vorsicht: Dies ist keine Handlebars-Syntax -->
{% for i in (1..5) %}
<div class="bar">
Bar {{ i }}
</div>
{% endfor %}
.bar {
width: 20%;
background-color: red;
text-align: right;
transition: width 2s;
}
.bar:hover {
width: 100%;
}
{% for i in (1..5) %}
<div class="bar">
Bar {{ i }}
</div>
{% endfor %}
.bar {
width: 20%;
background-color: red;
text-align: right;
transition: width 2s, background-color 0.5s;
}
.bar:hover {
width: 100%;
background-color: green;
}
{% for i in (1..5) %}
<div class="bar">
Bar {{ i }}
</div>
{% endfor %}
.bar {
width: 20%;
background-color: red;
border: 2px solid red;
text-align: right;
transition: all 2s;
}
.bar:hover {
width: 90%;
background-color: green;
margin-left: 10%;
border: 2px solid yellow;
}
MInf
und nicht CGT
steps(number, direction)
number
Ganzzahl für die Anzahl der Schrittedirection
ist start
oder end
und bestimmt ob am Anfang oder am Ende keine Zeit vergehen sollframes(number)
number
Ganzzahl für die Anzahl der Schritte<div class="parent">
{% for func in page.transitions %}
<div class="bar"
style="transition-timing-function: {{ func }};">
<code>{{ func }}</code>
</div>
{% endfor %}
</div>
.bar {
width: 25%;
background-color: rgba(255, 0, 0, 0.2);
border: 1px solid black;
margin: 2px;
text-align: right;
transition: width 3s;
}
.parent:hover .bar {
width: 100%;
}
CSS
-Eigenschaften durchlaufen eine Liste von Zuständen (“Keyframe”)animation-name
für die zu verwendende Keyframe-Listeanimation-duration
für die Dauer der Animationanimation-iteration-count
für die Anzahl der Wiederholungen<div class="rainbow">
Rainbow
</div>
@keyframes colorRotate {
from { color: rgb(255, 0, 0); }
16.6% { color: rgb(255, 0, 255); }
33.3% { color: rgb( 0, 0, 255); }
50% { color: rgb( 0, 255, 255); }
66.6% { color: rgb( 0, 255, 0); }
83.3% { color: rgb(255, 255, 0); }
to { color: rgb(255, 0, 0); }
}
.rainbow {
font-size: 15vw;
font-family: monospace;
text-align: center;
animation: colorRotate 3s linear 0s infinite;
}
requestAnimationFrame
draw
-Callback in OpenGLDOM
-Manipulation, <canvas>
-Zeichenoperationen, WebGL-3D-Rendering, …textContent
-Eigenschaft<p>
Es bleiben noch <span id="timeleft">0</span>
Millisekunden bis <time>0</time> ms seit dem ersten
Laden der Seite vergangen sind.
</p>
<button>Neuen Zähler starten</button>
const targetTimeElem = document.querySelector('time');
const timeLeftElem = document.querySelector('#timeleft');
const startTimerBtn = document.querySelector('button');
const updateTargetTime = () => {
targetTimeElem.textContent = performance.now() + 2000;
};
const animateTime = (timestamp) => {
const endTime = +targetTimeElem.textContent;
const remainingTime = endTime - timestamp;
if (remainingTime > 0) {
timeLeftElem.textContent = Math.round(remainingTime);
window.requestAnimationFrame(animateTime);
} else {
timeLeftElem.textContent = 0;
}
};
const startTimer = () => {
updateTargetTime();
window.requestAnimationFrame(animateTime);
};
startTimerBtn.addEventListener('click', startTimer);
startTimer();
rotateX(angle)
oder durch direkte Angabe von Matrizenperspektive
auf dem Elternelement und transform
auf dem Kind<div class="container">
<div class="panel" id="translateNegZ">
translateZ(-200px)
</div>
</div>
<div class="container">
<div class="panel" id="translatePosZ">
translateZ(200px)
</div>
</div>
.container {
perspective: 1000px;
}
#translateNegZ {
transform: translateZ(-200px);
}
#translatePosZ {
transform: translateZ(200px);
}
#rotateX {
transform: rotateX(45deg);
}
#rotateY {
transform: rotateY(45deg);
}
Numerische Parameter der transform
-Eigenschaft lassen sich hervorragend animieren
transition: transform 2000ms;
für alle .panel
-Elementetransform
-Werte bei :hover
.container {
perspective: 1000px;
}
.panel {
transition: transform 2000ms;
}
#translateNegZ:hover {
transform: translateZ(-200px);
}
#translatePosZ:hover {
transform: translateZ(200px);
}
#rotateX:hover {
transform: rotateX(45deg);
}
#rotateY:hover {
transform: rotateY(45deg);
}
{% for card in page.cards %}
<div class="card">
<div class="front">
<h1>{{ card.name }}</h1>
<img src="{{ card.img }}">
<p class="text">{{ card.text }}</p>
</div>
<div class="back">
<img src="/assets/fhw.svg"
alt="Cardback Art">
<h1>The TCG</h1>
</div>
</div>
{% endfor %}
.card {
perspective: 600px;
position: relative;
width: 200px;
height: 300px;
margin: 20px;
}
.card > div {
position: absolute;
backface-visibility: hidden;
transition: transform 1000ms;
height: 100%;
width: 100%;
}
.card .front {
transform: rotateY(180deg);
}
.card:hover .back {
transform: rotateY(180deg);
}
.card:hover .front {
transform: rotateY(360deg);
}