Pseudo-elementen animeren
Pseudo-elementen is als zomaar twee extra DOM elementen krijgen. Ze staan ons toe om extra content, decoratie enzoverder toe te voegen zonder extra HTML toe te voegen. Bovendien kunnen ze geanimeerd worden. In deze post zullen we een pseudo-element gebruiken om een beetje meer visuele flair toe te voegen aan een knop.
Pseudo-elementen
Binnen CSS kan je een pseudo-element definiëren met behulp van ::before
of ::after
. Het pseudo-element wordt dan toegevoegd aan je element, tussen het element en enige content. Doordat het reageert als een alleenstaand element kan er stijl, positie enzovoort aan toegevoegd worden. De code ziet er dan min of meer uit als volgt:
.pebble::before {
...
}
.pebble::after {
...
}
Op dit punt zijn aan ons .pebble
element twee virtuele elementen toegevoegd, deze kunnen we voorzien van opmaak als we ze nodig hebben.
Opmerking bij "::" tov. ‘:’
De dubbele dubbelpunt ::
is algemeen aanvaard als notatie voor pseudo-elementen (tegenover de notatie voor pseudo-klasses zoals :hover, :first-child). Als je support voor IE8 nodig hebt is het beter om de enkele :
te gebruiken. Alle andere browsers en nieuwere versies van IE bieden ondersteuning voor de dubbele.
Vergeet de "content" niet
Als je psuedo-elementen toevoegt is het belangrijk om ook de content
property te specificeren om het element zichtbaar te maken op de pagina. Als het psuedo-element aangemaakt is in een inhoudsloze staat dan kunnen we de content
property als leeg definiëren op deze manier:
.pebble::before {
content: ""
... more styling goes here...
}
Op deze manier zou het element zichtbaar moeten zijn op het scherm.
Voorbeeld: Glanzende knop
Voor dit voorbeeld gebruiken we een pseudo-element om een glanzend effect te creëren als je er over hovert. Hieronder vind je een voorbeeld hiervan (hover of tik om het effect te zien).
Om te beginnen, wat HTML:
<button>Oooh SHINY</button>
Omdat we pseudo-elementen gebruiken hebben we niet meer dan deze HTML nodig om dit te doen werken. Het is aangeraden om een klasse toe te voegen aan de knop als je hem van stijl zou moeten voorzien op meer dan één pagina. Voor dit voorbeeld houden we het bij de generische knop voor de eenvoud.
Het glanseffect toevoegen
Het glanzende effect is een lineaire gradient die over de knop ligt. Om dit te creëren gebruiken we het after
pseudo-element en positioneren het in een beginpositie buiten de knop:
button::after {
content: '';
position: absolute;
top: -50%;
right: -50%;
bottom: -50%;
left: -50%;
background: linear-gradient(to bottom, rgba(229, 172, 142, 0), rgba(255,255,255,0.5) 50%, rgba(229, 172, 142, 0));
transform: rotateZ(60deg) translate(-5em, 7.5em);
}
Het glanseffect is opgebouwd uit een gradient die gaat van de kleur van de knop tot wit en terug. Op dit punt staat het nu aan de buitenkant van de knop.
We moeten deze glanzende laag verbergen zodat ze enkel zichtbaar bij hover. Om dit te toen zetten we de overflow
property van de knop op hidden
. Omdat het pseudo-element in de knop zit zal het niet zichtbaar zijn als het buiten de knop gepositioneerd is.
button {
background: #e5ac8e;
color: #fff;
font-size: 14px;
border-radius: 0.5em;
padding: 0 1em;
position: relative;
overflow: hidden;
line-height: 32px;
}
Ik heb ook wat andere stijl meegegeven om de knop zijn eigen look te geven. Wat belangrijk is om mee te geven is het gebruik van position: relative
. Ik heb deze property meegegeven om ervoor te zorgen dat het absoluut gepositioneerd psuedo-element zou bestaan binnen de knop. Zonder de positie te specificeren zou het absoluut gepositioneerd item zich plaatsen binnen het parent element.
De animatie toevoegen
Doordat we animatie gebruiken in dit voorbeeld zijn er twee stappen die we moeten doorlopen. De eerste stap is om aan de browser mee te geven dat er animatie moet zijn bij de hover-state. Dan werken we exact uit wat de animatie moet doen aan de hand van keyframes
.
De hover-state toevoegen kan door after
aan de hover
vast te hangen.
button:hover::after, button:focus::after {
animation: sheen 1s forwards;
}
Hier vertellen we de browser dat bij een hover-state, het after
pseudo-element een animation
moet hebben. De animatie, die we sheen noemen, duurt één seconde en stop zonder op het einde te herhalen.
De volgorde is hier belangrijk. ::after:hover
gebruiken zal niet werken omdat we de browser dan vertellen om te reageren op de hover-state van het pseudo-element zelf.
Ik heb de focus-state ook toegevoegd. Dit betekent dat de gebruikers die door te pagina gaan met de ‘tab’-toets ook het glanseffect zullen zien, zonder over de knop te moeten hoveren. (Bedankt, Šime Vidas, voor de tip)
Laten we de keyframes
specificeren voor deze animatie:
@keyframes sheen {
100% {
transform: rotateZ(60deg) translate(1em, -9em);
}
}
In dit geval hebben we maar één keyframe nodig. Omdat de startpositie (0%) geïmpliceerd wordt door de startpositie van het pseudo-element moeten we enkel de eindpositie bepalen. In dit geval is de eindpositie aan de rechterbovenhoek van de knop. De browser zal het glanseffect dan voor ons animeren over de knop heen.
Browser gerelateerde opmerkingen
De animation property wordt goed ondersteund, net als de pseudo-elementen. Het is altijd een goed idee om de -webkit
en -moz
prefixes aan de keyframes
en transforms toe te voegen.