box-shadow to właściwość CSS, która dodaje do dowolnego elementu cienie, poświaty i wklęsłe zagłębienia. To najmocniejsza dźwignia, by nadać płaskiemu projektowi poczucie *wysokości*: karty odrywają się od strony, okna modalne unoszą się nad treścią, a przyciski wyglądają na możliwe do wciśnięcia.
Sztuka polega na tym, że *dobry* cień rzadko ma jedną warstwę. Prawdziwe cienie są miększe i mają rozproszone odbicie światła, dlatego większość systemów projektowych (Material, iOS, Tailwind) układa 2 lub 3 deklaracje box-shadow z różnymi przesunięciami i kryciem. Pisanie ich ręcznie jest żmudne, a generator pozwala dopracować każdą warstwę wizualnie i od razu zobaczyć połączony efekt.
Generator Coddy obsługuje dowolną liczbę warstw, cienie *zewnętrzne* i *wewnętrzne* (inset), kolor i krycie dla każdej warstwy oraz gotowe ustawienia dla najczęstszych wzorców: subtelne karty, ostre cienie, poświaty w kolorze marki, wklęsłe pola i powierzchnie neumorficzne. Skopiuj CSS i wklej go prosto do arkusza stylów, bez wysyłania plików, bez konta i bez znaku wodnego.
Co warto wiedzieć o box-shadow w CSS
Składnia to box-shadow: [inset] <x> <y> <blur> <spread> <color>. inset umieszcza cień *wewnątrz* elementu, a bez niego cień pada na zewnątrz.
*Rozmycie* (blur) zmiękcza krawędź: większe wartości dają bardziej rozproszony cień. *Rozciągnięcie* (spread) powiększa lub zmniejsza cień przed zastosowaniem rozmycia (wartości ujemne go ściągają, co przydaje się przy miękkim uniesieniu).
Wiele cieni oddziela się przecinkami, a układają się od tyłu do przodu w kolejności zapisu: pierwszy na liście leży w końcowym obrazie *pod* kolejnymi.
Używaj rgba() (lub hsla()) dla koloru, żeby ustawiać krycie każdej warstwy. Czysta czerń przy niskim kryciu wygląda jak miękki szary cień, a przy pełnym kryciu jak twarde wycięcie.
box-shadow jest składany przez GPU i to jedno z najtańszych ulepszeń wizualnych, jakie można zastosować. Nie wpływa na układ: element zachowuje swój rozmiar i pozycję.
Jak zaprojektować box-shadow
1
Zacznij od gotowego ustawienia
Wybierz ustawienie, które pasuje do efektu, jakiego szukasz: subtelna karta, miękkie uniesienie, ostry cień, poświata marki, wklęsłe pole lub neumorfizm. To dobre punkty startowe do dalszego dopracowania.
2
Dostosuj aktywną warstwę
Przesuwaj suwaki przesunięcia X/Y, rozmycia, rozciągnięcia, koloru i krycia. Podgląd po lewej aktualizuje się na żywo. Mniejsze krycie i większe rozmycie dają *miększe* cienie.
3
Dodaj kolejne warstwy
Kliknij *Dodaj warstwę*, aby nałożyć drugi cień. Realistyczna głębia prawie zawsze wymaga dwóch warstw: krótkiej i zwartej (cień kontaktowy) oraz długiej i miękkiej (cień otoczenia).
4
Włącz inset dla wklęsłych pól
Włączenie opcji *Inset* maluje cień wewnątrz elementu zamiast wokół niego. Połącz to z subtelnym cieniem zewnętrznym, aby uzyskać efekt wciśniętego przycisku.
5
Skopiuj CSS
Gdy podgląd odpowiada projektowi, kliknij *Kopiuj CSS*. Wklej wynik do arkusza stylów: wygenerowana reguła zawiera każdą aktywną warstwę.
Box-shadow: ściąga
Każda wartość w box-shadow: x y blur spread color i jej rola.
Wartość
Efekt
Typowy zakres
Przesunięcie X
Przesuwa cień w poziomie, dodatnie = w prawo
od −40px do 40px
Przesunięcie Y
Przesuwa cień w pionie, dodatnie = w dół
od 0px do 40px dla naturalnego światła
Rozmycie (blur)
Zmiękcza krawędź cienia
od 0px do 80px
Rozciągnięcie (spread)
Powiększa lub zmniejsza cień przed rozmyciem
od −30px do 30px
Kolor
Dowolny kolor CSS, ale rgba() pozwala ustawić krycie każdej warstwy
rgba(0,0,0,0.05–0.3) dla naturalnych cieni
inset
Maluje cień wewnątrz elementu
-
Wiele warstw
Oddzielone przecinkami, układane od tyłu do przodu
Zwarty cień o małym rozmyciu wyznacza punkt styku, a dłuższy, miększy cień daje wrażenie światła otoczenia. To wzorzec, którego używa większość nowoczesnych systemów projektowych.
Poświata marki
Miękka kolorowa poświata
box-shadow:0024px4pxrgba(108,140,255,0.45);
Ustaw X i Y na zero, żeby poświata rozchodziła się równomiernie. Małe dodatnie rozciągnięcie pogrubia poświatę, zanim rozmycie ją zmiękczy. Używaj oszczędnie, bo kolorowe poświaty mocno przyciągają uwagę.
Cienie inset są malowane wewnątrz elementu. Jeden miękki cień daje wrażenie wklęsłego pola, a cienki inset dodaje subtelną wewnętrzną ramkę dla wyrazistości.
Częste błędy przy box-shadow
Używanie czystej czerni z wysokim kryciem. Wygląda jak twarde wycięcie, a nie cień. Zmniejsz krycie do 0,06 do 0,18, aby uzyskać naturalnie wyglądające uniesienie.
Zapominanie o przesunięciu Y. Cień z X=0 i Y=0 leży równo *za* elementem: dobrze dla poświaty, źle dla karty, która ma wyglądać, jakby się unosiła.
Nakładanie zbyt wielu warstw. Trzy zwykle w zupełności wystarczą, a dziesięć daje mętny, rozmazany efekt i zauważalny koszt renderowania.
Używanie filter: drop-shadow() i box-shadow zamiennie. drop-shadow() podąża za maską alfa SVG lub obrazu, co przydaje się przy nieregularnych kształtach, ale box-shadow jest szybszy i czystszy dla prostokątnych elementów.
Zapominanie, że box-shadow ignoruje overflow: hidden na samym elemencie. Jeśli rodzic ma overflow: hidden, cień zostanie przycięty.
Box-shadow w CSS: FAQ
Co oznacza każda wartość box-shadow?
box-shadow: x y blur spread color. Pierwsze dwie to przesunięcia, *blur* zmiękcza krawędź, *spread* zmienia rozmiar przed rozmyciem, a kolor to dowolny kolor CSS (użyj rgba(), by kontrolować krycie). Dodaj inset na początku, aby umieścić cień wewnątrz elementu.
Jak nałożyć kilka cieni w jednej regule?
Oddziel każdy cień przecinkiem. Renderują się od tyłu do przodu w kolejności zapisu, więc pierwszy zadeklarowany cień ląduje *pod* kolejnymi. Użyj tego, by połączyć zwarty cień kontaktowy z miękkim cieniem otoczenia.
Czym różni się box-shadow od filter: drop-shadow()?
box-shadow podąża za prostokątem otaczającym element i szybko się maluje. drop-shadow() podąża za kanałem alfa tego, do czego go zastosowano (świetne dla SVG i przezroczystych PNG), ale jego renderowanie kosztuje więcej. Używaj box-shadow dla kart i przycisków, a drop-shadow() dla nieregularnych kształtów.
Dlaczego mój cień wygląda na pikselowy?
Albo rozmycie jest bardzo małe (rozmycie 0 px to z założenia ostry cień), albo element jest skalowany. Zwiększ wartość rozmycia lub poszukaj transform: scale() gdzieś wyżej w drzewie.
Czy box-shadow wpływa na układ strony?
Nie. Cienie są malowane poza ramką elementu, ale nie przesuwają sąsiedniej treści. Jeśli rodzic ma zostawić miejsce na cień, dodaj mu padding lub overflow: visible.