阴影
box-shadow、text-shadow
1. box-shadow
box-shadow: offset-x offset-y blur-radius spread-radius color inset;
.box {
box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.3);
}
.box {
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2);
}
.box {
box-shadow:
0 1px 2px rgba(0, 0, 0, 0.07),
0 2px 4px rgba(0, 0, 0, 0.07),
0 4px 8px rgba(0, 0, 0, 0.07);
}
2. text-shadow
.text {
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
}
.neon {
text-shadow:
0 0 7px #fff,
0 0 42px #0fa,
0 0 82px #0fa;
}
3. 实战效果
.card {
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);
transition: box-shadow 0.3s;
}
.card:hover {
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15);
}
.elevation-1 {
box-shadow:
0 1px 3px rgba(0, 0, 0, 0.12),
0 1px 2px rgba(0, 0, 0, 0.24);
}
.elevation-2 {
box-shadow:
0 3px 6px rgba(0, 0, 0, 0.16),
0 3px 6px rgba(0, 0, 0, 0.23);
}
4. drop-shadow 滤镜
.icon {
filter: drop-shadow(2px 4px 6px rgba(0, 0, 0, 0.3));
}
box-shadow 沿盒子形状,drop-shadow 沿元素实际轮廓(适合 PNG 图标)。
box-shadow 盒阴影
基本写法:外阴影
box-shadow: <水平偏移> <垂直偏移> <模糊> <颜色>;
/* 设置外阴影 */
.box {
box-shadow: 2px 4px 8px rgba(0, 0, 0, 0.2);
}
基本写法:带扩展的外阴影
box-shadow: <水平> <垂直> <模糊> <扩展> <颜色>;
/* 设置带扩展的外阴影 */
.box {
box-shadow: 2px 4px 8px 2px rgba(0, 0, 0, 0.2);
}
基本写法:内阴影
box-shadow: inset <水平> <垂直> <模糊> <颜色>;
/* 设置内阴影 */
.box {
box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.5);
}
基本写法:无阴影
box-shadow: none;
/* 移除阴影 */
.box {
box-shadow: none;
}
单行写法:多重阴影
box-shadow: <阴影1>, <阴影2>;
/* 单行设置多重阴影 */
.box {
box-shadow: 0 2px 4px rgba(0,0,0,0.2), 0 4px 8px rgba(0,0,0,0.1);
}
换行写法:多重阴影
box-shadow: <阴影1>, <阴影2>, <阴影3>;
/* 换行设置多重阴影 */
.box {
box-shadow:
0 1px 2px rgba(0, 0, 0, 0.1),
0 4px 8px rgba(0, 0, 0, 0.1),
0 16px 32px rgba(0, 0, 0, 0.1);
}
常见阴影效果
基本写法:柔和阴影
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
/* 柔和的卡片阴影 */
.card {
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
基本写法:深阴影
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
/* 较深的阴影 */
.modal {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
基本写法:底部阴影
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
/* 仅底部阴影 */
.header {
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
基本写法:四周阴影
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
/* 四周均匀阴影 */
.box {
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
基本写法:彩色阴影
box-shadow: 0 4px 12px rgba(0, 123, 255, 0.3);
/* 彩色阴影效果 */
.button {
box-shadow: 0 4px 12px rgba(0, 123, 255, 0.3);
}
材料设计阴影
基本写法:Material 阴影 1 级
box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);
/* Material Design 1 级阴影 */
.z1 {
box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);
}
基本写法:Material 阴影 2 级
box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23);
/* Material Design 2 级阴影 */
.z2 {
box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23);
}
基本写法:Material 阴影 3 级
box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23);
/* Material Design 3 级阴影 */
.z3 {
box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23);
}
基本写法:Material 阴影 4 级
box-shadow: 0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22);
/* Material Design 4 级阴影 */
.z4 {
box-shadow: 0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22);
}
基本写法:Material 阴影 5 级
box-shadow: 0 19px 38px rgba(0,0,0,0.30), 0 15px 12px rgba(0,0,0,0.22);
/* Material Design 5 级阴影 */
.z5 {
box-shadow: 0 19px 38px rgba(0,0,0,0.30), 0 15px 12px rgba(0,0,0,0.22);
}
text-shadow 文字阴影
基本写法:文字阴影
text-shadow: <水平> <垂直> <模糊> <颜色>;
/* 设置文字阴影 */
.title {
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
}
基本写法:文字发光
text-shadow: 0 0 10px <颜色>;
/* 文字发光效果 */
.glow {
text-shadow: 0 0 10px rgba(0, 123, 255, 0.8);
}
基本写法:文字描边
text-shadow: <方向1> <颜色>, <方向2> <颜色>, <方向3> <颜色>, <方向4> <颜色>;
/* 文字描边效果 */
.outline {
text-shadow:
-1px -1px 0 #000,
1px -1px 0 #000,
-1px 1px 0 #000,
1px 1px 0 #000;
}
单行写法:多重文字阴影
text-shadow: <阴影1>, <阴影2>;
/* 单行设置多重文字阴影 */
.text {
text-shadow: 1px 1px 2px black, 0 0 10px blue;
}
换行写法:多重文字阴影
text-shadow: <阴影1>, <阴影2>, <阴影3>;
/* 换行设置多重文字阴影 */
.text {
text-shadow:
1px 1px 2px black,
0 0 10px blue,
0 0 20px darkblue;
}
drop-shadow 滤镜阴影
基本写法:drop-shadow 滤镜
filter: drop-shadow(<水平> <垂直> <模糊> <颜色>);
/* 使用滤镜创建阴影(跟随形状) */
.image {
filter: drop-shadow(2px 4px 8px rgba(0, 0, 0, 0.3));
}
基本写法:PNG 阴影
filter: drop-shadow(<水平> <垂直> <模糊> <颜色>);
/* 为透明 PNG 创建跟随形状的阴影 */
.logo {
filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.3));
}
阴影动画
基本写法:阴影过渡
transition: box-shadow <时长>;
/* 阴影过渡动画 */
.card {
transition: box-shadow 0.3s;
}
.card:hover {
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
}
基本写法:阴影悬停效果
<选择器>:hover { box-shadow: <阴影>; }
/* 悬停时增强阴影 */
.button {
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
transition: box-shadow 0.3s;
}
.button:hover {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
}
基本写法:阴影按下效果
<选择器>:active { box-shadow: <阴影>; }
/* 按下时减弱阴影 */
.button:active {
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
}
阴影变量
基本写法:定义阴影变量
:root { --shadow-<名>: <阴影值>; }
/* 定义阴影变量 */
:root {
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);
--shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
}
基本写法:使用阴影变量
box-shadow: var(--shadow-<名>);
/* 使用阴影变量 */
.card {
box-shadow: var(--shadow-md);
}
响应式阴影
基本写法:clamp 响应式阴影
box-shadow: 0 clamp(<最小>, <理想>, <最大>) <模糊> <颜色>;
/* 响应式阴影 */
.box {
box-shadow: 0 clamp(2px, 1vw, 8px) 12px rgba(0, 0, 0, 0.1);
}
基本写法:媒体查询调整阴影
@media (max-width: <值>) { box-shadow: <值>; }
/* 小屏幕调整阴影 */
.card {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
@media (max-width: 768px) {
.card {
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
}
}
内阴影效果
基本写法:内凹效果
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.1);
/* 创建内凹效果 */
.inset {
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.1);
}
基本写法:内凸效果
box-shadow: inset 0 -2px 4px rgba(0, 0, 0, 0.1);
/* 创建内凸效果 */
.outset {
box-shadow: inset 0 -2px 4px rgba(0, 0, 0, 0.1);
}
基本写法:浮雕效果
box-shadow: inset 1px 1px 2px rgba(255,255,255,0.5), inset -1px -1px 2px rgba(0,0,0,0.1);
/* 创建浮雕效果 */
.embossed {
box-shadow:
inset 1px 1px 2px rgba(255,255,255,0.5),
inset -1px -1px 2px rgba(0,0,0,0.1);
}
长阴影
单行写法:长阴影
box-shadow: <偏移1> <颜色>, <偏移2> <颜色>, <偏移3> <颜色>;
/* 单行长阴影效果 */
.long-shadow {
box-shadow: 1px 1px rgba(0,0,0,0.1), 2px 2px rgba(0,0,0,0.1), 3px 3px rgba(0,0,0,0.1);
}
换行写法:长阴影
box-shadow: <偏移1> <颜色>, <偏移2> <颜色>, <偏移3> <颜色>;
/* 换行长阴影效果 */
.long-shadow {
box-shadow:
1px 1px rgba(0,0,0,0.1),
2px 2px rgba(0,0,0,0.1),
3px 3px rgba(0,0,0,0.1),
4px 4px rgba(0,0,0,0.1),
5px 5px rgba(0,0,0,0.1);
}
霓虹阴影
基本写法:霓虹发光
box-shadow: 0 0 <模糊> <颜色>, 0 0 <模糊2> <颜色>;
/* 霓虹发光效果 */
.neon {
box-shadow: 0 0 5px #007bff, 0 0 10px #007bff;
}
基本写法:彩色霓虹
box-shadow: 0 0 <模糊> <颜色1>, 0 0 <模糊2> <颜色2>;
/* 多色霓虹效果 */
.neon-multi {
box-shadow:
0 0 5px #ff00ff,
0 0 10px #00ffff;
}
本章综合挑战(选做)
- 用 CSS 变量定义
--shadow-sm/md/lg三层阴影体系; - 做一张 hover 时“抬起”的卡片(阴影变大 + transition);
- 给 PNG 图标加
drop-shadow,对比box-shadow的差异; - 用
inset做按钮按下态。
核心知识点
一句话记住阴影:
box-shadow六参数(偏移/模糊/扩散/颜色/inset),多层逗号分隔;text-shadow管文字,drop-shadow跟形状。
box-shadow: offset-x offset-y blur spread color [inset];- 多层阴影逗号分隔,第一层在最上;
inset内阴影适合按压/凹陷效果;text-shadow作用于文字,可做发光;drop-shadow(filter)跟随元素形状;- 阴影建议用变量统一管理,深色模式单独适配。
注意事项与改进建议
| 问题点 | 说明 | 改进方案 |
|---|---|---|
| 阴影过重 | 页面显脏 | 用低透明度(0.08-0.16)小模糊 |
| 阴影不随主题 | 深色模式下刺眼 | 阴影颜色用变量并适配深色 |
| 大量元素阴影 | 绘制开销大 | 减少模糊半径与数量 |
| 用 box-shadow 做图标阴影 | 出现方框 | 用 drop-shadow |
| 忘记 transition | 阴影突变 | hover 变化加过渡 |
扩展学习
- 滤镜体系:
css/310-CSSFilters; - 背景:
css/290-BackgroundEnhancement; - 动画:
css/330-CSSAnimationTransition; - 设计令牌:
css/410-CSSVariableCustomAttribute。