HTML允许在<li>内直接嵌套<ul>,必须完整置于<li>起止标签之间;嵌套层级过深需用CSS控制缩进;<ol>的start属性不继承,子列表需手动设置;废弃type属性,应使用CSS的list-style-type和::marker自定义符号。

在 <li> 里直接放 <ul> 就行
HTML 允许在任意 <li> 内部嵌套其他块级元素,包括 <ul>、<ol>、<p>,只要结构合法。关键不是“能不能嵌”,而是“嵌在哪”和“怎么闭合”。常见错误是把 <ul> 写在 <li> 外面,或漏掉 </li> 导致浏览器自动修正、渲染错乱。
正确做法:把整个无序列表(含 <ul> 开始和结束标签)完整写进某个 <li> 的起始与闭合之间。
- 嵌套必须发生在
<li>内部,不能跨项或悬空 -
<ul>和<ol>都支持互相嵌套,没有类型限制 - 嵌套层级过深时(比如 >3 层),CSS 缩进容易混乱,建议用类名控制
margin-left或padding-left而非依赖默认缩进
start 属性对嵌套里的 <ol> 无效
如果你在外层用 <ol start="3">,里面嵌了个 <ol>,那个内层 <ol> 依然从 1 开始编号——start 不继承、不传递。每个 <ol> 是独立计数的。
想让子有序列表接续父编号,只能手动设 start,比如父项是第 4 条,子列表第一项想标为 “4.1”,就得写 <ol start="1"> 并配合 CSS 伪元素或 JS 生成前缀,原生 HTML 不支持自动续编。
立即学习“前端免费学习笔记(深入)”;
符号样式要用 CSS,别信 type 属性
<ul type="square"> 这种写法虽然还能用,但属于废弃属性(HTML5 中已不推荐),现代浏览器兼容性差,且无法控制颜色、大小、间距。真正可控的方式是用 CSS:
ul.my-list {
list-style-type: square;
}
ul.my-list li::marker {
color: #333;
}
-
type只支持disc/circle/square,连短横线none都要靠list-style: none - 嵌套列表中,不同层级想用不同符号(比如外圆点、内方块),必须加类名或用
ul ul、ul ul ul这样的后代选择器 - 用
list-style: none+::before自定义符号更灵活,也避免 IE8 以下的老问题
嵌套后缩进不对?先检查是否用了 <div> 包裹 <ul>
有人习惯在 <li> 里加个 <div> 再放 <ul>,比如:
<li><div><ul><li>子项</li></ul></div></li>
这会导致语义断裂、缩进异常,甚至被某些校验工具报错。HTML 规范明确要求 <ul> 应直接作为 <li> 的子元素,中间不该插入非列表容器。
正确写法就一行到底:
<li>主项内容<ul><li>子项1</li><li>子项2</li></ul></li>
如果需要额外布局控制,给 <li> 加 class,用 CSS 处理,别用 <div> 隔开结构。



















