不能,::first-letter 伪元素不支持中文首字,因规范限定其仅匹配 lu/ll/lt 类 unicode 字符,汉字属 lo 类;主流浏览器严格遵循标准,故对中文无效,稳定方案唯有服务端或 js 注入 span 包裹首字。

不能,::first-letter 与中文排版不存在“完美兼容”——它根本不是为中文设计的,所谓“能用”只是浏览器在特定条件下偶然命中,靠不住。
为什么中文首字经常不被 ::first-letter 选中
规范明确限定:::first-letter 只匹配 Unicode 类别为 Lu(大写字母)、Ll(小写字母)、Lt(首字母大写)的字符。汉字属于 Lo(Other Letter),不在支持范围内。Chrome、Firefox、Safari 主流引擎均按此执行,不是 bug,是标准行为。
- 写
p::first-letter { text-transform: uppercase; }对中文段落完全无效 - 即使首字符是汉字,开发者工具里常显示该伪元素为 “inactive” 或 “not matched”
- 开头是标点(如《、【、“)时,部分浏览器可能吞并标点+汉字一起匹配,但行为不可控、跨浏览器不一致
::first-letter 在中文场景下唯一靠谱的生效条件
只有当 HTML 结构和渲染环境同时满足以下全部条件时,才可能“看起来生效”,但仍是脆弱的临时方案:
- 段落必须以纯汉字开头,无任何前置空格、换行、注释、
<script></script>或内联标签(如<span>今</span>天就会失效) - 父元素
display必须是block或inline-block,禁用flex/grid - 不能依赖
vertical-align或margin-top微调位置——浮动上下文中它们基本无效 - 放大后要避免截断,
line-height必须设为无单位值(如0.75),不能继承父级计算值
替代方案里真正可控的只有两种
服务端注入 <span class="first-char">今</span> 是目前最稳定的做法;前端 JS 动态提取首汉字并包裹也比赌伪元素强得多。
-
initial-letter(Chrome 117+ / Safari 16.5+)虽支持中文占多行,但不响应text-transform,且依赖字体 OpenTypecase特性——当前几乎没有中文字体提供该特性 - 别信“加个零宽空格
\u200B就能触发”的说法:这仅在极个别旧版 Firefox 下偶然有效,现代浏览器已不再识别 - 用
::before+content模拟首字?不行——它无法读取真实文本内容,只能硬编码,CMS 场景下直接报废
真正复杂的地方从来不是怎么写 CSS,而是你得判断:这个页面是否允许首字样式“偶尔失效”?如果要求 100% 稳定,::first-letter 就不该出现在中文生产环境的代码里。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











