ul 和 ol 默认 margin 和 padding 不一致,需统一重置为 margin: 0; padding: 0;;中文序号须用 counter + ::before 实现;::marker 样式受限且兼容性差;嵌套列表应统一设置 padding-left: 1.5em。
ul 和 ol 的 margin 和 padding 默认不一致
浏览器对 ul 和 ol 默认设置了不同的 margin 和 padding,尤其在 chrome/firefox 中,ul 通常有 padding-left: 40px,而 ol 可能还多出一点缩进。直接写 css 重置时容易只盯 margin 忘了 padding。
- 统一重置建议用:
ul, ol { margin: 0; padding: 0; },再按需添加内边距 - 如果保留项目符号但想微调位置,优先改
padding-inline-start(现代写法)或padding-left,别只调text-indent - 注意
list-style-position: inside会让标记进入内容流,可能影响换行和对齐,outside(默认)更可控
自定义 list-style-type 时中文序号不生效
写 list-style-type: "一、"; 或类似字符串不会生效——CSS 的 list-style-type 不支持任意字符串,只认标准关键字(如 decimal、lower-alpha)或 none。中文序号得靠其他方式实现。
- 真正可用的中文序号方案:用
counter-reset+::before伪元素手动构造,例如counter-increment: cn;配合content: counter(cn) "、"; -
list-style-type: cjk-ideographic在部分浏览器(如 Firefox)支持,但 Chrome 目前不支持,兼容性差,不推荐用于生产 - 若只是简单替换为「●」「→」等符号,用
list-style-image或::marker(Chrome 111+ / Safari 17.4+ 支持)更可靠
::marker 伪元素样式受限且兼容性要注意
::marker 看起来是专门干这事的,但它能控制的样式非常有限:只支持 color、font 相关属性、content,不能设 display、margin、padding,也不能用背景或边框。
- 想给项目符号加背景色?不行;想让它右对齐?也不行——得退回到
::before+position: absolute模拟 - Firefox 目前不支持
::marker的content(仅支持基础样式),Safari 对content的支持也较新,上线前务必查 caniuse - 用
::marker时,list-style-type必须显式设置(哪怕设成none),否则某些浏览器会忽略伪元素
嵌套列表缩进混乱,子列表项对不齐
嵌套 ul 或 ol 时,子列表常出现缩进过深、文字不对齐、符号错位等问题,根本原因是父级的 padding 会逐层累积,而浏览器没做自动归一化。
- 最稳做法:给所有嵌套层级统一设
ul ul, ol ol, ul ol, ol ul { padding-left: 1.5em; },避免依赖默认值 - 不要用
em以外的单位(比如px)设嵌套缩进,否则字体缩放时会失准 - 如果用
display: grid或flex布局替代原生列表结构,要记得手动处理焦点管理与语义(role="list"/role="listitem")











