跟着 MDN 学CSS day_30:(玩转列表样式,从基础到进阶)

在网页设计中,列表扮演着至关重要的角色 。无论是导航菜单、文章目录、产品特性展示,还是步骤说明,列表都是组织和呈现结构化信息的核心元素。

HTML 为我们提供了三种主要的列表类型:

  • 无序列表 <ul>
  • 有序列表 <ol>
  • 描述列表 <dl>

虽然它们各自承载着不同的语义功能 ,但在 CSS 的世界里,它们共享着许多样式基础,同时又各自拥有独特的定制潜力 。本文将带你深入探索 CSS 为列表提供的专属属性,从处理默认间距和建立垂直节奏 ,到自定义项目符号、管理计数方式 ,再到为嵌套列表添加样式,全面掌握列表样式的艺术。


一、理解浏览器的默认列表样式

在开始自定义列表样式之前,我们必须先了解浏览器为列表元素预设了哪些默认样式 。这些默认样式是跨浏览器保持一致性的起点 ,也是我们需要覆盖或调整的目标。

当你创建一个不加任何 CSS 的 HTML 列表时,浏览器会自动应用一些内边距和外边距

元素 默认外边距 (margin) 默认内边距 (padding) 其他默认样式
<ul> / <ol> margin-top: 1em(约16px) margin-bottom: 1em(约16px) padding-left: 2.5em(约40px) ---
<li> 无额外默认值 无额外默认值 ---
<dl> margin-top: 1em margin-bottom: 1em ---
<dd> margin-left: 2.5em(约40px) 形成缩进效果
<dt> 无额外默认值 ---

🎯 关键认知 :列表的"缩进"效果实际上是 padding-left 造成的,而不是 margin-left。理解这一点对于后续自定义项目符号的位置至关重要。

示例代码

css 复制代码
/* 通常我们会先重置这些默认值,以便完全掌控 */
ul, ol {
  margin: 0;
  padding: 0;
}

/* 为了观察默认值,我们可以显式地将其写出来 */
ul.default-style {
  margin-top: 1em;
  margin-bottom: 1em;
  padding-left: 2.5em;
}

ol.default-style {
  margin-top: 1em;
  margin-bottom: 1em;
  padding-left: 2.5em;
}

dd.default-style {
  margin-left: 2.5em;
}

🔍 讲解

上面的代码块首先演示了一种激进的重置方式 ,将 ulolmarginpadding 全部设为 0 ,这是许多 CSS 重置样式表的常见做法

紧接着,我们创建了 .default-style 相关的类,用于模拟浏览器为列表元素预设的典型样式。通过这种方式,你可以清晰地看到:

  • 列表的"缩进"效果实际上是 padding-left 造成的
  • 当你想要移除列表的默认缩进 时,通常需要将 padding-left 设为 0,而不是 margin-left

二、建立垂直节奏:统一列表与文本的间距

当列表与标题、段落等其他文本元素混合排版 时,建立统一的垂直节奏 是提升页面整体感和可读性的关键。

🎵 垂直节奏 :指的是页面上所有元素在垂直方向上的间距保持一种和谐的比例关系 。混乱的间距会使用户感到视觉疲劳和逻辑断裂

2.1 核心策略

实现这一目标的核心策略是确保所有文本块级元素,如 <p><ul><ol><dl> 等,拥有相同的 font-sizeline-height 。此外,它们各自的 margin 值也应该保持一致

🎯 效果 :通过这种统一的设置,列表项内部的文字行距、列表与列表之间的间距、以及列表与段落之间的间距,都会呈现出一种规律性的节奏感
📝 描述列表注意 :对于描述列表 <dl>,其内部的 <dt><dd> 元素也应遵循相同的 line-height ,以确保其内部文本的纵向间距与外部保持一致

示例代码

css 复制代码
html {
  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  font-size: 10px; /* 方便计算 rem 值 */
}

/* 统一所有主要块级文本元素的字体大小 */
h2 {
  font-size: 2rem;
  margin-bottom: 0.8rem;
}

