CSS Box Shadow Generator
Create realistic, multi-layered CSS box shadows with smooth natural diffusion. Preview in real-time on light and dark canvases, then export clean CSS or Tailwind classes.
Shadow Layers
Live Preview
box-shadow: ...;
shadow-[...]
Why Multi-Layer Box Shadows Look More Realistic
In physical lighting, light cast from a room or outdoor sky does not produce a harsh single-edge shadow. Instead, light scatters across the environment, casting a dark, sharp contact shadow near the base, surrounded by an expansive, soft ambient penumbra.
Single-layer CSS shadows (e.g. box-shadow: 0 10px 20px rgba(0,0,0,0.2)) look muddy and artificial. Modern design systems pioneered by Stripe, Apple, and Tailwind achieve photorealistic depth by layering 2 to 4 subtle shadows with decreasing opacity and increasing blur radii.
CSS Box Shadow Anatomy & Parameters
| Property Value | Meaning | Recommended Values & Rules |
|---|---|---|
offset-x |
Horizontal position | Usually set to 0px unless simulating directional sunlight coming from the left or right. |
offset-y |
Vertical position | Positive values push shadow downward (simulating overhead indoor or sky light). e.g. 2px to 25px. |
blur-radius |
Edge softness | Higher values create smoother, more diffused shadows. Standard contact blur is 2px-4px; ambient blur is 15px-40px. |
spread-radius |
Shadow expansion / shrinkage | Negative spread values (e.g. -2px or -5px) tuck the shadow neatly behind cards without spilling horizontally. |
color (rgba) |
Shadow tint & alpha | Always use low alpha transparencies (0.04 to 0.15). Never use solid black #000000. |
inset |
Inner shadow toggle | Pushes the shadow inside the container frame to create depressed buttons, input fields, or cutouts. |
Frequently Asked Questions (FAQ)
box-shadow rule. The browser renders the first listed shadow on top, and subsequent layers underneath it. For example:box-shadow: 0 1px 3px rgba(0,0,0,0.1), 0 10px 20px rgba(0,0,0,0.06);
shadow-[0_10px_20px_rgba(0,0,0,0.1)]. Note that in Tailwind class names, whitespace between shadow parameters must be replaced with underscores (_) so the utility parser does not break the class name.
box-shadow directly during transitions; instead, animate opacity on a pseudo-element (::after) that holds the elevated shadow.