::selection伪元素需全局独立声明且兼容写法分离,否则因浏览器忽略不支持选择器而失效;仅支持color、background-color等有限属性,禁用嵌套、user-select:none及优先级冲突。

::selection 伪元素能生效,但必须同时写 ::selection 和 ::-webkit-selection,否则 Safari 和旧版 Chrome 会直接忽略;::-moz-selection 已废弃,Firefox 只认标准写法。
为什么写了 ::selection 却没效果
最常见原因是浏览器根本没解析到规则——::selection 必须写在全局作用域,不能嵌套在 .class 或 #id 里。比如这样写就无效:
article.content ::selection { background: red; }
它会被 Safari 和旧版 Chrome 当作非法语法跳过。正确写法是独立声明:
::-webkit-selection { background-color: #4a90e2; color: white; }
::selection { background-color: #4a90e2; color: white; }
- 父容器设了
user-select: none,子元素压根无法被选中,::selection自然不会触发 - CSS 优先级冲突:如果页面某处写了更具体的选择器(如
p::selection),而你只写了全局::selection,就会被覆盖 - 没同时声明
color和background-color—— 浏览器默认重置未声明的属性,只写一个很可能文字变黑或背景透明
::selection 支持哪些 CSS 属性
它只接受极少数样式声明,其余全部被忽略。可用的有:
-
color(文字前景色) -
background-color(背景色,支持rgba(),但transparent会退回到浏览器默认色) -
text-shadow(部分浏览器支持,深色背景上慎用) -
cursor(基本不生效,别依赖) -
outline、text-decoration(仅个别浏览器支持,兼容性差)
明确不支持:font-size、padding、border、transform、opacity、CSS 变量计算(如 calc(--accent * 0.8))。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
移动端和暗色模式下的实际表现
iOS Safari 对 ::selection 的控制力很弱:
- 长按呼出菜单时,
::selection样式可能完全不触发,这是系统级限制,JS 也绕不过 - 即使生效,
color常被强制覆盖为白色,background-color是唯一较可靠可控的属性 - 暗色模式下固定色值容易对比度不足,建议用
@media (prefers-color-scheme: dark)单独覆盖
例如:
@media (prefers-color-scheme: dark) {
::-webkit-selection { background-color: #4a5568; color: #e2e8f0; }
::selection { background-color: #4a5568; color: #e2e8f0; }
}
注意:移动端不要对 input 和 textarea 写 input::selection,它们走操作系统原生高亮逻辑,CSS 无效。
哪些地方最容易被忽略
真正上线后出问题的,往往不是语法写错,而是两件事没提前验证:
- 是否在组件库或 Shadow DOM 内使用?
::selection不穿透,得在对应 scope 里重复声明 - 是否改了全局
::selection,结果把代码块(pre)、按钮文字、模态框里的文本全染成同一色?建议优先用元素限定,比如只写p::selection、h1::selection、pre::selection
最后一点:Safari 直到 v16.4 才支持多选择器写法(如 p::selection, li::selection),老版本必须拆成两条规则。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