ul, ol, dl, p {
  font-size: 1.6rem;
  margin-top: 0;
  margin-bottom: 1.6rem; /* 统一的下外边距,形成垂直节奏 */
}

/* 统一列表项和段落的行高 */
li, p, dd, dt {
  line-height: 1.5;
}

/* 为描述列表的术语增加视觉区分 */
dt {
  font-weight: bold;
}

🔍 讲解

这段代码构建了一个高度统一的排版系统

元素 设置 作用
html font-size: 10px 基准,方便 rem 计算
h2 font-size: 2rem + margin-bottom: 0.8rem 标题层级
ul, ol, dl, p font-size: 1.6rem + margin-bottom: 1.6rem 统一的下外边距,形成垂直节拍
li, p, dd, dt line-height: 1.5 统一的行高,确保呼吸空间一致
dt font-weight: bold 术语视觉强化 ,在保持节奏的同时脱颖而出

🎯 核心价值 :这种体系化的思维方式 ,是构建专业级页面排版的基础。


三、定制项目符号:list-style-type 属性详解

list-style-type 属性允许你改变无序列表和有序列表前面项目符号或编号的外观

3.1 无序列表 (<ul>) 的符号类型

效果 适用场景
disc 实心圆点(默认值) 常规列表
circle 空心圆 次级列表、区分层级
square 方块 稳重、规整的列表
none 隐藏符号 导航菜单、标签页

3.2 有序列表 (<ol>) 的编号类型

效果 适用场景
decimal 数字(1, 2, 3...) 步骤说明、常规排序
decimal-leading-zero 前导零数字(01, 02, 03...) 固定宽度编号
lower-roman 小写罗马数字(i, ii, iii...) 论文大纲、法律条款
upper-roman 大写罗马数字(I, II, III...) 正式文档
lower-alpha 小写字母(a, b, c...) 子级列表
upper-alpha 大写字母(A, B, C...) 层级编号

🌏 国际化支持 :在许多非英语语言中,还有更多特定的编号方案可供选择,例如日文的平假名片假名编号。

3.3 代码示例

css 复制代码
/* 无序列表:使用方形项目符号 */
.feature-list {
  list-style-type: square;
}

/* 无序列表:隐藏项目符号,常用于导航菜单 */
.nav-menu {
  list-style-type: none;
}

/* 有序列表:使用大写罗马数字 */
.legal-steps {
  list-style-type: upper-roman;
}

/* 有序列表:使用小写希腊字母(如果浏览器支持) */
.greek-outline {
  list-style-type: lower-greek;
}

🔍 讲解

类名 设置 设计意图
.feature-list square 罗列产品特性,显得稳重而规整
.nav-menu none 创建网站主导航、侧边栏链接或标签页时的绝对基础操作 ------列表的语义(一系列链接)被保留,而默认的点状符号在视觉上是多余的
.legal-steps upper-roman 赋予内容一种正式和权威的感觉
.greek-outline lower-greek 适用于需要展示学术或科学分类大纲的场景

💡 选型建议list-style-type 的值非常多样 ,查阅 MDN 的参考页面可以发现更多可能性


四、控制符号位置与自定义图片

4.1 list-style-position ------ 符号位置

list-style-position 属性决定了项目符号是位于列表项内容框的外部outside)还是内部inside)。

效果 特点
outside(默认) 项目符号在内容框外部 悬挂缩进 效果,文本换行时与上一行起始位置对齐
inside 项目符号在内容框内部 符号表现得如同内联元素 ,文本换行时与符号对齐

🎯 选择建议

  • outside ------ 绝大多数列表的默认表现,视觉清晰
  • inside ------ 需要列表项在水平方向上完全对齐 时使用,但多行时可能不够整洁

4.2 list-style-image ------ 自定义图片符号

list-style-image 属性允许你使用一张自定义图片来替代默认的项目符号。

显著缺点 :你很难精确控制图片的大小和垂直对齐位置 ,其结果往往不尽如人意
现代推荐方案 :为了获得对项目符号的完美像素级控制 ,一个更推荐的、更强大的方法是使用 background-image 属性来模拟项目符号。

