Dungi de fundal animate care trec pe Hover PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Dungi de fundal animate care trec la trecerea cursorului

Cât de des să apelezi la CSS background-size proprietate? Dacă ești ca mine – și probabil o mulțime de alți oameni de front-end – atunci este de obicei atunci când tu background-size: cover o imagine pentru a umple spațiul unui întreg element.

Ei bine, mi s-a prezentat o provocare interesantă care necesita o dimensiune mai avansată a fundalului: dungi de fundal care tranzitează la hover. Verificați acest lucru și treceți-l cu cursorul:

Se întâmplă mult mai mult decât dimensiunea fundalului, dar acesta a fost trucul de care aveam nevoie pentru a face tranziția dungilor. M-am gândit să vă arăt cum am ajuns acolo, nu numai pentru că cred că este un efect vizual foarte drăguț, ci pentru că mi-a cerut să fiu creativ cu gradienți și moduri de amestecare de care cred că v-ar putea plăcea.

Să începem cu o configurație de bază pentru a menține lucrurile simple. Eu vorbesc despre un singur

în HTML care este stilat ca un pătrat verde:

div {
  width: 500px;
  height: 500px;
  background: palegreen;
}
Dungi de fundal animate care trec la trecerea cursorului

Configurarea dungilor de fundal

Dacă mintea ta a mers direct la un gradient liniar CSS când ai văzut acele dungi, atunci suntem deja pe aceeași pagină. Nu putem face exact un gradient care se repetă în acest caz, deoarece dorim ca dungile să ocupe cantități inegale de spațiu și să le tranziți, dar putem crea cinci dungi prin înlănțuirea a cinci fundaluri peste culoarea de fundal existentă și plasându-le în partea de sus. -dreptul containerului:

div {
  width: 500px;
  height: 500px;
  background: 
    linear-gradient(black, black) top right,
    linear-gradient(black, black) top 100px right,
    linear-gradient(black, black) top 200px right,
    linear-gradient(black, black) top 300px right,
    linear-gradient(black, black) top 400px right, 
    palegreen;
}

Am făcut dungi orizontale, dar am putea merge și pe verticală cu abordarea pe care o acoperim aici. Și putem simplifica acest lucru cu proprietăți personalizate:

div {
  --gt: linear-gradient(black, black);
  --n: 100px;

  width: 500px;
  height: 500px;
  background: 
    var(--gt) top right,
    var(--gt) top var(--n) right,
    var(--gt) top calc(var(--n) * 2) right,
    var(--gt) top calc(var(--n) * 3) right,
    var(--gt) top calc(var(--n) * 4) right, 
    palegreen;
}

Deci, --gt valoarea este gradientul și --n este o constantă pe care o folosim pentru a deplasa dungile în jos, astfel încât acestea să fie compensate vertical. Și poate ați observat că nu am stabilit un gradient adevărat, ci mai degrabă dungi negre solide în linear-gradient() funcția - asta este intenționat și vom ajunge la de ce am făcut asta în scurt timp.

Încă un lucru pe care ar trebui să-l facem înainte de a trece mai departe este să ne împiedicăm să se repete mediul; în caz contrar, vor placa și umple întreg spațiul:

div {
  --gt: linear-gradient(black, black);
  --n: 100px;

  width: 500px;
  height: 500px;
  background: 
    var(--gt) top right,
    var(--gt) top var(--n) right,
    var(--gt) top calc(var(--n) * 2) right,
    var(--gt) top calc(var(--n) * 3) right,
    var(--gt) top calc(var(--n) * 4) right, 
    palegreen;
  background-repeat: no-repeat;
}

Am fi putut să setăm background-repeat în background stenografie, dar am decis să o desprind aici pentru a menține lucrurile ușor de citit.

Compensarea dungilor

Din punct de vedere tehnic, avem dungi, dar este destul de greu de spus, deoarece nu există distanță între ele și acoperă întregul container. Este mai degrabă ca și cum am avea un pătrat negru solid.

Aici putem folosi background-size proprietate. Vrem să setăm atât înălțimea, cât și lățimea dungilor, iar proprietatea acceptă o sintaxă cu două valori care ne permite să facem exact asta. Și, putem înlănțui acele dimensiuni prin virgulă, separându-le în același mod în care am procedat background.

