一、阴影的基本概念与作用

CSS 阴影是一种视觉效果技术,用于增强页面元素的层次感、深度感和立体感,使界面更加生动和专业。它可以应用于文本、盒子元素以及不规则形状,帮助设计师实现丰富的视觉设计效果。

二、主要阴影类型详解

2.1 盒子阴影(box-shadow)

box-shadow 属性用于为元素添加阴影效果,可以是外阴影或内阴影,是最常用的阴影类型。

语法

box-shadow: [inset] <offset-x> <offset-y> [<blur-radius>] [<spread-radius>] <color>;

参数说明

  • inset:可选关键字,将外阴影改为内阴影。

  • offset-x:必填,水平阴影偏移量(正值向右,负值向左)。

  • offset-y:必填,垂直阴影偏移量(正值向下,负值向上)。

  • blur-radius:可选,模糊半径(值越大,阴影越模糊)。

  • spread-radius:可选,阴影扩散半径(正值扩大阴影,负值缩小阴影)。

  • color:可选,阴影颜色(默认与文本颜色相同)。

关键特性

  • 支持内外阴影(通过 inset 关键字)。

  • 支持阴影扩散(通过 spread-radius 参数)。

  • 基于元素的盒子模型,不考虑元素的透明度或不规则形状。

  • 可以叠加多个阴影效果,用逗号分隔。

影响 box-shadow 的属性

  • border-radius:阴影会跟随元素的圆角效果。

  • transform:阴影会跟随元素的变换效果。

  • opacity:不影响阴影的可见性(阴影是元素的一部分)。

  • 当设置了 box-shadow 的元素被包裹在 overflow:hidden 的容器内时,其阴影部分将被裁剪,无法超出容器边界,导致阴影效果不完整。

CSS box-shadow 语法快速记忆指南

将 offset-x 和 offset-y 想象成为坐标:

  • 坐标原点:元素盒子的左上角(与 CSS 中大多数定位系统一致)。

  • x 轴方向:水平方向,向右为正(offset-x 正值),向左为负(offset-x 负值)。

  • y 轴方向:垂直方向,向下为正(offset-y 正值),向上为负(offset-y 负值)。

这种类比直观地解释了阴影的偏移方向,例如 box-shadow: 5px 3px ... 表示阴影向右偏移 5px,向下偏移 3px。

视觉化记忆法

将语法结构想象成一个"阴影生成器"的配置流程:

  • 选择阴影类型:是内阴影(inset)还是外阴影(默认)?

  • 设定阴影位置:在坐标系统中确定位置(x, y)。

  • 调整阴影形状:模糊程度(blur)和大小(spread)。

  • 设置阴影颜色:选择合适的颜色。

示例

基本外阴影:

/* 基本外阴影 */
.box {
  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
}

内阴影:

/* 内阴影 */
.box-inset {
  box-shadow: inset 2px 2px 4px rgba(0, 0, 0, 0.3);
}

多个阴影叠加

/* 多个阴影叠加 */
.box-multi {
  box-shadow: 
    0 2px 4px rgba(0, 0, 0, 0.1),
    0 6px 20px rgba(0, 0, 0, 0.05);
}

阴影被隐藏

.my-parent,
.my-shadow {
  width: 250px;
  height: 250px;
}

.my-shadow {
  box-shadow: 0px 0px 20px 5px darkslateblue;
}

.my-parent {
  overflow: hidden;
}

<div class="my-parent">
  <div class="my-shadow">My shadow is hidden by my parent.</div>
</div>

2.2 文字阴影(text-shadow)

text-shadow 属性用于为文本添加阴影效果,增强文本的可读性或视觉吸引力。

语法

text-shadow: <offset-x> <offset-y> [<blur-radius>] <color>;

参数说明

  • offset-x:必填,水平阴影偏移量(正值向右,负值向左)。

  • offset-y:必填,垂直阴影偏移量(正值向下,负值向上)。

  • blur-radius:可选,模糊半径(值越大,阴影越模糊)。

  • color:可选,阴影颜色(默认与文本颜色相同)。

关键特性

  • 仅应用于文本内容,不影响元素的其他部分。

  • 支持叠加多个阴影效果。

  • 不支持内阴影和阴影扩散。

  • 添加 box-shadow 时,阴影会随容器形状被裁剪,而 text-shadow 则不会被裁剪。因此,当文本为完全透明或半透明时,阴影仍会透过文字显现出来。

示例

基本文本阴影

/* 基本文本阴影 */
.text {
  text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
}

多重文本阴影

.text-multi {
  text-shadow: 
    2px 2px 0px #ff0000,
    4px 4px 0px #00ff00,
    6px 6px 0px #0000ff;
}

透明度文本阴影

.my-element {
  text-shadow: 3px 3px 3px gold;
  color: rgb(0 0 0 / 20%);
}

.my-element {
  font-size: 5em;
  font-weight: 900;
  line-height: 1.1;
  max-width: 40ch;
}

