Menu

Cień w CSS: box-shadow, spread, inset i przykłady

box-shadow rysuje cienie wokół pudełka elementu. Poznaj pięć wartości (x, y, rozmycie, spread, kolor), cienie inset, nakładanie kilku cieni dla realistycznej głębi, obrysy fokusu zrobione przez spread i błędy, przez które cienie wyglądają brudno.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Jak działa box-shadow

box-shadow maluje cień wokół pudełka obramowania elementu. Uwzględnia border-radius, nie zajmuje miejsca w układzie i potrzebuje co najmniej dwóch wartości: o ile przesunąć go w poziomie i w pionie.

Składnia

box-shadow: [inset] <offset-x> <offset-y> [<blur>] [<spread>] [<color>];
WartośćZnaczenieDomyślnie
insetRysuje cień wewnątrz pudełka, jak wciśnięty obszarNa zewnątrz
offset-xDodatnia przesuwa w prawo, ujemna w lewoWymagana
offset-yDodatnia przesuwa w dół, ujemna w góręWymagana
blurJak miękka jest krawędź; nie może być ujemna0 (ostra krawędź)
spreadPowiększa (dodatnia) albo zmniejsza (ujemna) cień0
colorDowolny kolor; zwykle najlepiej wygląda półprzezroczysta czerńKolor tekstu

Liczba długości decyduje o ich znaczeniu: dwie to przesunięcia, trzecia dodaje rozmycie, czwarta spread. Wypróbuj:

Wypróbuj 0 0 0 4px #f59e0b (pierścień), inset 0 0 12px #2563eb i -8px -8px 0 #16a34a.

Spread: pierścienie i cienie z jednej strony

Spread zmienia rozmiar cienia przed rozmyciem. Wynikają z tego dwa wzorce:

  • Pierścień: bez przesunięcia, bez rozmycia, tylko spread. W przeciwieństwie do obramowania nie zmienia rozmiaru elementu, więc to dobry wskaźnik fokusu (:focus-visible { box-shadow: 0 0 0 3px #2563eb; }).
  • Pierścień z odstępem: połóż biały spread pod większym, kolorowym.
  • Tylko jedna strona: przesuń cień w dół i zmniejsz go ujemnym spreadem, żeby wystawał tylko na dole.

Warstwy cieni dla realistycznej głębi

Prawdziwe cienie mają ciemną, ostrą część blisko obiektu i miękką, bladą część dalej. Dwie albo trzy warstwy naśladują to dużo lepiej niż jedno duże rozmycie:

Pierwszy cień na liście jest malowany na wierzchu. Kolory cieni ustawiaj jako półprzezroczystą czerń albo ciemny odcień tła, nigdy jako czystą szarość, żeby przyciemniały to, co jest pod spodem.

Cienie inset

inset rysuje cień wewnątrz obszaru paddingu, jakby powierzchnia była wciśnięta. Pasuje do pól tekstowych, zagłębień i wciśniętych przycisków:

input {
  box-shadow: inset 0 1px 3px rgb(0 0 0 / 20%);
}
button:active {
  box-shadow: inset 0 3px 6px rgb(0 0 0 / 30%);
}

Cień inset jest rysowany nad tłem, ale pod treścią. Cienie, które podążają za kształtem liter zamiast pudełka, to text-shadow.

Częste błędy

  • Czysto czarne, w pełni nieprzezroczyste cienie. Wyglądają jak ciemny obrys. Użyj alfy od 10% do 30%.
  • Jedno ogromne rozmycie dla głębi. Połącz mały ostry cień z dużym miękkim.
  • Cień ucięty na krawędzi. Przycina go przodek z overflow: hidden; dodaj przodkowi padding albo przenieś regułę overflow.
  • Ujemne rozmycie. Jest niepoprawne i cała deklaracja zostaje zignorowana.
  • Animowanie box-shadow na wielu elementach. Przemalowuje każdą klatkę. Na ciężkich stronach animuj zamiast tego opacity pseudoelementu, który niesie większy cień.

Najczęściej zadawane pytania

Jaka jest składnia box-shadow?

box-shadow: offset-x offset-y blur spread color;, na przykład box-shadow: 0 4px 12px 0 rgb(0 0 0 / 15%);. Wymagane są tylko dwa przesunięcia; dodaj inset, żeby narysować cień wewnątrz pudełka.

Co robi spread w box-shadow?

Powiększa (wartość dodatnia) albo zmniejsza (wartość ujemna) cień, zanim zostanie rozmyty. Cień bez przesunięcia, bez rozmycia i ze spreadem 3px to jednolity pierścień o grubości 3px wokół elementu.

Jak zrobić cień tylko na dole?

Przesuń go w dół i zmniejsz ujemnym spreadem, żeby zniknęły boki: box-shadow: 0 8px 6px -6px rgb(0 0 0 / 40%);.

Czy box-shadow wpływa na układ strony?

Nie. Cień nie zajmuje miejsca i nie przesuwa innych elementów, dlatego dobrze nadaje się do obrysu fokusu albo uniesienia przy najechaniu bez przesunięć układu. Może go jednak przyciąć overflow: hidden u przodka.

Czy można mieć kilka cieni box-shadow?

Tak, oddziel je przecinkami. Pierwszy cień jest rysowany na wierzchu. Połączenie małego ostrego cienia z dużym miękkim wygląda naturalniej niż jeden duży cień.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