Crearea unui sens al 3D cu proprietatea perspectivă a CSS3

Ce veți crea

În acest tutorial, vom crea un element interactiv cu proprietatea perspectivă CSS3 pentru a da un sentiment de trei dimensiuni. Acest tutorial vă va învăța cum să utilizați jQuery cu evenimentele mouse-ului pentru a obține poziții de elemente în JavaScript și cum să manipulați proprietățile CSS.

Structura HTML pentru proprietatea Perspective

Avem nevoie de o relație părinte-copil pentru ca proprietatea perspectivă să funcționeze corect. Să creați mai întâi structura HTML și apoi să continuați cu stilul CSS.

Munte

5 zile

Insulă

2 zile

Aici împachetăm două card elemente într-un div cu id de cardsWrapper. De asemenea, asta cardsWrapper este înfășurat într-un alt div pentru a putea manipula ușor poziția sa în cadrul ferestrei de vizualizare.

Fiecare element cu clasa de card are un imagine element, care cuprinde ecran și text elemente. Structura este puțin vagă pentru moment, însă voi explica utilizarea fiecărui element în secțiunile viitoare.

Să folosim următorul stil CSS pentru a poziționa elementele noastre.

#mainWrapper display: flex; justify-content: centru; aliniere: centru; înălțime: 350px;  #carduriWrapper display: flex; justify-content: spațiu-între; lățime: 700px;  .card lățime: 300px; înălțime: 175px; fundal-culoare: roșu;  .image lățime: 100%; înălțime: 100%; fundal-culoare: roșu; 

Utilizând proprietatea Perspective

perspectivă proprietatea este ceva ce trebuie să setați în divina mamă care conține divs pe care doriți să le transformați cu simțul perspectivei. Imaginați-vă că divina mamă este lumea voastră și că are o anumită valoare perspectivă pe care o experimentați.

Să adăugăm perspectivă proprietate div divorț, care este card. Suntem selectați card element ca părinte, nu cardsWrapper, deoarece dorim să avem un efect vizual individual asupra fiecărui element de card.

Tweak CSS din card după cum urmează.

.carte lățime: 300px; înălțime: 175px; fundal-culoare: roșu; perspectivă: 500px; 

Încercați acum să adăugați o transforma proprietății elementului imagine pentru a vedea efectul perspectivei.

.imagine lățime: 100%; înălțime: 100%; fundal-culoare: roșu; transformă: rotateX (30deg); 

De cand imagine este copilul direct al card, este afectată de perspectivă. Cu toate acestea, dacă încercați să adăugați o transforma de proprietate pentru orice copil al imagine, acest lucru nu ar funcționa.

Pentru ca acești copii să fie transformați relativ la părintele lor, adică imagine element în acest exemplu, ar trebui să utilizați transform-stil: conserve-3d pe elementul părinte.

.imagine lățime: 100%; înălțime: 100%; stilul transformat: păstrați-3d; transformă: rotateX (30deg); 

Acum avem un fundal suficient în proprietatea perspectivelor și suntem gata să continuăm cu stylingul celorlalte elemente.

Nu uitați să eliminați transforma: rotateX (30deg) din elementul dvs. de imagine.

Modelarea cardurilor

Avem un imagine element și, pe deasupra, avem un element numit ecran, și apoi text. Deoarece utilizăm perspectiva aici, vă puteți gândi la fiecare dintre aceste elemente ca straturi individuale.

Acum vom adăuga o imagine de fundal pentru noi imagine div și apoi stilul ecran și text element.

Să utilizăm următorul stil CSS pentru a adăuga o imagine de fundal fiecărui obiect de carte.

.image.first background-image: url ("https://c1.staticflickr.com/1/343/31652757460_b2b5794a51_n.jpg");  .image.second fundal-imagine: url ("https://c2.staticflickr.com/2/1506/25121644830_2d768ef51a_n.jpg"); 

Acum o vom modela ecran element.

Deoarece vrem ecran elementul să aibă exact aceeași dimensiune ca și părintele său imagine element, folosim valorile de lățime și înălțime 100% și o culoare de fundal negru de culoare gri cu un canal alfa.

Partea de import este transformare: scara translateZ (30px) (0.940).

Deci, aici traducem doar ecran element pe axa Z cu 20 px. Acest lucru face să se deplaseze peste imagine element. Deoarece este spre noi, va avea o dimensiune mai mare, datorită regulilor de perspectivă. Prin urmare, o scalim pentru a se potrivi cu dimensiunea cu elementul părinte. Dacă utilizați valori de traducere diferite, valoarea scării ar varia. De asemenea, definirea diferitelor dimensiuni de înălțime și lățime pentru elementul părinte ar conduce la o cerință a unei valori de scalare diferite.

