-webkit-text-stroke 实现空心文字需配合 color: transparent,否则文字加粗或消失;须双写带前缀与无前缀版本,Firefox 不支持,Safari ≤16.3 仅认前缀版,中文字体建议描边≤1.5px。

-webkit-text-stroke 是实现空心文字最直接的方案,但它不是“设了就出效果”的属性——必须配合 color: transparent,且浏览器支持极不均衡。只写这一条,Firefox 用户看到的是空白,旧版 Safari 可能直接忽略,小字号中文还容易糊边。
为什么 -webkit-text-stroke 单独用文字会消失
-webkit-text-stroke 只控制描边,不碰填充色;它本身不会让文字“镂空”,只是画一条轮廓线。如果没设 color,浏览器按默认色(通常是黑色)渲染文字,描边叠在上面,结果是实心加粗字。如果设了 color: transparent 但没配描边,文字就真没了——因为填充透明 + 没描边 = 无任何可见像素。
- 常见错误:只写
-webkit-text-stroke: 2px #000,没写color: transparent→ 看起来像加粗黑字,不是空心 - 另一个常见错误:写了
color: transparent,但漏掉-webkit-text-stroke→ 文字完全不可见,检查 computed styles 会发现 color 是 transparent,但 stroke 值为空 - 别用
opacity: 0替代color: transparent——那会让整个元素(包括描边)都不可见
怎么写才真正生效且少踩坑
必须双写前缀与无前缀版本,并强制设透明填充:
-
color: transparent是硬性前提,不能省略 - 先写
-webkit-text-stroke: 1.5px #fff,再写text-stroke: 1.5px #fff——仅写后者在 Safari ≤16.3 中无效,仅写前者在 Firefox ≥119+ 中可能失效 - 描边宽度和颜色必须同时指定,缺一不可:
-webkit-text-stroke: 1.5px或-webkit-text-stroke: #000都会被整条丢弃 - 中文字体建议 ≤1.5px 描边,且搭配
font-weight: 700提升笔画清晰度;英文/数字可放宽到 2px
Firefox 和老 Safari 看不到空心字怎么办
这不是 bug,是现实:Firefox 所有版本都不支持 -webkit-text-stroke 渲染,Safari ≤16.3 不识别无前缀版,微信 X5 内核、IE 更是完全无视。指望 @supports (-webkit-text-stroke: 1px black) 做检测也不行——Firefox 会假阳性匹配(声明存在但不执行)。
- 最轻量 fallback:
color: #333; text-shadow: 0 0 1px #000, 0 0 2px #000,至少保证可读 - 更可靠降级:用 8 方向
text-shadow模拟描边,例如text-shadow: 1px 0 0 #000, -1px 0 0 #000, 0 1px 0 #000, 0 -1px 0 #000, 1px 1px 0 #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000 - 高保真方案:改用 SVG
<text>+stroke属性,完全可控,且跨浏览器 - 别用伪元素双层叠加法做生产环境首选用——它破坏可访问性(screen reader 可能读两遍),且
content: attr(data-text)在某些 SSR 场景下会丢失内容
描边和 text-shadow 混用时图层顺序很关键
-webkit-text-stroke 的绘制层级在 color 之上、text-shadow 之下。这意味着:如果你设了 color: transparent、-webkit-text-stroke: 2px white、text-shadow: 0 0 4px rgba(255,255,255,0.5),阴影会盖在描边外面,形成“发光描边”;但若想让描边包住阴影,这种组合根本做不到。
立即学习“前端免费学习笔记(深入)”;
- 想模拟外发光效果,不要依赖描边本身——它不支持 blur,只能靠多层
text-shadow - 混用时避免
text-shadow的模糊值(第三个参数)大于 0,否则描边边缘会被柔化,失去锐利感 - 描边宽度 >2px 时,
text-shadow容易被裁切或视觉错位,建议此时放弃混合,单用描边或单用阴影
-webkit-text-stroke。这些细节不调试到真实设备上,光看开发工具预览根本发现不了。


