<h1 class="my-element">
  This text is semi-transparent, so the shadow can be seen through it
</h1>

2.3 滤镜阴影(filter: drop-shadow())

filter: drop-shadow() 是 CSS 滤镜属性的一部分,用于为元素及其内容添加阴影效果,特别适用于不规则形状或半透明元素。

语法

filter: drop-shadow(<offset-x> <offset-y> [<blur-radius>] <color>);

参数说明

  • offset-x:必填,水平阴影偏移量(正值向右,负值向左)。

  • offset-y:必填,垂直阴影偏移量(正值向下,负值向上)。

  • blur-radius:可选,模糊半径(值越大,阴影越模糊)。

  • color:可选,阴影颜色(默认与文本颜色相同)。

关键特性

  • 考虑元素的透明度,只对不透明部分添加阴影。

  • 跟随元素的实际形状(包括圆角、SVG 路径、clip-path 等)。

  • 不支持内阴影和阴影扩散。

  • 性能消耗相对较高(因为需要计算滤镜效果)。

典型应用场景

  • 为动态加载的图片添加阴影(如电商网站的商品图片)。

  • 为不规则形状元素(如多边形、图标)添加阴影。

  • 为半透明元素添加阴影。

示例

不规则形状阴影

/* 不规则形状阴影 */
.irregular-shape {
  clip-path: polygon(0 0, 100% 0, 80% 100%, 20% 100%);
  filter: drop-shadow(2px 2px 4px rgba(0, 0, 0, 0.3));
}

图片阴影

/* 图片阴影 */
.product-image {
  filter: drop-shadow(3px 3px 5px rgba(0, 0, 0, 0.2));
}

三、三种阴影的区别与比较

特性

text-shadow

box-shadow

filter: drop-shadow()

适用对象

文本内容

元素盒子模型

元素及其内容

内阴影支持

不支持

支持(inset)

不支持

扩散半径

不支持

支持

不支持

透明度处理

仅文本

基于盒子模型

考虑元素透明度

形状跟随

仅文本形状

仅盒子模型形状

跟随元素实际形状

性能

相对较低(滤镜计算)

浏览器支持

广泛(IE9+)

广泛(IE10+)

良好(IE 不支持)

可访问 Can I Use 官网 查询更详细的兼容性信息。

四、实际应用技巧

4.1 示例:分层阴影效果

通过叠加多个阴影,可以创建更复杂的深度感:

.card {
  box-shadow: 
    0 1px 3px rgba(0, 0, 0, 0.12),
    0 1px 2px rgba(0, 0, 0, 0.24),
    0 4px 8px rgba(0, 0, 0, 0.08);
}
4.2 示例:悬停增强效果

结合过渡效果,在悬停时增强阴影,提升交互体验:

.button {
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  transition: box-shadow 0.3s ease;
}

.button:hover {
  box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
}
4.3 示例:玻璃态效果(Glassmorphism)

结合背景模糊和阴影,实现现代的玻璃态效果:

.glass {
  background: rgba(255, 255, 255, 0.25);
  backdrop-filter: blur(10px);
  box-shadow: 0 8px 32px rgba(31, 38, 135, 0.37);
  border: 1px solid rgba(255, 255, 255, 0.18);
}
4.4 示例:文本可读性增强

在浅色背景上使用深色文本阴影,或在深色背景上使用浅色文本阴影,增强文本可读性:

/* 浅色背景上的文本 */
.light-bg-text {
  color: #333;
  text-shadow: 1px 1px 0px rgba(255, 255, 255, 0.5);
}

/* 深色背景上的文本 */
.dark-bg-text {
  color: #fff;
  text-shadow: 1px 1px 0px rgba(0, 0, 0, 0.5);
}
4.5 示例:卡片组件

结合过渡效果,在悬停时增强阴影,提升交互体验:

.card {
  background: white;
  border-radius: 8px;
  padding: 20px;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
  transition: box-shadow 0.3s ease;
}

.card:hover {
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
}
4.6 示例:动态图片阴影

为动态加载的图片添加阴影,提升视觉体验:

.product-image {
  max-width: 100%;
  height: auto;
  filter: drop-shadow(4px 4px 6px rgba(0, 0, 0, 0.15));
}

总结

CSS 阴影是创建视觉层次感和深度的强大工具,通过合理使用 box-shadow、text-shadow 和 filter: drop-shadow() ,可以实现各种精美的视觉效果。理解它们的区别和适用场景,将帮助你在实际项目中做出最佳选择,创造出既美观又高性能的用户界面:

  • 对于标准盒子元素,优先使用 box-shadow。

  • 对于文本内容,使用 text-shadow。

  • 对于不规则形状或透明元素,使用 filter: drop-shadow()。

彩蛋

本文于 Cnb 平台完整呈现了 CSS Shadow 属性的示例代码,欢迎前往阅读《CSS Shadow 属性详解完整示例》以获取详尽内容。