HTML规范要求ul的直接子元素必须是li,不可直接包含文本或其他标签;嵌套列表需将ul置于li内,确保语义正确、可访问性及CSS选择器有效。

ul 标签里必须用 li 做直接子元素
HTML 规范明确要求 正确写法只有一种核心结构: 文本 想实现多级菜单或缩进结构,必须通过 立即学习“前端免费学习笔记(深入)”; 错误示例(解析后结构混乱): 正确写法(层级清晰、语义准确): 遇到列表显示异常(如编号错乱、缩进消失、点击区域不响应),大概率是嵌套结构出问题。典型表现有: 快速验证方法:右键 → “查看页面源代码”,确认所有 虽然 HTML5 允许在 段落内容 真正容易被忽略的是:即使结构合法,如果 的直接子节点只能是 ,不能直接放文字、、ul > p 根本不匹配)。
内 或 文本
可以嵌套任意合法内容(如 、、甚至另一个 )嵌套列表:li 里面再放 ul 是唯一合法方式
包裹下一级 ,而不是把 直接塞进上层 。
必须是某个 的子元素,不能平级出现在外层 中 可独立决定是否展开子列表,无需统一处理padding-left 而非依赖默认 margin,避免不同浏览器渲染差异常见错误现象与调试提示
下出现灰色“#text”节点(即非法空白文本)document.querySelectorAll('ul > li') 获取不到预期数量 —— 说明部分 实际被浏览器移到了 外面 和 都严格处于 内部,且没有裸文本混入。li 里放块级元素需注意兼容性细节
里放 、 等,但老版本 IE(如 IE8)对块级嵌套支持弱,可能撑开行高或破坏垂直居中。
,避免无意义包裹
,并确保 CSS 清除 p 默认 margin 容易漏掉内层 ...
内部用了 display: flex 或 float,也可能让某些屏幕阅读器无法正确识别列表语义。这时候得靠 role="listitem" 补救,但治标不治本 —— 还是得先确保原始 HTML 嵌套干净。










