Kort fortalt
- CSS-egenskaben box shadow tager et valgfrit inset-nøgleord, to forskydninger, en sløringsradius, en spredningsradius og en farve.
- En enkelt box shadow ser kunstig ud, fordi ægte genstande kaster en skarp kontaktskygge og en bred blød skygge på samme tid.
- At lægge tre til fem skygger i lag, hver med omkring dobbelt så stor forskydning og sløring som den forrige og lav opacitet, giver en blød, troværdig skygge.
- At tone skyggen mod baggrundens farvetone ser mere naturligt ud end ren sort på farvede eller varme overflader.
- At animere box-shadow tegner forfra i hver frame, så tone i stedet opaciteten af et pseudoelement, der bærer den større skygge.
På denne side
En CSS box shadow skrives box-shadow: 0 4px 12px rgb(0 0 0 / 0.15): en vandret forskydning, en lodret forskydning, en sløringsradius, en valgfri spredning og en farve. Den ene skygge er fin til en hurtig prototype, men den ser sjældent ægte ud. De skygger, der overbeviser øjet, ligger i lag: flere skygger på ét element, hver større og svagere end den forrige, tonet til at passe til overfladen under.
box-shadow-syntaks
/* inset? | offset-x | offset-y | blur | spread | color */
.card { box-shadow: 0 4px 12px 0 rgb(0 0 0 / 0.15); }
/* Negative spread tucks the shadow under the box */
.card { box-shadow: 0 12px 24px -8px rgb(0 0 0 / 0.25); }
/* Inset: a shadow inside the box, like a pressed well */
.well { box-shadow: inset 0 2px 4px rgb(0 0 0 / 0.12); }
/* Spread only: a hairline that follows border-radius */
.chip { box-shadow: 0 0 0 1px rgb(15 23 42 / 0.08); }
/* Several shadows, comma separated, first on top */
.card { box-shadow: 0 1px 2px rgb(0 0 0 / 0.1), 0 8px 16px rgb(0 0 0 / 0.08); }border-radius, og derfor giver en skygge med kun spredning en pæn afrundet hårstreg uden at ændre layoutet.insetFraEffekt
Standard
Effekt
Effekt
Standard
Effekt
currentcolorEffekt
Hvorfor en enkelt skygge ser falsk ud
Læg en bog på et bord, og se på dens skygge. Lige ved kanten, hvor den rører, er skyggen mørk og skarp. Længere ude bliver den bred og svag, fordi lys omslutter genstanden fra mange retninger. Én box-shadow kan kun være en af de ting ad gangen: stram og hård eller bred og sløret. Uanset hvad opdager øjet, at der mangler noget.
Enkelt skygge
- Én mellemstor sløring i 25 procent sort
- Grå glorie hele vejen rundt om kortet
- Svært at se, hvor højt kortet svæver
- Ser snavset ud på farvede baggrunde
Lagdelt skygge
- Fire skygger, hver svagere og bredere
- Tæt nær kanten, luftig længere væk
- Højden læses med et blik
- Tonet, så den sidder naturligt på sin overflade
Sådan lægger du box shadows i lag
Metoden er enkel: start småt og skarpt, og fordobl så forskydning og sløring for hvert ekstra lag, mens hvert lag holdes svagt. Opaciteterne lægger sig sammen, hvor lagene overlapper, så de enkelte værdier kan være overraskende lave.
- 1
Start med en kontaktskygge
0 1px 1pxved omkring 8 procent opacitet. Det er den mørke streg lige under kanten. - 2
Fordobl for hvert lag
Derefter
0 2px 2px,0 4px 4px,0 8px 8px. Forskydning og sløring vokser sammen, så lyset ser ud til at komme ovenfra. - 3
Hold hvert lag svagt
Mellem 5 og 10 procent hver. Ser resultatet tungt ud, så fjern det største lag, før du gør noget mørkere.
- 4
Tone farven
Erstat sort med en dyb udgave af baggrundens farvetone, for eksempel en marineblå på blå sider eller en brun på creme.
:root {
/* Shadow colour as channels, so opacity can vary per layer */
--shadow-color: 222 47% 11%;
--shadow-sm:
0 1px 1px hsl(var(--shadow-color) / 0.08),
0 2px 2px hsl(var(--shadow-color) / 0.06);
--shadow-md:
0 1px 1px hsl(var(--shadow-color) / 0.08),
0 2px 2px hsl(var(--shadow-color) / 0.07),
0 4px 4px hsl(var(--shadow-color) / 0.06),
0 8px 8px hsl(var(--shadow-color) / 0.05);
--shadow-lg:
0 1px 1px hsl(var(--shadow-color) / 0.07),
0 2px 2px hsl(var(--shadow-color) / 0.07),
0 4px 4px hsl(var(--shadow-color) / 0.06),
0 8px 8px hsl(var(--shadow-color) / 0.06),
0 16px 16px hsl(var(--shadow-color) / 0.05),
0 32px 32px hsl(var(--shadow-color) / 0.04);
}
.card { box-shadow: var(--shadow-md); }
.dialog { box-shadow: var(--shadow-lg); }--shadow-color én gang, og hver skygge i systemet følger med.At gemme skygger som variabler gør dem til design tokens, som holder hvert kort, hver menu og hver dialog ensartet. CSS-variabler til temaer og design tokens viser, hvordan du kobler dem ind i et helt tema.
En højdeskala til en brugerflade
Skygge er et signal om højde, så den bør betyde det samme overalt. Vælg tre eller fire niveauer, og tildel dem opgaver. Alt, der svæver højere, får en større, blødere skygge, aldrig bare en mørkere.
Bruges til
--shadow-smBruges til
--shadow-mdBruges til
--shadow-lgBruges til
Skygger på farvede og mørke baggrunde
Rent sorte skygger bliver grå og mudrede på en farvet overflade, på samme måde som sort blandet i maling gør den kedelig. Tag i stedet skyggefarven fra baggrunden: en dyb blågrøn skygge på en mynteside, en mørk blomme på en lilla. På gradientbaggrunde skal du vælge gradientens mørkeste stop og bruge det ved lav opacitet.
I mørk tilstand forsvinder skygger næsten, fordi der er lidt lys, de kan blokere. Vis højde ved i stedet at gøre hævede overflader en smule lysere, og behold en svag hårstreg ved kanten. Design af mørk tilstand gennemgår overfladefarverne. Til paneler, der svæver over billeder, adskiller et backdrop filter ofte lagene bedre end en kraftigere skygge.
At animere box-shadow uden hak
At ændre box-shadow ved hover tvinger browseren til at tegne skyggen forfra i hver frame af overgangen. På én knap er det fint. På et grid med halvtreds kort hakker det. Den almindelige løsning er at lægge den større skygge på et pseudoelement og tone dets opacitet, som browseren kan sammensætte billigt.
.card {
position: relative;
box-shadow: var(--shadow-sm);
}
.card::after {
content: "";
position: absolute;
inset: 0;
border-radius: inherit;
box-shadow: var(--shadow-lg);
opacity: 0;
transition: opacity 200ms ease-out;
pointer-events: none;
}
.card:hover::after { opacity: 1; }
@media (prefers-reduced-motion: reduce) {
.card::after { transition: none; }
}Mere om, hvad der koster maletid, står i CSS gradient-ydeevne, og den samme lagdelte tilgang passer til knapper i gradientknapper i CSS.
Hvornår du skal springe skyggen over
Skygger adskiller en overflade fra det, der er bag den. Er baggrunden en rig gradient eller et fotografi, kæmper en stærk skygge imod den. Ofte gør en roligere baggrund mere for kortet, end nogen skygge kan. Marks fra Gradiently er bygget til det: hver er en levende baggrund med sine egne farver, sit eget lys og korn, og de ord, du lægger over den, forbliver læselige, fordi Marken beroliger sig selv bag dem, uden bokse eller skygger, der gør arbejdet.
Spørgsmål, folk stiller
Hvad er værdierne i CSS box-shadow?
Et valgfrit inset, en vandret forskydning, en lodret forskydning, en sløringsradius, en spredningsradius og en farve, for eksempel 0 4px 12px 0 rgb(0 0 0 / 0.15).
Hvordan laver jeg en blød box shadow i CSS?
Læg tre til fem skygger i lag, med dobbelt forskydning og sløring hver gang, ved 5 til 10 procent opacitet hver. Tone dem mod baggrundsfarven.
Hvordan tilføjer jeg mere end én box shadow?
Adskil dem med kommaer i én box-shadow-deklaration. Den første skygge på listen tegnes øverst.
Hvad gør spredning i box-shadow?
Den gør skyggen større eller mindre, før den sløres. En negativ spredning forhindrer en stor sløring i at vise sig i boksens sider.
Er det dårligt for ydeevnen at animere box-shadow?
Det tegner forfra i hver frame. Læg hover-skyggen på et pseudoelement, og lav overgang på dets opacitet i stedet.
Skrevet af Gradiently
Holdet bag Gradiently, et designværktøj bygget om Marks: levende gradienter, der får alt, du designer, til at ligne dig.
Se vores profil