PROJEKT – Jak dodać śnieg na stronę WWW?

CSSFrontendHTMLJavaScript
Grafika przedstawiająca iMaca, który stoi na biurku. Na tapecie pokazany są góry i padający śnieg.

Mamy zimę, więc postanowiłem napisać krótki poradnik, w którym pokażę Wam jak dodać padający śnieg na stronę internetową.

W projekcie wykorzystamy z CSS oraz JavaScript. ❄️

Pada śnieg, pada śnieg…

Choć padający śnieg na stronach internetowych to widok spotykany w latach 2000-2010, to jednak napisanie tak prostego skryptu w JS daje sporo satysfakcji i bez wątpienia jest to szansa na nauczenie się czegoś nowego. 🙂

P.S. Na samym dole przygotowałem dla Was małe wyzwanie!

CSS

Na początku przejdziemy do CSS-a i ostylujemy naszą stronę.

* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;  
}
/* Podstawowy reset CSS. */

body {
  height: 100vh;
  background-color: royalblue;
  overflow: hidden;
}
/* Chcemy, aby nasza strona była wysoka na cały ekran i miała niebieski kolor tła. 
Co więcej, nie chcemy, aby animowane płatki śniegu psuły widok strony,
dlatego to, co będzie wyciekało poza nasz viewport, będzie ukrywane. */

i.snowflake {
  position: absolute;
  top: -50px;
  animation: snow linear;
}
/* Do płatków śniegu wykorzystamy tagi <i> z klasą "snowflake".
Samą ikoną płatku śniegu zajmiemy się w JS-ie.  */

@keyframes snow {
	to {
		transform: translateY(110vh);
	}
}
/* Animacja, dzięki której płatki śniegu będą opadały (przesuwały się w dół na osi Y). */

JavaScript

Style w CSS gotowe – czas na JS!

Kod podzieliłem na moduły, aby łatwiej było go zrozumieć. Na samym dole tego wpisu znajdziecie cały skrypt. 😉

Nasz programik zaczynamy od dodania funkcji, w której będziemy tworzyć płatki śniegu.

Skorzystamy z tagów <i>, w których umieścimy nasze płatki (w moim przypadku będzie to emotka systemowa, ale można tu skorzystać z np. ikon SVG).

Dodamy też klasę snowflake, którą stworzyliśmy w CSS.


const createSnow = () => {
	const snowflake = document.createElement('i')
	snowflake.classList.add('snowflake')
	snowflake.textContent = '❄️'
}	

Teraz zadbamy o losowość. Nie chcemy przecież, aby wszystkie płatki śniegu pojawiły się w tym samym miejscu i opadały z dokładnie tą samą prędkością.

Dlatego do funkcji createSnow dodamy poniższy kod odpowiadający za losową pozycję left, losowy czas trwania animacji oraz losowe opacity, dzięki któremu uzyskamy efekt głębi.

snowflake.style.left = Math.random() * window.innerWidth + 'px'
// Generujemy losową pozycję na osi X.

snowflake.style.animationDuration = Math.random() * 5 + 3 + 's'
// Animacja będzie trwała od 3 do 8 sekund.

snowflake.style.opacity = Math.random()
// Losowe opacity, dzięki któremu uzyskamy efekt głębi.

Kolejnym krokiem będzie dodanie naszego płatka śniegu na stronę.

Co więcej, aby uniknąć problemów z wydajnością, które mogłyby się pojawić przez miliony stworzonych płatków śniegu w naszym DOM, będziemy je kasować co 8 sekund (a więc wtedy, kiedy najdłuższa animacja dobiegnie końca).

document.body.append(snowflake)

setTimeout(() => {
	snowflake.remove()
  }, 8000)
}

Ostatnim krokiem jest wywołanie funkcji createSnow.

Ta będzie uruchamiana co 50ms. Jeśli chcemy więcej płatków śniegu na stronie, wystarczy zmniejszyć tę wartość do np. 5ms.

Jeśli chcemy nieco spokojniejszy wariant, możemy ustalić np. 500ms.

setInterval(createSnow, 50)

SKRYPT:

const createSnow = () => {
	const snowflake = document.createElement('i')
	snowflake.classList.add('snowflake')
	snowflake.textContent = '❄️'

	snowflake.style.left = Math.random() * window.innerWidth + 'px'
	snowflake.style.animationDuration = Math.random() * 5 + 3 + 's'
	snowflake.style.opacity = Math.random()

	document.body.append(snowflake)

	setTimeout(() => {
		snowflake.remove()
	}, 8000)
}

setInterval(createSnow, 50)

Podgląd na żywo: https://codepen.io/majek93/pen/vYJjYNY

Jak widzicie, sam skrypt nie jest wcale taki skomplikowany, dlatego przygotowałem dla Was małe wyzwanie! 😉

Spróbujcie dodać do kodu możliwość tworzenia się zasp śnieżnych na dole strony. Im więcej śniegu spadnie, tym większa powinna być zaspa (może to być zwykły biały prostokąt).

PODPOWIEDŹ: Można do tego wykorzystać div z białym tłem, którego wysokość będzie rosła wraz z ilością wygenerowanych płatków śniegu (++). 🙂

Rozwiązaniem możesz pochwalić się na naszym Discordzie!

Poprzedni wpis
Magic Numbers, czyli bardzo złe praktyki w naszym kodzie
Następny wpis
Różnice między modalem, popupem itd.