.ecran culoare-fundal: rgba (0, 0, 0, 0,22); lățime: 100%; înălțime: 100%; transformare: scara translateZ (30px) (0.940); 

Pentru a înțelege ce se întâmplă aici, rotiți-vă doar imagine element în jurul axelor X și Y prin adăugarea următoarei linii în regula CSS:

transformare: rotateX (30deg) rotateY (30deg)

Acum ultima parte a acestei secțiuni este stilul text element, care este destul de banal.

În principiu, folosim aceleași setări de transformare pentru text pentru a avea acelasi nivel ca si ecran element. Restul CSS este un stil simplu. Puteți să-l optimizați așa cum doriți.

.text position: absolute; fund: 25px; stânga: 30px; culoare albă; transformare: scara translateZ (30px) (0.940);  .text p cursor: implicit; umplutura: 0; marja: 0;  .text p: prima de tip font-size: 2em; margin-bottom: 5px;  .text p: ultimul tip font-size: 1em; 

Acesta este rezultatul final cu rotație manuală pentru a vedea efectul.

Înainte de a continua, ștergeți regulile de rotație din CSS, deoarece vom controla automat rotația în funcție de poziția cursorului.

Acum vom scrie un cod jQuery pentru a face aceste carduri interactive.

Hai să ajungem la asta!

Adăugarea interacțiunii cu jQuery

Să începem cu codul de bază jQuery.

(funcția ($) ) (jQuery);

Vom scrie totul în interiorul acestei funcții. Acest lucru va permite jQuery să aștepte până când DOM este gata.

Deoarece suntem interesați să interacționăm cu noi card element, trebuie să-l selectăm.

(funcția ($) var card = $ (". carte");) (jQuery);

Următorul pas este înregistrarea poziției cursorului pe elementul cardului. Pentru a face acest lucru, vom folosi built-in-ul mousemove eveniment.

(funcția ($) var card = $ ("carte"); card.on ('mousemove', funcția (e) );) (jQuery);

Acum trebuie să urmărim poziția cursorului. Este un pic dificil să obțineți valorile corecte.

(funcția ($) var card = $ (".card"); card.on ('mousemove', funcția (e) var x = e.clientX - $ (this) fereastra) .scrollLeft (); var y = e.clientY - $ (aceasta) .offset () top + $ (fereastra) .scrollTop ();));) (jQuery);

Aici, e.clientX și e.clientY returnați poziția cursorului în interiorul ferestrei de vizualizare. Cu toate acestea, deoarece fiecare card obiectul este poziționat în raport cu portul de vizualizare, trebuie să compensăm acest lucru prin extragerea valorilor de deplasare stânga și de sus.

Ultimul și cel mai important lucru de luat în considerare este compensarea derulării ferestrelor. Deci, deoarece poziția cursorului dvs. este înregistrată în raport cu portul de vizualizare, dar valorile offset sunt fixe, atunci când defilați, obiectul dvs. se apropie de partea superioară sau din stânga portului de vizualizare, în funcție de direcția în care ați derulat. 

Ca rezultat, distanța noastră relativă față de partea superioară sau din stânga a ferestrei de vizualizare ar fi mai mică. Cu toate acestea, deoarece valorile offset sunt fixe, trebuie să compensăm acest lucru, iar acest lucru se face de către $ (Fereastră) .scrollLeft () și $ (Fereastră) .scrollTop (). Astfel, prin adăugarea acestor valori la variabilele respective, compensăm doar suma pe care am derulat-o. Ca urmare, atunci când plasați cursorul peste oricare dintre dvs. card elemente, poziția dvs. X ar varia de la 0 la lățimea cardului, care este definită ca 300px. De asemenea, poziția Y ar varia de la 0 la înălțimea cardului, care este de 175px.

Următorul pas este să cartografiați poziția cursorului într-o nouă gamă, care va fi cantitatea de rotație pe care dorim să o aplicăm în unități de grad, astfel încât atunci când cursorul dvs. se află în mijlocul elementului cardului, acesta ar arăta simplu, dar când vă mutați în stânga / dreapta sau în partea de sus / de jos, veți obține un efect de rotație, ca în cazul în care cardul urmărește cursorul.

Iată o ilustrare rapidă a rezultatului funcției de cartografiere.

