In mijn vorige zelfstudie heb ik je laten zien hoe je CSS 3D Transforms kunt gebruiken om een isometrische rasterlay-out te maken. Het was een hele uitdaging, omdat een paar browsers zoals Firefox enigszins verschillende benaderingen hebben met betrekking tot hoe ze elementen op een driedimensionaal vlak weergeven.
In deze tutorial zullen we 3D Transforms blijven verkennen, door een 3D parallax rollover-effect te ontwikkelen, geïnspireerd door de interface van Apple TV. We zullen Envato Elements nog steeds gebruiken als inspiratie voor onze inhoud; Dit is waar we naartoe werken:
Plaats de muisaanwijzer op de miniatuur en beweeg uw cursor rond; de miniatuur zal leunen afhankelijk van de cursorpositie en de bewegingsrichting.
Als mens is onze zichtbaarheid beperkt tot de verdwijnende horizon, en onze verrekijkervisie creëert wat we waarnemen perspectief. Perspectief helpt ons om een voorwerp te interpreteren als verder weg, in plaats van simpelweg kleiner te zijn.
Het isometrische raster van de vorige zelfstudie houdt geen rekening met "perspectief". De rastergrootte - hoogte en breedte - wordt eigenlijk behouden. In werkelijkheid zouden we de verste kant van het raster moeten zien slinken vanwege perspectief.
In CSS kunnen we perspectief toevoegen aan 3D-transformatie via de perspectief()
functie. Het is vermeldenswaard dat perspectief()
moet worden toegevoegd voordat andere transformatiefuncties zoals draaien()
en vertalen()
om het effect te krijgen. Het vereist ook een waarde die de kijkafstand ten opzichte van het element definieert; of het element van veraf of dichtbij moet worden bekeken.
#perspectief transform: perspective (600px) rotateX (60deg) rotateY (0deg) rotateZ (-45deg);
Dat is hoe we een 3D-vlak renderen met CSS. Laten we nu kijken hoe we dit kunnen toepassen om een te maken parallax effect. We beginnen met de HTML:
Als je onze vorige tutorial goed hebt gevolgd, zul je merken dat de HTML-markup behoorlijk op elkaar lijkt. Hier hebben we een div
met een klasse van ItemCard
het omwikkelen van de naam, de afbeelding en de koppeling naar een van de items op Envato Elements.
fontsHerbert Lemuel
August10
Voeg de bovenstaande HTML-markup van boven naar beneden toe.
We beginnen met het toevoegen van een aantal resetstijlen, waarmee in dit geval de boxgrootte van het element wordt ingesteld border-box
, Verwijder de figuur
elementmarge en maak het beeld vloeiend.
html box-sizing: border-box; *, *: before, *: after box-sizing: inherit; figuur marge: 0; img max-width: 100%; hoogte: auto;
Met dat gedaan, voegen we een aantal stijlen toe aan de ItemCard
. Voorbij de esthetische regels zoals border-radius
en box-shadow
, we definiëren de elementovergang en -transformatie inclusief de perspectief()
functie.
.ItemCard positie: relatief; weergave: flex; overloop verborgen; flex-richting: kolom; cursor: wijzer; border-radius: 6px; vakschaduw: 0 2px 10px rgba (0,0,0, .3); uitlijnen-items: center; maximale breedte: 510 px; hoogte: auto; overgang: transform .5s cubic-bezier (.215, .61, .355, 1), box-shadow .5s cubic-bezier (.215, .61, .355, 1); transformatie: perspectief (600px) translate3d (0, 0, 0);
Voor meer informatie over wat kubieke Bezier ()
doet hier, bekijk de cursus van Guy Routledge:
Vervolgens voegen we stijlen toe aan de ItemCard
kind elementen; de itemnaam, de naam van de itemauteur en de itemcategorie. Op dezelfde manier definiëren de stijlen de zichtbaarheid, positie, dimensionering, overgangen en transformaties van deze elementen.
.ItemCard .cover positie: absoluut; boven: 0; links: 0; breedte: 100%; hoogte: 100%; .ItemCard__dest z-index: 30; weergave: blok; .ItemCard__thumb position: relative; z-index: 3; opvulling: 0; overgang: transformeer .2s; .ItemCard__thumb img weergave: blok; overgang: doosschaduw 0.2s; .ItemCard__layer z-index: 10; overgang: opacity 1s cubic-bezier (0.215, 0.61, 0.355, 1); dekking: 0; achtergrond: lineair verloop (120 graden, # 9d50bb 0%, # 4096ee 100%); .ItemCard__summary z-index: 20; opvulling: 25px; weergave: flex; flex-richting: kolom; transformatie: perspectief (600px) translate3d (0, 100%, 0); text-align: center; kleur: #fff; justify-content: center; .ItemCard__title margin: 8px 0; font-gewicht: 900; transformatie: translate3d (0, 150px, 50px); text-transform: hoofdletters; kleur: #fff; lettertypegrootte: 19px; regelhoogte: 1,48;
Voeg de volgende stijlen toe om de onderliggende elementen van de te maken ItemCard
en de .ItemCard__summary
compatibel met driedimensionale weergave.
/ ** * Bewaar 3D-elementen voor de afstammelingen * / .ItemCard, .ItemCard__summary transform-style: preserve-3d; backface-visibility: verborgen;
De ItemCard
hover-statusstijlen definiëren de box-shadow
zo goed de Z
as van sommige van de onderliggende elementen:
/ ** * Hover States * / .ItemCard: hover box-shadow: 0 15px 30px rgba (0, 0, 0, 0.3); .ItemCard: hover .ItemCard__layer opacity: .9; .ItemCard: hover .ItemCard__title transform: translate3d (0, 0, 50px); .ItemCard: hover .ItemCard__meta.category transform: translate3d (0, 0, 40px); .ItemCard: hover .ItemCard__meta.designer transition-delay: .05s; transformatie: translate3d (0, 0, 20px);
Op dit punt heb je iets dat lijkt op het volgende:
Initial en hover state-stijlenWe gaan hier wat jQuery gebruiken, dus zorg ervoor dat je ergens vanuit je document naar jQuery linkt. Voeg in CodePen https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js toe als een extern JavaScript-pad.
Het parallax-effect wordt toegepast via twee jQuery-gebeurtenissen mousemove
en mouseout
. De mousemove
gebeurtenis wordt geactiveerd wanneer de cursor over het doelelement beweegt; in dit geval,.ItemCard
. De mouseout
flitst wanneer de muiscursor zich al buiten het doelelement bevindt.
$ (document) .on ("mousemove", ".ItemCard", functie (event) ) .on ("mouseout", ".ItemCard", function () );
Tijdens de mousemove
gebeurtenis, we halen de coördinaten van de muiscursor op, bepalen de ItemCard
roteren en pas deze nummers toe door inline stijlen toe te voegen. Tijdens de mouseout
evenement, we verwijderen de inline-stijl zodat de ItemCard
keert terug naar zijn oorspronkelijke positie.
$ (document) .on ("mousemove", ".ItemCard", functie (event) / ** * De helft van de 'ItemCard'-breedte * @type integer * / var halfW = (this.clientWidth / 2) ; / ** * De helft van de 'ItemCard'-lengte * @type geheel getal * / var halfH = (this.clientHeight / 2); / ** * Muiscursor X-coördinaat * @type integer * / var coorX = (halfW - (event.pageX - this.offsetLeft)); / ** * Muiscursor Y-coördinaat * @type geheel getal * / var coorY = (halfH - (event.pageY - this.offsetTop)); / ** * X Rotatiegraad van 'ItemCard' * @type integer * / var degX = ((coorY / halfH) * 10) + 'deg'; // max. Graad = 10 / ** * Y Rotatiegraad van 'ItemCard '* @type integer * / var degY = ((coorX / halfW) * -10) +' deg '; // max. graad = 10 / ** * Voeg de inline-stijlen * / $ (this) .css toe ('transform', function () return 'perspectief (600px) translate3d (0, -2px, 0) schaal (1.1) rotateX (' + degX + ') rotateY (' + degY + ')';). kinderen ('.ItemCard__summary') .css ('transform', function () return 'perspectief (600px) translate3d (0, 0, 0) rotateX ('+ degX +') rotateY ('+ degY +') '; ); ) .on ("mouseout", ".ItemCard", function () / ** * Verwijder de inline stijlen * / $ (this) .removeAttr ('style') .children ('.ItemCard__summary') .removeAttr ( 'stijl' ); );
Klaar is kees.
In deze zelfstudie hebben we geleerd hoe we 3D-transformaties kunnen gebruiken om een 3D parallaxeffect te maken dat is geïnspireerd op Apple TV.
Houd in gedachten dat dit effect niet goed werkt op apparaten met aanraakbediening, dus je moet een soort terugval overwegen, mogelijk met Touch Events om het parallax-effect te reproduceren - ik laat dat op tafel liggen om aan te pakken!