text-shadow:文字阴影的基础语法
text-shadow 是 CSS2.1 时代就引入的属性(CSS3 重新纳入),用于为文字添加投影效果。与 box-shadow 不同,它只作用于文字本身的轮廓,而非元素的边界框。
text-shadow: <offset-x> <offset-y> <blur-radius>? <color>;
各参数的含义:
| 参数 | 是否必填 | 作用 | 典型值 |
|---|---|---|---|
| offset-x | 是 | 水平偏移 | -50px ~ 50px |
| offset-y | 是 | 垂直偏移 | -50px ~ 50px |
| blur-radius | 否 | 模糊半径 | 0(锐利)~ 100px |
| color | 否 | 阴影颜色 | rgba/hex/hsl |
多层阴影用逗号分隔:text-shadow: 1px 1px 0 #ccc, 2px 2px 0 #bbb;
与 box-shadow 相比,text-shadow 没有 spread-radius(扩散半径)和 inset(内阴影)参数。这是因为文字阴影需要跟随每个字符的复杂轮廓,扩散和内阴影在字符级别难以定义清晰的语义。
与 box-shadow 的核心差异
理解 text-shadow 和 box-shadow 的区别,才能在正确的场景选择正确的工具:
1. 作用对象
text-shadow:阴影跟随文字轮廓,每个字符独立投影box-shadow:阴影跟随元素的边界框(border-box),与文字无关
2. 参数差异
text-shadow:x, y, blur, color(4 个参数)box-shadow:x, y, blur, spread, color, inset(6 个参数)
3. 性能特征
text-shadow:大量文字 + 大模糊半径时,GPU 需要为每个字符的轮廓渲染模糊,性能开销可能高于box-shadowbox-shadow:作用于矩形边界框,模糊计算更简单
4. 适用场景
text-shadow:标题特效、霓虹灯文字、3D 立体字、文字描边box-shadow:卡片投影、按钮交互、Material Design elevation
霓虹灯发光效果实现
霓虹灯是 text-shadow 最经典的应用场景。核心原理是多层零偏移阴影叠加,模拟光晕由内向外渐弱:
.neon {
color: #fff;
text-shadow:
0 0 10px rgba(0, 200, 255, 0.8), /* 内层光晕:小模糊大透明度 */
0 0 20px rgba(0, 200, 255, 0.5), /* 中层光晕:中模糊中透明度 */
0 0 40px rgba(0, 150, 255, 0.3); /* 外层光晕:大模糊小透明度 */
}
关键设计要点:
- x/y 偏移为 0:阴影居中,光晕均匀包围文字
- 模糊半径递增(10→20→40):模拟光晕从内向外扩散
- 透明度递减(0.8→0.5→0.3):模拟光晕由强到弱的自然衰减
- 文字颜色为白色或与阴影同色:白色文字让光晕颜色更突出;同色文字让整体更统一
不同颜色的霓虹效果只需替换颜色值:粉色用 rgba(255, 20, 147, ...),绿色用 rgba(0, 255, 136, ...),紫色用 rgba(186, 85, 211, ...)。
3D 立体文字效果
3D 效果通过多层零模糊阴影逐像素偏移实现,模拟文字的”厚度”方向投影:
.text-3d {
color: #fff;
background: #2a2a3e;
text-shadow:
1px 1px 0 #c0c0c0,
2px 2px 0 #b0b0b0,
3px 3px 0 #a0a0a0,
4px 4px 0 #909090,
5px 5px 0 #808080;
}
关键设计要点:
- 模糊半径为 0:每层都是锐利投影,没有光晕
- x/y 偏移逐层递增(1→2→3→4→5):模拟厚度方向
- 颜色从浅到深渐变:模拟受光面(浅色)到背光面(深色)的自然过渡
- 层数决定厚度:4-6 层即可呈现明显立体感,层数越多越厚重
如果需要反向 3D(凸出效果),将偏移改为负值(-1, -1 → -2, -2)即可让”厚度”朝左上方延伸。
8 方向文字描边
CSS 没有原生的 text-stroke 属性(-webkit-text-stroke 兼容性有限),常用 text-shadow 的 8 方向零偏移阴影模拟描边:
.text-outline {
color: #fff;
text-shadow:
-1px 0 #333, 1px 0 #333, /* 左、右 */
0 -1px #333, 0 1px #333, /* 上、下 */
-1px -1px #333, 1px 1px #333, /* 左上、右下 */
-1px 1px #333, 1px -1px #333; /* 左下、右上 */
}
8 个方向覆盖了字符轮廓的所有边界,形成均匀的描边效果。描边宽度由偏移值决定(1px = 1px 描边,2px = 2px 描边)。
为什么需要 8 个方向而不是 4 个? 只有上下左右 4 个方向时,斜向边界(如字母 V 的尖端)会出现锯齿缺口。补充 4 个对角线方向后,描边才完整均匀。
浮雕与凹陷效果
浮雕和凹陷利用了人眼对光影方向的感知——光源在左上方时,凸起物体的左上边缘亮、右下边缘暗;凹陷则相反。
/* 浮雕:左上亮、右下暗 */
.embossed {
color: #e0e0e0;
background: #f0f0f0;
text-shadow:
1px 1px 0 rgba(255, 255, 255, 0.8), /* 左上白色高光 */
-1px -1px 0 rgba(0, 0, 0, 0.3); /* 右下黑色阴影 */
}
/* 凹陷:左上暗、右下亮 */
.inset-text {
color: #e0e0e0;
background: #f0f0f0;
text-shadow:
-1px -1px 0 rgba(255, 255, 255, 0.6), /* 右下白色高光 */
1px 1px 0 rgba(0, 0, 0, 0.3); /* 左上黑色阴影 */
}
浮雕效果的关键在于背景色与文字色相近(低对比度),让阴影成为唯一的层次来源。如果背景与文字对比度过高,浮雕效果会被掩盖。
多层阴影的叠加顺序
多层阴影用逗号分隔,浏览器从前到后依次绘制:
- 第一层在最上层(离文字最近)
- 最后一层在最底层(离文字最远)
对于不同效果,顺序至关重要:
| 效果 | 正确顺序 | 原因 |
|---|---|---|
| 3D | 浅色在前,深色在后 | 模拟近处亮、远处暗 |
| 霓虹 | 小模糊在前,大模糊在后 | 内层光晕覆盖外层光晕 |
| 描边 | 顺序无关 | 8 方向均匀 |
浏览器兼容性
text-shadow 是 CSS2.1 的成熟特性,兼容性极佳:
| 浏览器 | 支持版本 |
|---|---|
| Chrome | 2+ |
| Firefox | 3.5+ |
| Safari | 1.1+ |
| Edge | 12+ |
| IE | 10+(IE9 及以下不支持) |
多层阴影、负偏移、大模糊半径等特性在所有支持的浏览器中均可用。移动端 iOS Safari 与 Android Chrome 完全支持。无需添加浏览器前缀。
性能优化建议
text-shadow 在大量文字 + 大模糊半径时可能成为性能瓶颈,因为 GPU 需要为每个字符的轮廓渲染模糊。优化建议:
- 限制使用范围:只对标题、按钮等少量文字使用,避免大段正文使用
- 减少模糊半径:模糊半径越大,GPU 计算量越大。霓虹效果 3 层 40px 已是上限
- 减少层数:3D 效果 5 层已足够,更多层数收益递减
- 避免动画:对
text-shadow做动画会导致每帧重新渲染所有阴影层,性能开销大 - 使用
will-change:对需要动画的元素添加will-change: text-shadow,让浏览器提前优化
与配套工具协同
text-shadow 文字阴影生成器与 box-shadow 盒阴影生成器、CSS 渐变生成器 形成完整的 CSS 视觉效果工具链:
- box-shadow:卡片、按钮的投影效果
- text-shadow:标题、Logo 的文字特效
- gradient:背景、按钮的渐变效果
三者覆盖了前端开发中最高频的 CSS 视觉效果需求,配合 颜色值转换、调色板生成、对比度检测 等色彩工具,可完成从颜色选取到视觉效果应用的全流程。