一、问题原因
HTML 中的空白符:当 <li> 使用 inline-block 或默认 inline 布局时,代码中的换行或空格会被解析为文本节点,产生约 4px 的间隙。
<ul>
<li>Item1</li> <!-- 换行和缩进导致空白符 -->
<li>Item2</li>
</ul>
二、解决方案对比
方法 1:删除 HTML 空白符(简单粗暴)
<ul>
<li>Item1</li><li>Item2</li> <!-- 所有 li 写在一行 -->
</ul>
✅ 优点:无需 CSS 改动
❌ 缺点:代码可读性差
方法 2:父元素设置 font-size: 0(推荐)
ul {
font-size: 0; /* 消除空白符宽度 */
}
li {
font-size: 16px; /* 重置字体大小 */
display: inline-block;
}
✅ 优点:兼容性好,代码整洁
❌ 注意:需在子元素重置字体
方法 3:负 margin 抵消或者使用letter-spacing:-4px消除字符间隔。
li {
display: inline-block;
margin-left: -4px; /* 根据字体调整数值 */
}
✅ 适用场景:已知空白符宽度
❌ 缺点:需手动计算,不灵活
方法 4:Flex 布局(最佳实践)
ul {
display: flex; /* 弹性布局忽略空白符 */
}
✅ 优点:现代布局方案,无需处理间隙
❌ 注意:IE11 部分支持
方法 5:浮动 float
li {
float: left;
}
ul::after { /* 清除浮动 */
content: "";
display: block;
clear: both;
}
✅ 优点:兼容旧浏览器
❌ 缺点:浮动布局副作用多
三、方案选择建议
- 现代项目:优先使用 Flex 布局(方法4)
- 传统项目:用
font-size: 0(方法2) - 极简场景:写在一行(方法1)
四、代码示例(Flex 方案)
<ul class="flex-list">
<li>首页</li>
<li>产品</li>
<li>关于</li>
</ul>
<style>
.flex-list {
display: flex;
gap: 10px; /* 可选:控制间距 */
list-style: none;
padding: 0;
}
.flex-list li {
padding: 8px 16px;
background: #eee;
}
</style>
五、高频面试问题
问:为什么 Flex 布局能消除间隙?
答:Flex 容器会忽略子元素间的空白符,直接按弹性项排列
问:font-size: 0 会导致子元素文字消失吗?
答:不会,只要在子元素重置 font-size 即可恢复
六、记忆口诀
“空白符作祟,代码换行惹的祸;Flex 最省事,font-size 零也管用”