Să începem simplu prin a seta mai întâi lățimile. Folosind sintaxa cu o singură valoare pentru background-size setează lățimea și setează implicit înălțimea la auto. Folosesc valori total arbitrare aici, așa că setați valorile la ceea ce funcționează cel mai bine pentru designul dvs.:

div {
  --gt: linear-gradient(black, black);
  --n: 100px;

  width: 500px;
  height: 500px;
  background: 
    var(--gt) top right,
    var(--gt) top var(--n) right,
    var(--gt) top calc(var(--n) * 2) right,
    var(--gt) top calc(var(--n) * 3) right,
    var(--gt) top calc(var(--n) * 4) right, 
    palegreen;
  background-repeat: no-repeat;
  background-size: 60%, 90%, 70%, 40%, 10%;
}

Dacă utilizați aceleași valori ca și mine, veți obține asta:

Nu pare exact ca am stabilit lățimea pentru toate dungile, nu-i așa? Asta din cauza auto comportamentul la înălțime al sintaxei cu o singură valoare. A doua dungă este mai lată decât celelalte de sub ea și le acoperă. Ar trebui să stabilim înălțimile astfel încât să ne vedem munca. Ar trebui să aibă toate la aceeași înălțime și le putem reutiliza --n variabilă, din nou, pentru a menține lucrurile simple:

div {
  --gt: linear-gradient(black, black);
  --n: 100px;

  width: 500px;
  height: 500px;
  background: 
    var(--gt) top right,
    var(--gt) top var(--n) right,
    var(--gt) top calc(var(--n) * 2) right,
    var(--gt) top calc(var(--n) * 3) right,
    var(--gt) top calc(var(--n) * 4) right, 
    palegreen;
    background-repeat: no-repeat;
    background-size: 60% var(--n), 90% var(--n), 70% var(--n), 40% var(--n), 10% var(--n); // HIGHLIGHT 15
}

Ah, mult mai bine!

Adăugarea de goluri între dungi

Acesta este un pas total opțional dacă designul dvs. nu necesită spații între dungi, dar al meu a făcut-o și nu este prea complicat. Schimbăm înălțimea fiecărei dungi background-size o smidge, scăzând valoarea, astfel încât să nu umple întreg spațiul vertical.

Putem continua să ne folosim --n variabilă, dar scădeți o cantitate mică, să zicem 5px, Folosind calc() pentru a obține ceea ce ne dorim.

background-size: 60% calc(var(--n) - 5px), 90% calc(var(--n) - 5px), 70% calc(var(--n) - 5px), 40% calc(var(--n) - 5px), 10% calc(var(--n) - 5px);

Este multă repetare pe care o putem elimina cu o altă variabilă:

div {
  --h: calc(var(--n) - 5px);
  /* etc. */
  background-size: 60% var(--h), 90% var(--h), 70% var(--h), 40% var(--h), 10% var(--h);
}

Mascare și amestecare

Acum să schimbăm palegreen culoarea de fundal pe care am folosit-o în scopuri vizuale până în acest moment pentru alb.

div {
  /* etc. */
  background: 
    var(--gt) top right,
    var(--gt) top var(--n) right,
    var(--gt) top calc(var(--n) * 2) right,
    var(--gt) top calc(var(--n) * 3) right,
    var(--gt) top calc(var(--n) * 4) right, 
    #fff;
  /* etc. */
}

Un model alb-negru ca acesta este perfect pentru mascare și amestecare. Pentru a face asta, mai întâi vom împacheta

într-un nou container părinte și introduceți un al doilea

sub ea:

Vom face o mică re-factorizare CSS aici. Acum că avem un nou container părinte, putem trece fix width și height proprietățile pe care le folosim la noi

dincolo:

section {
  width: 500px;
  height: 500px;
} 

De asemenea, voi folosi CSS Grid pentru a le poziționa pe cele două

elemente una peste alta. Acesta este același truc pe care Temani Afif îl folosește pentru a-și crea galerii de imagini super cool. Ideea este că plasăm ambele div-uri peste containerul plin folosind grid-area proprietate și aliniați totul spre centru:

