CSS Box Shadow Bottom Only
Categories:
Mastering CSS Box Shadow for Bottom-Only Effects

Learn how to create a clean, bottom-only box shadow effect in CSS, perfect for subtle underlines or emphasizing elements without full-box shadows.
Applying a box-shadow
in CSS is a common way to add depth and visual separation to elements. However, the default behavior casts a shadow around all sides of the box. Often, designers and developers need a more subtle effect, such as a shadow that appears only on the bottom edge, mimicking an underline or a subtle lift. This article explores various techniques to achieve a clean, bottom-only box shadow, discussing their pros and cons, and providing practical code examples.
Understanding the box-shadow
Property
Before diving into bottom-only shadows, let's quickly recap the box-shadow
property's syntax. It typically takes values for horizontal offset, vertical offset, blur radius, spread radius, and color. Understanding how these values interact is crucial for manipulating the shadow's appearance.
box-shadow: offset-x offset-y blur-radius spread-radius color;
To create a bottom-only effect, we need to strategically adjust these values to hide or minimize the shadow on the top, left, and right sides, while making it prominent on the bottom.
/* Basic box-shadow syntax */
.element {
box-shadow: 2px 2px 5px 0px rgba(0, 0, 0, 0.3);
}
A standard box-shadow
application.
Method 1: Using Negative Spread Radius
One of the most straightforward methods to achieve a bottom-only shadow is by using a negative spread-radius
. A negative spread radius shrinks the shadow, effectively pulling it inwards. By combining this with a positive vertical offset, we can make the shadow appear only at the bottom.
This method is generally well-supported and offers a clean result. The key is to find the right balance between the vertical offset and the negative spread to ensure the shadow doesn't bleed onto the sides or top.
.bottom-shadow-negative-spread {
box-shadow: 0 8px 6px -6px black; /* offset-x, offset-y, blur-radius, spread-radius, color */
}
/* Explanation:
- 0: No horizontal offset
- 8px: Positive vertical offset, pushing shadow downwards
- 6px: Blur radius for softness
- -6px: Negative spread radius, shrinking the shadow from all sides
This effectively hides the shadow from the top/sides while the vertical offset keeps it visible at the bottom.
- black: Shadow color
*/
CSS for a bottom-only shadow using a negative spread radius.
offset-y
and spread-radius
values. A larger offset-y
might require a more negative spread-radius
to keep the sides clean. The blur-radius
controls the softness of the shadow.Method 2: Using Multiple box-shadow
Layers
Another robust approach involves layering multiple box-shadow
declarations. CSS allows you to define several shadows for a single element, separated by commas. We can use this to create a very specific bottom shadow by combining a regular shadow with an inset shadow that covers the top and sides.
This method offers fine-grained control but can be slightly more complex to read and maintain due to the multiple declarations.
.bottom-shadow-multiple-layers {
box-shadow:
0 4px 6px -2px rgba(0, 0, 0, 0.2), /* Main bottom shadow */
0 0 0 0 rgba(0, 0, 0, 0.2); /* This second shadow is often used to reset or fine-tune,
but for a pure bottom shadow, the first one is key.
A common trick is to use an inset shadow to 'cut off' the top. */
}
/* A more explicit multiple shadow approach for bottom-only */
.bottom-shadow-explicit {
box-shadow:
0 8px 6px -6px rgba(0, 0, 0, 0.3), /* The visible bottom shadow */
inset 0 10px 0 -10px white; /* An inset shadow that 'cuts off' the top part.
The color should match the background of the parent/element. */
}
Achieving a bottom-only shadow with multiple box-shadow
declarations.
inset
shadow trick, ensure the inset
shadow's color matches the background color of the element or its parent. Otherwise, it will be visible and create an undesirable effect.Method 3: Using a Pseudo-element (::after
)
For ultimate control and separation of concerns, using a pseudo-element like ::after
is an excellent technique. You can position an ::after
element directly below your main content and apply a standard box-shadow
to it. This allows you to style the shadow completely independently of the main element.
This method is particularly useful when the main element has complex styling or when you need the shadow to behave differently (e.g., extend beyond the element's width).
.element-with-pseudo-shadow {
position: relative; /* Needed for absolute positioning of pseudo-element */
padding-bottom: 10px; /* Make space for the shadow */
}
.element-with-pseudo-shadow::after {
content: '';
position: absolute;
bottom: -5px; /* Adjust as needed to position the shadow */
left: 0;
right: 0;
height: 5px; /* Height of the shadow area */
box-shadow: 0 5px 5px -5px rgba(0, 0, 0, 0.4); /* Shadow applied to the pseudo-element */
z-index: -1; /* Ensure shadow is behind the content if needed */
}
Using a ::after
pseudo-element for a bottom-only shadow.
flowchart TD A[Element] --> B{Choose Shadow Method} B -- Negative Spread --> C[Simple & Direct] B -- Multiple Layers --> D[Fine-grained Control] B -- Pseudo-element --> E[Independent Styling] C --> F[Bottom Shadow Achieved] D --> F E --> F
Decision flow for choosing a bottom-only box shadow method.
left
and right
properties of the ::after
element.