li::marker { color: red; } 没效果是因为三个前提之一不满足:父级设了 list-style: none、li 的 display 不是 list-item,或浏览器不支持(如 Safari 15.3 及更早);目前仅 color 稳定支持,其他属性风险高且不报错。

能用,但只在较新浏览器中生效,且仅限 color 等极少数属性;写对了没反应,大概率是浏览器不支持、display 不是 list-item,或父级写了 list-style: none。
为什么 li::marker { color: red; } 没效果
不是语法错,而是三个前提崩了一个:
-
ul或li上写了list-style: none→ 它会彻底关闭::marker的渲染通道,得改成list-style-type: disc或保留默认 -
li的计算display值不是list-item→ 比如父容器是display: flex、CSS-in-JS 覆盖了样式、或手动设了display: block - 浏览器不支持 → Safari 15.3 及更早、Firefox 67 及更早、Chrome 85 及更早全部忽略整条规则;iOS 16 / 微信 X5 内核也基本不认
color 是唯一真正稳的属性,其他都带风险
::marker 不是普通伪元素,规范强制限制可用属性。目前真正稳定生效的只有:
-
color(必支持,最稳) -
font-size(Chrome 100+/Firefox 98+ 稳定,Safari 16.4+ 有限支持) -
font简写(如font: bold 1.2em sans-serif),但单独写font-family会失效
以下写法一律无效,且浏览器不报错、不警告、也不渲染:
立即学习“前端免费学习笔记(深入)”;
-
background、border、padding、margin -
line-height、vertical-align、display -
text-align(仅对多字符content+list-style-position: inside有效)
想兼容老环境?别硬刚 ::marker
只要目标环境包含 iOS Safari 15.3、Chrome 80 或 Android WebView 旧版本,::marker 就不能当唯一方案:
- 先用
@supports (::marker) { }包裹现代样式,避免污染老环境 - 降级写法:
ul { list-style: none; padding-left: 0; }+li::before { content: "• "; color: #dc2626; margin-inline-start: 0.5em; } -
li::before方案里,margin-inline-start或padding-inline-start才是调间距的正解,::marker的margin和padding全部无效
最容易被忽略的一点:即使 color 生效了,符号和文字之间的物理间距仍是 UA 样式硬编码的,::marker 和 list-style-position 都动不了它——必须靠 text-indent、padding-left 或 li::before 的定位来间接控制。


