section {
  display: grid;
  align-items: center;
  justify-items: center;
  width: 500px;
  height: 500px;
} 

section > div {
  width: inherit;
  height: inherit;
  grid-area: 1 / 1;
}

Acum, verifică asta. Motivul pentru care am folosit un gradient solid care trece de la negru la negru mai devreme este pentru a ne pregăti pentru a masca și a amesteca cele două

straturi. Aceasta nu este o mascare adevărată în sensul pe care îl numim mask proprietate, dar contrastul dintre straturi controlează ce culori sunt vizibile. Zona acoperită de alb va rămâne albă, iar zona acoperită de negru trece prin scurgeri. Documentația MDN despre modurile de amestecare are o explicație bună despre cum funcționează.

Pentru ca acest lucru să funcționeze, voi aplica gradientul real pe care vrem să-l vedem pe primul

aplicand in acelasi timp regulile de stil de la initiala noastra

pe cel nou, folosind :nth-child() pseudo-selector:

div:nth-child(1) { 
  background: linear-gradient(to right, red, orange); 
}

div:nth-child(2)  {
  --gt: linear-gradient(black, black);
  --n: 100px;
  --h: calc(var(--n) - 5px);
  background: 
    var(--gt) top right,
    var(--gt) top var(--n) right,
    var(--gt) top calc(var(--n) * 2) right,
    var(--gt) top calc(var(--n) * 3) right,
    var(--gt) top calc(var(--n) * 4) right, 
    white;
  background-repeat: no-repeat;
  background-size: 60% var(--h), 90% var(--h), 70% var(--h), 40% var(--h), 10% var(--h);
}

Dacă ne oprim aici, de fapt nu vom vedea nicio diferență vizuală față de ceea ce aveam înainte. Asta pentru că nu am făcut încă amestecul propriu-zis. Deci, hai să facem asta acum folosind screen modul amestec:

div:nth-child(2)  {
  /* etc. */
  mix-blend-mode: screen;
}

Am folosit o culoare de fundal bej în demo-ul pe care l-am arătat la începutul acestui articol. Acest tip de colorare alb aproape puțin mai închisă permite o mică culoare să curgă prin restul fundalului:

Efectul hover

Ultima piesă a acestui puzzle este efectul de hover care lărgește dungile la lățime completă. Mai întâi, să scriem selectorul nostru pentru acesta. Dorim ca acest lucru să se întâmple atunci când containerul părinte (

în cazul nostru) este planat. Când trece cu mouse-ul, vom schimba dimensiunea de fundal a dungilor conținute în al doilea

:

/* When 
is hovered, change the second div's styles */ section:hover > div:nth-child(2){ /* styles go here */ }

Vom dori să schimbăm background-size a dungilor pe toată lățimea recipientului, menținând în același timp aceeași înălțime:

section:hover > div:nth-child(2){
  background-size: 100% var(--h);
}

Asta „face” fundalul la lățimea completă. Daca adaugam putin transition la aceasta, apoi vedem dungile se extind la hover:

section:hover > div:nth-child(2){
  background-size: 100% var(--h);
  transition: background-size 1s;
}

Iată încă o dată acel demo final:

Am adăugat text acolo doar pentru a arăta cum ar putea arăta dacă îl utilizați într-un context diferit. Dacă procedați la fel, atunci merită să vă asigurați că există suficient contrast între culoarea textului și culorile utilizate în gradient pentru a se conforma orientări WCAG. Și în timp ce ne referim pe scurt la accesibilitate, merită luând în considerare preferințele utilizatorului pentru mișcare redusă când vine vorba de efectul hover.

Asta-i o înfășurare!

Destul de îngrijit, nu? Cu siguranță așa cred. Ceea ce îmi place și la asta este că este destul de ușor de întreținut și personalizabil. De exemplu, putem modifica înălțimea, culorile și direcția dungilor modificând câteva valori. S-ar putea chiar să mai variați câteva lucruri acolo - cum ar fi culorile și lățimile - pentru a le face și mai configurabile.

Sunt foarte interesat dacă ați fi abordat asta într-un mod diferit. Dacă da, vă rugăm să distribuiți în comentarii! Ar fi bine să vedem câte variații putem colecta.

Timestamp-ul:

Mai mult de la CSS Trucuri