4.3 代码示例:对比与最佳实践

css 复制代码
/* 1. 将项目符号放在列表项内部 */
ol.inside-marker {
  list-style-type: decimal;
  list-style-position: inside;
}

/* 2. 使用背景图片技术创建完美的自定义项目符号 */
ul.custom-bullet {
  list-style-type: none; /* 1. 隐藏默认符号 */
  padding-left: 0;      /* 2. 对齐调整 */
}

ul.custom-bullet li {
  padding-left: 2.5rem;  /* 3. 为背景图腾出空间 */
  background-image: url('checkmark.svg');
  background-position: 0 center; /* 4. 垂直居中定位 */
  background-size: 1.2rem 1.2rem; /* 5. 精确控制大小 */
  background-repeat: no-repeat;
  line-height: 1.6;
}

🔍 讲解

第一部分:ol.inside-marker

  • 展示了 list-style-position: inside 的效果
  • 此时,数字"1."、"2."成为了段落文本的一部分
  • ✅ 优点:列表项在水平方向上完全对齐,不会产生悬挂缩进
  • ⚠️ 缺点:当文本发生换行时,换行的文本会直接与项目符号的左侧对齐 ,而不是与上一行文本的起始位置对齐 ,这在多行列表项中有时会显得不够整洁

第二部分:ul.custom-bullet(最佳实践)

  • 这是自定义项目符号的最佳实践,步骤分解:
步骤 CSS设置 目的
1. 隐藏默认符号 list-style-type: none 移除原生符号
2. 对齐调整 padding-left: 0 清除默认缩进
3. 腾出空间 padding-left: 2.5rem 为背景图预留位置
4. 精确定位 background-position: 0 center 图标垂直居中在文本行的中央
5. 精确控制大小 background-size: 1.2rem 1.2rem 图标尺寸完全可控
6. 不重复 background-repeat: no-repeat 每个列表项只显示一个图标

🎯 技术优势 :这种技术提供了无与伦比的控制力 ,让你可以为列表添加任何形状、大小、颜色 的"项目符号",甚至可以使用 CSS 渐变或绘制的图形


五、list-style 简写:一站式设置

与许多 CSS 属性一样,list-style-typelist-style-positionlist-style-image 这三个属性可以通过一个统一的简写属性 list-style 来一次性设置。

📐 语法特点

  • 属性值可以按任意顺序排列
  • 可以选择只指定一个、两个或全部三个值
  • 未明确指出的属性会被设置为各自的默认值disc(type)、outside(position)、none(image)
    🛡️ 回退机制 :当你同时指定了 typeimage 时,type 的值会作为一个回退方案 。也就是说,如果浏览器因为路径错误或网络问题 导致自定义图片无法加载时,它会自动使用 你在 list-style-type 中指定的符号来替代,确保列表结构仍然清晰可见

示例代码

css 复制代码
/* 1. 同时设置三种属性 */
ul.complex-list {
  list-style: square inside url('diamond.svg');
}

/* 2. 设置 type 和 position,image 默认为 none */
ol.simple-list {
  list-style: lower-alpha outside;
}

/* 3. 只设置 type,position 和 image 使用默认值 */
ul.basic-list {
  list-style: circle;
}

🔍 讲解

规则 设置 效果
ul.complex-list square inside url('diamond.svg') 一行代码同时设置:方块作为回退符号 、符号位于列表项内部 、一张自定义 SVG 图片。如果 diamond.svg 加载失败,浏览器会退而求其次,显示一个方块
ol.simple-list lower-alpha outside 编号类型为小写字母 、位置在外部 。由于未指定 image,它将被初始化为 none,不显示图片
ul.basic-list circle 最为精简,只改变了项目符号类型为空心圆

💡 实用价值 :这种简写方式在实际开发中非常实用,尤其是在需要快速覆盖浏览器的默认列表样式 时,一行 list-style: none; 就能干净利落地清除所有默认符号和缩进相关的表现


六、管理有序列表的计数

