Animowane paski tła, które zmieniają się po najechaniu myszką PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Animowane tło w paski, które przechodzi po najechaniu myszką

Jak często sięgasz po CSS background-size własność? Jeśli jesteś taki jak ja — i prawdopodobnie wielu innych ludzi zajmujących się front-endem — to zwykle wtedy, gdy ty background-size: cover obraz wypełniający przestrzeń całego elementu.

Cóż, postawiono mnie przed interesującym wyzwaniem, które wymagało bardziej zaawansowanego rozmiaru tła: paski tła, które zmieniają się po najechaniu myszką. Sprawdź to i najedź na nie kursorem:

Dzieje się tam o wiele więcej niż rozmiar tła, ale to była sztuczka, której potrzebowałem, aby paski przeszły. Pomyślałem, że pokażę ci, jak do tego doszedłem, nie tylko dlatego, że uważam, że jest to naprawdę fajny efekt wizualny, ale dlatego, że wymagało to ode mnie kreatywnego podejścia do gradientów i trybów mieszania, które, jak sądzę, mogą ci się spodobać.

Zacznijmy od bardzo podstawowej konfiguracji, aby wszystko było proste. Mówię o jedynce

w kodzie HTML stylizowanym na zielony kwadrat:

div {
  width: 500px;
  height: 500px;
  background: palegreen;
}
Animowane tło w paski, które przechodzi po najechaniu myszką

Ustawianie pasków tła

Jeśli twój umysł skierował się prosto do liniowego gradientu CSS, gdy zobaczyłeś te paski, to jesteśmy już na tej samej stronie. W tym przypadku nie możemy dokładnie wykonać powtarzającego się gradientu, ponieważ chcemy, aby paski zajmowały nierówną ilość miejsca i przechodziły między nimi, ale możemy utworzyć pięć pasków, łącząc pięć teł na naszym istniejącym kolorze tła i umieszczając je na górze -prawo kontenera:

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;
}

Zrobiłem poziome paski, ale możemy też przejść w pionie, stosując podejście, które tutaj omawiamy. Możemy to nieco uprościć za pomocą niestandardowych właściwości:

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;
}

Tak więc, --gt wartość to gradient i --n to stała, której używamy do przesunięcia pasków w dół, aby były przesunięte w pionie. I być może zauważyłeś, że nie ustawiłem prawdziwego gradientu, ale raczej solidne czarne paski w linear-gradient() function — jest to zamierzone i za chwilę przejdziemy do tego, dlaczego to zrobiłem.

Jeszcze jedną rzeczą, którą powinniśmy zrobić, zanim przejdziemy dalej, jest zapobieganie powtarzaniu się naszego tła; w przeciwnym razie ułożą się i wypełnią całą przestrzeń:

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;
}

Mogliśmy ustawić background-repeat background skrót, ale zdecydowałem się to tutaj rozbić, aby ułatwić czytanie.

Zrównoważenie pasków

Technicznie rzecz biorąc, mamy paski, ale trudno to stwierdzić, ponieważ nie ma między nimi odstępów i pokrywają cały pojemnik. To bardziej tak, jakbyśmy mieli solidny czarny kwadrat.

W tym miejscu możemy skorzystać z tzw background-size własność. Chcemy ustawić zarówno wysokość, jak i szerokość pasków, a właściwość obsługuje składnię dwuwartościową, która pozwala nam dokładnie to zrobić. I możemy połączyć te rozmiary, oddzielając je przecinkami w taki sam sposób, jak zrobiliśmy to background.

Zacznijmy od prostego ustawienia najpierw szerokości. Używanie składni jednowartościowej dla background-size ustawia szerokość i domyślną wysokość auto. Używam tutaj całkowicie dowolnych wartości, więc ustaw wartości na takie, które najlepiej pasują do twojego projektu:

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%;
}

Jeśli używasz tych samych wartości, co ja, otrzymasz to:

Nie wygląda to tak, jakbyśmy ustawili szerokość dla wszystkich pasków, prawda? To z powodu auto zachowanie wysokości składni pojedynczej wartości. Drugi pasek jest szerszy niż pozostałe poniżej i zakrywa je. Powinniśmy ustawić wysokość tak, żebyśmy mogli zobaczyć naszą pracę. Wszystkie powinny być tej samej wysokości i faktycznie możemy ponownie wykorzystać nasze --n zmienna, ponownie, aby uprościć sprawę:

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
}

Ach, dużo lepiej!

Dodanie odstępów między paskami

Jest to całkowicie opcjonalny krok, jeśli twój projekt nie wymaga przerw między paskami, ale mój tak zrobił i nie jest zbyt skomplikowany. Zmieniamy wysokość każdego paska background-size odrobinę, zmniejszając wartość, aby nie wypełniły całej pionowej przestrzeni.