harta funcției (x, in_min, in_max, out_min, out_max) întoarcere (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; 

În această funcție, in_min și in_max parametrii sunt valorile minime și maxime ale valorii de intrare, care corespund lățimii și înălțimii card element. out_min și out_max sunt valorile minime și maxime pe care va fi mapată intrarea.

Să folosim această funcție de hartă cu pozițiile cursorului nostru X și Y.

(funcția ($) var card = $ (".card"); card.on ('mousemove', funcția (e) var x = e.clientX - $ (this) fereastra) .scrollLeft (); var y = e.clientY - $ (acest) .offset () top + $ (fereastra) .scrollTop (); var rY = hartă (x, 0, $ (X, in_min, in_max, out_min, out_max) retur (x, in_min, in_max, out_min, out_max) (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;) (jQuery);

Acum valorile noastre sunt mapate RX și rY.

Următorul pas este stabilirea unei reguli CSS pentru imagine utilizând valorile mapate ca valori de rotație.

(funcția ($) var card = $ (".card"); card.on ('mousemove', funcția (e) var x = e.clientX - $ (this) fereastra) .scrollLeft (); var y = e.clientY - $ (acest) .offset () top + $ (fereastra) .scrollTop (); var rY = hartă (x, 0, $ ), Cd ("transforma"), cd ("transform"), , "rotateY (" + rY + "deg)" + "" + "rotateX (" + -rX + "deg)"); - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;) (jQuery);

Aici am selectat copiii din card element numit imagine, și apoi setați regula CSS pentru a roti acest element în jurul axelor X și Y prin RX și rY grade, respectiv.

Veți realiza că elementele cărții urmează cursorul în perspectivele respective. Cu toate acestea, atunci când cursorul este în afara elementelor cardului, acestea își păstrează orientările. În plus, ele reacționează brusc la prezența cursorului peste elementul cardului. Așadar, trebuie să rezolvăm și acele cazuri când mouse-ul intră și iese din elementul cardului.

Pentru a rezolva aceste probleme, trebuie să folosim mouseenter și mouseleave evenimente.

Când mouse-ul intră în regiunea card element, adăugăm o regulă CSS de tranziție la imagine element. Acest lucru va permite o tranziție lină pentru "privirea" imagine element.

card.on ('mouseenter', functie () $ (this) .copii (".simag") css (tranziție: "toate" + 0,05 + "s" + "liniar");

De asemenea, trebuie să ne descurcăm mouseleave eveniment.

Aici, adaug, de asemenea, o altă regulă CSS de tranziție cu un calendar diferit, ceea ce face o tranziție mai ușoară la poziția inițială atunci când mouse-ul părăsește card element. 

De asemenea, adaug regula de transformare CSS pentru a reseta rotațiile card element.

card.on ('mouseleave', funcția () $ (this) .copii (".configurare") css (tranziție: "tot" + 0.2 + "s" + " .cad ("transform", "rotateY (" + 0 + "deg)" + "" + "rotateX (" + 0 + "deg)");

Deci, codul nostru final jQuery arată astfel:

(funcția ($) var card = $ (".card"); card.on ('mousemove', funcția (e) var x = e.clientX - $ (this) fereastra) .scrollLeft (); var y = e.clientY - $ (acest) .offset () top + $ (fereastra) .scrollTop (); var rY = hartă (x, 0, $ ), Cd ("transforma"), cd ("transform"), , "rotateY (" + rY + "deg)" + "" + "rotateX (" + -rX + "deg)"); copii ("imagine") css (tranziție: "toate" + 0,05 + "s" + "liniar",); copii ("imagine") css (tranziție: "toți" + 0.2 + "s" + "liniar",) (x, in_min, in_max, out_min, out_max) întoarcere (x - in_min), rotateY ("+ 0 +" deg) "+" "+" rotateX ("+ 0 +" deg) * (out_max - out_min) / (in_max - in_min) + out_min;) (jQuery);

Iată rezultatul final. De asemenea, am folosit un font diferit de sans-serif pe text element pentru a face să arate mai bine.

Concluzie

Pe parcursul acestui tutorial, am învățat cum să folosim proprietatea perspectivei și structura HTML necesară pentru ca aceasta să funcționeze corect. Mai mult, am acoperit cum să înregistrăm poziția cursorului mouse-ului atunci când se așează peste un anumit element HTML.

În plus, am folosit mousemovemouseenter, și mouseleave evenimente pentru a introduce interactivitate prin adăugarea de reguli CSS la elemente HTML cu jQuery.

Sper că v-ați bucurat de acest tutorial și ați învățat câteva metode utile.

Cod