有序列表最大的特点在于其自动编号的能力 。但有时,我们需要打破常规的从 1 开始、步长为 1 的计数规则。

🎯 典型场景

  • 一个教程可能因分页 而需要从第 5 步开始
  • 一个排行榜可能想从第 10 名倒序排列到第 1 名
  • 由于某些条目被删除 ,需要手动调整特定项的序号

HTML 为此提供了三个专门的属性来灵活控制计数行为

属性 作用元素 功能 值类型
start <ol> 指定列表开始计数的起始数字 整数
reversed <ol> 布尔属性 ,让列表反向递减计数 无(存在即生效)
value <li> 单个列表项手动指定特定数值 整数

📝 重要注意 :即使你的 list-style-type 设置了罗马数字或字母 等非数字样式,startvalue 属性仍然需要你提供等效的阿拉伯数字值 ,浏览器会自动将其转换为对应的符号样式

示例代码

html 复制代码
<!-- 1. 使用 start 属性,从第 5 步开始 -->
<h3>续接上一步</h3>
<ol start="5">
  <li>将混合物倒入模具。</li>
  <li>放入烤箱烘烤 20 分钟。</li>
  <li>取出后静置冷却。</li>
</ol>

<!-- 2. 结合 start 和 reversed 属性,进行倒计时 -->
<h3>巅峰排行榜 (倒序)</h3>
<ol start="10" reversed>
  <li>第十名</li>
  <li>第九名</li>
  <li>第八名</li>
</ol>

<!-- 3. 使用 value 属性对特定项进行手动编号 -->
<h3>自定义编号</h3>
<ol>
  <li value="2">第二章:初识</li>
  <li value="5">第五章:转折</li>
  <li value="9">第九章:结局</li>
</ol>

🔍 讲解

第一个例子:start 属性

  • <ol start="5"> 让这个列表的第一项编号从 5 开始,随后自动递增为 6、7
  • 这在需要将一个长列表拆分到多个页面或章节 显示时极其有用,保证了编号的连续性

第二个例子:start + reversed

  • start="10" 设定了起始值为 10
  • reversed 属性则将递增顺序改为递减
  • 因此列表项的编号会显示为 10、9、8 ,实现了一个倒序排行的效果
  • ⚠️ 注意:如果反向计数到 后列表项还有剩余,编号会继续向负数方向延伸

第三个例子:value 属性

  • 赋予了开发者对单个列表项编号完全控制权
  • 列表项的编号不再遵循顺序 ,而是严格按照 value 指定的数值来显示,分别是 2、5、9
  • 这在整理一份目录,而其章节编号并不连续时,显得尤为强大
  • 💡 即使 list-style-typeupper-alphavalue 的值也应填数字 ,浏览器会自动将数字 2 显示为大写字母 "B"

七、实践:为嵌套列表构建清晰的视觉层级

嵌套列表,即列表之中再包含列表,是组织复杂、多层次信息的常用结构,例如多级导航菜单、具有子步骤的详细教程、或文件目录树。

为嵌套列表添加样式的最大挑战在于,如何让用户清晰地分辨出不同的层级 。如果所有层级的样式都完全相同 ,内容结构会变得模糊不清,难以阅读

7.1 构建层级的关键策略

策略 实现方式 目的
差异化符号 不同层级使用不同的 list-style-type 仅凭符号样式即可快速识别层级
递进缩进 通过递进的 padding-leftmargin-left 形成视觉上的缩进层次

🎯 示例方案

  • 第一层无序列表 → 实心圆点 (disc)
  • 第二层 → 空心圆 (circle)
  • 第三层 → 方块 (square)
  • 有序列表:一级用数字 ,二级用小写字母

7.2 代码示例

css 复制代码
/* 第一层:使用实心圆点,无额外缩进 */
ul.level-one {
  list-style-type: disc;
}

/* 第二层:使用空心圆,并增加左侧边距以示缩进 */
ul.level-one ul {
  list-style-type: circle;
  padding-left: 2rem;
}

/* 第三层:使用方块,并进一步增加缩进 */
ul.level-one ul ul {
  list-style-type: square;
  padding-left: 2.5rem;
}