Możemy nadal korzystać z naszego --n zmiennej, ale odejmij niewielką ilość, powiedzmy 5pxZa pomocą calc() aby dostać to, czego chcemy.

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);

To dużo powtórzeń, które możemy wyeliminować za pomocą innej zmiennej:

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

Maskowanie i mieszanie

Teraz zamieńmy palegreen kolor tła, którego do tej pory używaliśmy do celów wizualnych dla bieli.

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. */
}

Czarno-biały wzór, taki jak ten, jest idealny do maskowania i mieszania. Aby to zrobić, najpierw zawijamy nasze

w nowym kontenerze nadrzędnym i wprowadzić drugi

pod tym:

Zrobimy tutaj mały refaktoring CSS. Teraz, gdy mamy nowy kontener nadrzędny, możemy przekazać plik fixed width i height właściwości, których używaliśmy na naszym

tam:

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

Zamierzam również użyć CSS Grid do ustawienia tych dwóch

elementy jeden na drugim. To jest ta sama sztuczka, której Temani Afif używa do stworzenia swojego super fajne galerie zdjęć. Pomysł polega na tym, że umieszczamy oba elementy div nad pełnym kontenerem, używając metody grid-area property i wyrównaj wszystko w kierunku środka:

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

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

A teraz sprawdź to. Powodem, dla którego wcześniej użyłem solidnego gradientu, który przechodzi od czerni do czerni, jest przygotowanie nas do maskowania i mieszania tych dwóch

warstwy. To nie jest prawdziwe maskowanie w tym sensie, że nazywamy to mask właściwość, ale kontrast między warstwami decyduje o tym, jakie kolory są widoczne. Obszar pokryty bielą pozostanie biały, a obszar pokryty czernią będzie przeciekał. Dokumentacja MDN dotycząca trybów mieszania ma ładne wyjaśnienie, jak to działa.

Aby to zadziałało, zastosuję rzeczywisty gradient, który chcemy zobaczyć na pierwszym

stosując zasady stylu z naszego inicjału

na nowym, używając :nth-child() pseudo-selektor:

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);
}

Jeśli zatrzymamy się tutaj, właściwie nie zobaczymy żadnej wizualnej różnicy w stosunku do tego, co mieliśmy wcześniej. To dlatego, że nie zrobiliśmy jeszcze właściwego mieszania. Więc zróbmy to teraz za pomocą screen tryb mieszania:

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

Użyłem beżowego koloru tła w demo, które pokazałem na początku tego artykułu. Ten nieco ciemniejszy rodzaj złamanej bieli pozwala odrobinie koloru przeniknąć przez resztę tła:

Efekt zawisu

Ostatnim elementem tej układanki jest efekt zawisu, który poszerza paski do pełnej szerokości. Najpierw napiszmy dla niego nasz selektor. Chcemy, aby tak się stało, gdy kontener nadrzędny (

w naszym przypadku) jest zawieszony. Po najechaniu kursorem zmienimy rozmiar tła pasków zawartych w drugim

:

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

Będziemy chcieli zmienić background-size pasków na całą szerokość pojemnika przy zachowaniu tej samej wysokości:

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

To „przyciąga” tło do pełnej szerokości. Jeśli dodamy trochę transition do tego widzimy, jak paski rozszerzają się po najechaniu kursorem:

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

Oto ostateczne demo jeszcze raz:

Dodałem tam tylko tekst, aby pokazać, jak mogłoby wyglądać użycie tego w innym kontekście. Jeśli zrobisz to samo, warto upewnić się, że kontrast między kolorem tekstu a kolorami użytymi w gradiencie jest wystarczający, aby zachować zgodność wytyczne WCAG. I chociaż dotykamy krótko dostępności, warto biorąc pod uwagę preferencje użytkownika dotyczące ograniczonego ruchu jeśli chodzi o efekt zawisu.

To okład!

Całkiem schludnie, prawda? Myślę, że tak. Podoba mi się również to, że jest łatwy w utrzymaniu i dostosowywalny. Na przykład możemy zmienić wysokość, kolory i kierunek pasków, zmieniając kilka wartości. Możesz nawet zmienić tam jeszcze kilka rzeczy — takich jak kolory i szerokości — aby uczynić go jeszcze bardziej konfigurowalnym.

Jestem naprawdę zainteresowany, gdybyś podszedł do tego w inny sposób. Jeśli tak, podziel się w komentarzu! Fajnie byłoby zobaczyć, ile odmian możemy zebrać.

Znak czasu:

Więcej z Sztuczki CSS