- Les 7
- What CSS can do
- Transition
- Filter, transform en 3D-effect
- Animation
- Position fixed
- Opdracht: Foodblog animeren
- Responsive design
- Links
Je kan ontzettend veel toffe animaties maken met CSS. Zie hieronder wat inspiratie.
- Codepen Spark (kat in wasmachine en glas effect), en A single div
- CSS Tricks - cool card navigation
- Linktree - background blur en ronddraaiende cards
Met een transition kan je bepalen hoe snel de CSS van een element verandert. Dit past goed bij hover
effecten, en werkt voor bijna alle eigenschappen, zoals:
- kleur,
- afmeting,
- transform,
- margin, padding
- box-shadow,
- css filter
In dit voorbeeld komt een kaartje in 1 seconde los van de ondergrond on mouse hover. De transition komt langzaam op gang, en remt aan het einde weer af (ease).
.card {
color:white;
background-color:lightgrey;
transform-origin:center;
transition: all 1s ease;
}
.card:hover {
color:black;
background-color:darkgrey;
box-shadow: 5px 5px 10px rgb(0 0 0 / 0.4);
transform:scale(1.2);
}
Hulpbronnen
Je kunt met CSS meerdere effecten toepassen op HTML-elementen. Hieronder staan er drie toegelicht.
Er zijn verschillende filters beschikbaar die je op je elementen kan loslaten. Deze filters werken goed samen met transitions en animations.
div {
filter: blur(20px) brightness(50%) saturate(4) hue-rotate(24deg);
}
Hulpbronnen
Met transform kan je een element schalen, roteren of verplaatsen, zonder dat je layout verstoord wordt. Dit werkt vaak goed samen met hover
effecten en animaties. Als je meerdere transforms wil combineren moet je die samen op 1 regel plaatsen. Met translate
verplaats je het element op de x,y as. Met transform-origin
bepaal je het middelpunt van de transform.
div {
transform:scale(2) rotate(10deg) translate(10px, 10px);
transform-origin:center;
}
Hulpbronnen
- Documentatie transform
- Tutorial over transform
- Video over transform
- Video met voorbeelden van transform
- Video over transform én animation
Je kan elementen roteren op een 3D as, met rotateX
, rotateY
, rotateZ
. Je moet de parent container een perspective
waarde geven, dit is de afstand van het element tot de gebruiker.
.parent {
perspective:100px;
}
.child {
transform: rotateY(20deg);
}
Hulpbronnen
Een animation bepaalt net als een transition hoe de CSS van een element verandert. Je hebt alleen veel meer controle over wat er met het element gebeurt. Een animatie kan je laten afspelen tussen twee of meer keyframes. De animatie kan automatisch afspelen, en je kan meerdere complexe animaties na elkaar laten afspelen. Om te beginnen bepaal je met CSS @keyframes
welke eigenschappen gaan animeren.
@keyframes my-cool-animation {
from {
opacity:0;
transform: translateX(20%);
}
to {
opacity:1;
transform: translateX(0%);
}
}
Vervolgens kan je de keyframes toekennen aan een element via het animation
keyword. Hierin kan je ook aangeven hoe lang de animatie duurt, of het moet herhalen, etc.
div {
animation: 3s ease-in infinite my-cool-animation;
}
De browser inspector heeft een animation inspector om de timing van je animaties mee te ontwerpen.
Hulpbronnen
We hebben geleerd dat layout elementen automatisch door de browser worden gepositioneerd, dit noemen we "document flow" of "normal flow". Er zijn gevallen waarin je zelf de positie van een element wil hardcoderen, waarbij het geen deel uitmaakt van die flow. Bijvoorbeeld: een chat venster dat altijd rechtsonderin je pagina blijft staan. Met de eigenschap position:fixed
wordt een element uit de flow gehaald. Je kan het nu zelf positioneren met bottom, top, left, right
. Het element blijft op die plek staan zelfs als het venster scrolt.
.chatwindow {
position:fixed;
bottom:20px;
right:20px;
}
Een sticky element krijgt een fixed
position zodra de gebruiker een bepaald punt voorbij scrolt. Dit werkt goed voor nav
elementen.
nav.sticky {
position: sticky;
top: 20px;
}
Voer onderstaande opdrachten uit op de Foodblog die je in een eerdere les hebt gemaakt. Maak eventueel een kopie van dat project als je het origineel wilt behouden.
- Plaats een
hover
effect op je nav bar buttons. - Gebruik
transition
om de hover te animeren.
- Gebruik
position:sticky
entop:0
om de nav bar vast te zetten, zelfs als de pagina scrolt.
- Plaats een aantal divs naast elkaar met de class
card
. - On
hover
maak je de card groter mettransform:scale(1.1)
en je voegt een schaduw toe metbox-shadow
. - Geef de card een
transition
zodat de animatie geleidelijk gaat.
- Ontwerp een chat window in een eigen div element, onder je andere html code.
- Gebruik
position fixed
metbottom, right
om het chat window rechtsonderin beeld te fixeren, ongeacht de scroll-positie. - Met
transform:translateX()
plaats je nu het chat window rechts buiten beeld - Ontwerp een
@keyframes
animatie die detranslateX()
weer terug op 0 zet. - Gebruik
animation
om het chat window te animeren. De animatie speelt maar 1x, dit doe je metforwards
.
- Falling Cards
- Audio Bars
Gebruik de animation en keyframes documentatie om de oefeningen te kunnen maken.
- Plaats een aantal
cards
naast elkaar in een section metflex
. Dit is de eindpositie. Geef de section eenperspective
van bv. 200px. - Geef de cards een startpositie, van waaruit ze straks in beeld gaan vallen. Dit doe je met
opacity
en verschillendetransforms
, zoalsscale
,rotateY
entranslateZ
. - In je
@keyframes
animatie zet je de cards weer terug op hun eindpositie. Je kan hiertransform:none
gebruiken. - Gebruik
animation
om de cards te animeren. De animatie speelt maar 1x, dit doe je metease-out animation forwards
. - Geef elke card een
id
. Gebruikanimation-delay
om elke kaart een eigen delay te geven. Daardoor vallen ze na elkaar in beeld. - Gebruik de easing inspector om de kaartjes te laten stuiteren.
VOORBEELD
STARTCODE
HTML
<section>
<div>Luffy</div>
<div>Zoro</div>
<div>Nami</div>
<div>Sanji</div>
<div>Tony</div>
<div>Franky</div>
<div>Brook</div>
<div>Jinbei</div>
</section>
CSS
section {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
gap: 20px;
}
section div {
background-color: white;
width: 120px;
height: 120px;
border-radius: 20px;
padding: 20px;
}
@keyframes {
from {
}
to {
}
}
ADVANCED
- Gebruik
background-image:url()
entext-shadow
om de kaartjes vorm te geven!
- Plaats vijf divs naast elkaar in een flex container. Geef de divs een achtergrondkleur.
- Gebruik keyframes om de
height
van een bar te animeren. Je kan meerdere stappen in een animatie maken, zodat de bar niet meteen van vol naar leeg gaat. - Geef elke bar een
id
. Geef elke bar een eigenanimation
met verschillendetime
en dedelay
. - De animaties zijn
alternate infinite
zodat het eeuwig doorgaat en weer terug gaat naar de beginpositie.
VOORBEELD
STARTCODE
HTML
<section>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</section>
CSS
section {
width:300px;
height:200px;
display:flex;
gap:5px;
align-items:end;
}
section div {
background-color:grey;
flex:1;
height:100%;
}
@keyframes {
0% {
}
25% {
}
50% {
}
100% {
}
}
Advanced
- Geef de bars deze background image zodat de bar van groen naar rood gaat. Dit doe je met
background-image:url()
. - Gebruik
background-position:bottom
zodat groen onderaan staat. - Gebruik
background-size:100px 200px
zodat de achtergrondafmeting hetzelfde is als de bar.
VOORBEELD
Op mobiel wil je wellicht geen hover
effecten hebben, omdat er geen muispointer is. Je kan dit oplossen met @media (hover: hover) {}
. Dit is een media query die alleen wordt uitgevoerd als de gebruiker een muispointer heeft.
@media (hover: hover) {
/* css die alleen werkt als er een muispointer is */
}
- Video: Learn CSS animation in 15 minutes
- W3Schools animations
- MDN Animations
- CSS Filter
- CSS Gradient
- Blend mode
- Ontwerp easing met de browser inspector of kies een custom easing
- Achterkant Div en voorbeeld
- Animatie gebaseerd op scroll
- Animeer een SVG illustratie en meer voorbeelden
- Tools om CSS animaties en shapes te ontwerpen