/* 为所有列表项设置统一的行高 */
ul.level-one li {
  line-height: 1.8;
}
html 复制代码
<!-- 对应的 HTML 嵌套结构 -->
<ul class="level-one">
  <li>前端技术
    <ul>
      <li>HTML</li>
      <li>CSS
        <ul>
          <li>选择器</li>
          <li>盒模型</li>
          <li>布局</li>
        </ul>
      </li>
      <li>JavaScript</li>
    </ul>
  </li>
  <li>后端技术</li>
</ul>

🔍 讲解

这个例子完整地展示了如何为嵌套列表构建一个清晰的视觉层级

选择器 目标层级 符号 缩进
ul.level-one 第一层 disc(实心圆点) 无额外缩进
ul.level-one ul 第二层 circle(空心圆) padding-left: 2rem
ul.level-one ul ul 第三层 square(方块) padding-left: 2.5rem
ul.level-one li 所有层级 --- line-height: 1.8(统一行高)

🎯 视觉线索 :在 HTML 中,你可以直观地看到列表标签是如何层层嵌套 的。最终呈现出的效果就是一个符号逐级变化、层级分明的树状结构 ,用户可以毫不费力地理解内容之间的父子关系


八、总结

掌握列表样式是 CSS 技能树中重要的一环

知识点 核心要点
默认样式 <ul>/<ol> 的缩进由 padding-left 造成;<dd> 的缩进由 margin-left 造成
垂直节奏 统一 font-sizeline-heightmargin-bottom,建立和谐的垂直间距
list-style-type 丰富的符号/编号类型:disc/circle/square/nonedecimal/roman/alpha
list-style-position outside(悬挂缩进,默认)vs inside(完全对齐)
自定义符号最佳实践 使用 background-image 替代 list-style-image,获得完美像素级控制
list-style 简写 一站式设置 type + position + imagetype 作为 image回退方案
有序列表计数控制 start(起始值)、reversed(反向递减)、value(单项手动编号)
嵌套列表层级 差异化符号 + 递进缩进 = 清晰的视觉层级

本文从分析浏览器默认样式 入手,教你如何建立和谐的垂直节奏 ;接着深入探索了 list-style-typelist-style-positionlist-style-image 三大属性,并推荐了使用背景图片自定义项目符号的最佳实践 ;随后介绍了便捷的 list-style 简写以及控制有序列表计数的 startreversedvalue 属性;最后,通过一个嵌套列表的实例 ,展示了如何构建清晰的视觉层级

🚀 现在,你已经能够完全驾驭 HTML 列表的 CSS 表现力。下一篇,我们将继续样式化文本的旅程,探索为链接添加样式的各种技巧。


还在纠结 CSS 样式写得杂乱无章、布局频频踩坑?收藏此文持续跟进,后续分享 CSS 高效简写、兼容适配方案、经典布局案例、样式避坑干货,从基础样式到实战排版一站式学透,快速提升前端页面编写能力!

相关推荐
ct9782 小时前
TypeScript 中的泛型
前端·javascript·typescript
IT_陈寒2 小时前
React hooks闭包陷阱把我坑惨了,原来这才是正确用法
前端·人工智能·后端
nnsix2 小时前
MVC、MVP、MVVM 架构 笔记
java·开发语言·前端
qq_420362032 小时前
前端国际化方案
前端·javascript·vue.js·国际化·reactjs
向上的车轮2 小时前
React 19 快速入门:拥抱服务端组件与新特性的现代化开发
前端·javascript·react.js
Smile_2542204182 小时前
vue3 + ts reactive方式清空表单对象
开发语言·前端·javascript
多租户观察室2 小时前
信通院标准体系2.0深度解读:低代码管理平台进入“精品竞争”时代
前端·低代码·程序员
云水一下2 小时前
CSS3从零基础到精通(四):终章大项目——纯CSS构建企业品牌展示网站
前端·css3
147API2 小时前
Claude Opus 4.8 接口与工程落地分析:长任务调用链应该怎么设计
java·前端·数据库