:lang伪类生效需html根元素显式声明非空lang属性,如lang="zh-hans";匹配遵循bcp 47标准,支持子字符串匹配(:lang(zh)可匹配zh-hans),但不识别下划线格式(如zh_cn);字体设置应将西文字体置于cjk字体之后并保留sans-serif兜底。

lang伪类怎么写才生效
必须确保HTML根元素有正确的lang属性,否则:lang()完全不触发。浏览器只认或这类显式声明,不会自动推断页面语言。
- 错误写法:
(没lang)或(空值无效) - 正确写法:
、、 - 注意大小写:
zh-hans和zh-Hans都合法,但zh_CN(下划线)不被识别
:lang()选择器的匹配逻辑很严格
它不是模糊匹配,而是按BCP 47标准做子字符串比对——:lang(zh)能匹配lang="zh"、lang="zh-Hans"、lang="zh-CN",但:lang(zh-Hans)不会匹配lang="zh"。
- 常用写法:
:lang(zh) { font-family: "PingFang SC", "Hiragino Sans GB"; } - 慎用精确匹配:
:lang(en-US)只匹配lang="en-US",不匹配lang="en"或lang="en-GB" -
多语言叠加时,优先用宽泛语言码:
:lang(zh), :lang(ja), :lang(ko)比逐个写zh-Hans/zh-Hant更可靠
字体声明里中英文要分开控制
单靠:lang()设font-family不够,因为中日韩文字需要不同的字体栈,而拉丁字母部分往往要保留系统默认英文字体。直接写font-family: "Noto Sans CJK SC", sans-serif会导致英文也走CJK字体,字形发虚。
- 正确思路:用
:lang()只切换中日韩部分字体,英文部分交给font-family里的fallback链自然处理 - 示例:
:lang(zh), :lang(ja), :lang(ko) { font-family: "SF Pro SC", "Noto Sans CJK JP", "Helvetica Neue", sans-serif; } - 关键点:
"Helvetica Neue"这类西文字体必须放在CJK字体之后,否则会被覆盖;且不能省略sans-serif兜底
遇到lang不生效?先查这三件事
90%的“:lang()没反应”问题出在基础配置上,而不是CSS写法本身。
- 检查
标签是否真有lang属性,且值非空、无拼写错误(比如zho或ch都不行) - 确认CSS没有被更高优先级规则覆盖(比如
body * { font-family: ... }会干掉:lang()) - 动态改
lang属性时,CSS不会自动重算——改完要手动触发重排,或用document.documentElement.lang = "en"后加document.body.offsetHeight强制刷新
实际项目里最容易漏的是HTML层的lang声明,而不是CSS怎么写。一旦根节点语言没标对,后面所有:lang()都是摆设。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











