0

0

如何使用csslist-style属性控制列表样式

P粉602998670

P粉602998670

发布时间:2025-09-19 12:16:01

|

971人浏览过

|

来源于php中文网

原创

list-style 是控制HTML列表样式的CSS简写属性,包含 list-style-type(标记类型)、list-style-position(标记位置)和 list-style-image(自定义图像)。通过设置这些子属性,可改变项目符号或编号的外观与布局;使用 list-style: none 并重置 padding 和 margin 可彻底清除默认样式,结合伪元素与CSS计数器能实现高度自定义的标记和复杂编号系统,如多级章节编号;list-style-position 的 outside 使文本换行后与标记对齐,inside 则让标记成为内容一部分并形成缩进块,选择需根据可读性、设计需求和文本长度权衡;有序列表可通过 start 属性或CSS计数器实现从指定数字开始及非传统编号。

如何使用csslist-style属性控制列表样式

list-style
属性是CSS中用来控制HTML列表(
<ul>
,
<ol>
) 项目符号或编号外观的核心工具。它提供了一种简洁而强大的方式,让我们能够管理列表项的标记类型、位置,甚至用自定义图像替代默认符号,从而实现更精细的视觉控制和设计自由度。

解决方案

要控制列表样式,我们主要会用到

list-style
这个 CSS 简写属性,它其实是
list-style-type
list-style-position
list-style-image
这三个子属性的集合。理解这三个子属性的工作方式,是掌握列表样式的关键。

1.

list-style-type
:定义标记类型 这个属性决定了列表项前面的标记会是什么样子。对于无序列表(
<ul>
),常见的类型有:

  • disc
    (实心圆,默认)
  • circle
    (空心圆)
  • square
    (实心方块)
  • none
    (不显示任何标记)

对于有序列表(

<ol>
),它则控制编号的格式:

  • decimal
    (阿拉伯数字,1, 2, 3...,默认)
  • decimal-leading-zero
    (带前导零的数字,01, 02, 03...)
  • lower-alpha
    lower-latin
    (小写英文字母,a, b, c...)
  • upper-alpha
    upper-latin
    (大写英文字母,A, B, C...)
  • lower-roman
    (小写罗马数字,i, ii, iii...)
  • upper-roman
    (大写罗马数字,I, II, III...)

示例:

立即学习前端免费学习笔记(深入)”;

ul {
    list-style-type: square; /* 无序列表使用方块 */
}
ol {
    list-style-type: upper-roman; /* 有序列表使用大写罗马数字 */
}

2.

list-style-position
:定义标记位置 这个属性决定了列表项的标记是放在文本内容的“外部”还是“内部”。

  • outside
    (默认值):标记位于列表项内容框的外部。这意味着如果列表项文本很长并换行,后续的行会与标记对齐,而不是在标记下方缩进。这通常是浏览器默认行为,也是最常见的布局方式。
  • inside
    :标记被视为列表项内容的一部分,位于内容框的内部。当文本换行时,所有行都会在标记下方缩进,就好像标记是列表项文本的第一个单词一样。

示例:

立即学习前端免费学习笔记(深入)”;

ul.outside-list {
    list-style-position: outside; /* 标记在内容外部 */
}
ul.inside-list {
    list-style-position: inside; /* 标记在内容内部 */
}

3.

list-style-image
:使用自定义图像作为标记 如果你觉得内置的标记类型不够用,或者想让列表样式与品牌设计更一致,可以使用这个属性来指定一个图像文件作为列表项的标记。

  • url('path/to/your-image.png')
    :指定图像文件的路径。
  • none
    :不使用图像。

需要注意的是,

list-style-image
的优先级高于
list-style-type
。如果同时设置了这两个属性,只要图像能够加载成功,
list-style-image
就会生效。如果图像加载失败,浏览器会回退到
list-style-type
指定的样式。

示例:

立即学习前端免费学习笔记(深入)”;

ul {
    list-style-image: url('images/custom-bullet.png'); /* 使用自定义图片 */
    list-style-type: square; /* 如果图片加载失败,则回退到方块 */
}

list-style
简写属性: 为了方便,我们可以将这三个属性合并到一个
list-style
简写属性中。值的顺序通常是
type
position
image
,但实际上,只要值类型明确,顺序并不严格。未指定的值会采用其默认值。

示例:

立即学习前端免费学习笔记(深入)”;

ul {
    list-style: square inside url('images/bullet.png');
}
/* 等同于:
ul {
    list-style-type: square;
    list-style-position: inside;
    list-style-image: url('images/bullet.png');
}
*/

使用

list-style: none;
是最快速移除所有默认列表标记的方式,它会将
list-style-type
list-style-position
list-style-image
都设置为
none

如何彻底移除列表的默认样式,并进行自定义?

彻底移除列表的默认样式并进行自定义,这在前端开发中是家常便饭。浏览器给

<ul>
<ol>
列表设置的默认样式,除了
list-style-type
,往往还有
padding-left
margin
。所以,仅仅使用
list-style: none;
是不够的。

要彻底“清零”列表的默认样式,我通常会这样操作:

ul, ol {
    list-style: none; /* 移除项目符号或编号 */
    padding: 0;      /* 移除左侧内边距 */
    margin: 0;       /* 移除外边距 */
}

这样一来,列表就变成了一个纯粹的块级元素,没有任何视觉上的“列表”痕迹。接下来,我们就可以利用 CSS 的强大功能,尤其是伪元素

::before
::after
),来创建完全自定义的列表标记。

使用伪元素自定义标记:

伪元素可以让我们在不修改HTML结构的情况下,在元素内容的前面或后面插入内容。这对于自定义列表标记来说,简直是天作之合。

绘蛙
绘蛙

电商场景的AI创作平台,无需高薪聘请商拍和文案团队,使用绘蛙即可低成本、批量创作优质的商拍图、种草文案

下载
ul.custom-list li {
    position: relative; /* 为伪元素定位提供参考 */
    padding-left: 20px; /* 为自定义标记留出空间 */
    line-height: 1.5;   /* 确保行高舒适 */
}

ul.custom-list li::before {
    content: "?"; /* 自定义标记内容,可以是字符、表情符号 */
    position: absolute;
    left: 0;
    top: 0; /* 或者 top: 0.2em; 根据字体大小微调 */
    color: #007bff; /* 标记颜色 */
    font-size: 1.2em; /* 标记大小 */
}

/* 如果是自定义编号,可以使用CSS计数器 */
ol.custom-numbered-list {
    counter-reset: my-custom-counter; /* 初始化计数器 */
}

ol.custom-numbered-list li {
    position: relative;
    padding-left: 30px; /* 留出更多空间给编号 */
}

ol.custom-numbered-list li::before {
    counter-increment: my-custom-counter; /* 每次出现li,计数器加1 */
    content: counter(my-custom-counter) ". "; /* 显示计数器值和点号 */
    position: absolute;
    left: 0;
    top: 0;
    font-weight: bold;
    color: #28a745;
}

通过

position: relative
position: absolute
的组合,我们可以精确地控制自定义标记的位置。
content
属性则可以接受字符串、表情符号,甚至是
url()
函数来插入背景图片(虽然通常用
background-image
更灵活)。对于有序列表,CSS 计数器(
counter-reset
,
counter-increment
,
counter()
)提供了一种非常灵活的方式来创建复杂的编号系统,比如多级编号。这种方式的灵活性远超
list-style-type
的预设值。

list-style-position
inside
outside
有何实际区别,我该如何选择?

list-style-position
inside
outside
确实在视觉上和布局上有着显著的区别,理解它们能帮助我们更好地控制列表的呈现。

outside
(默认值):

  • 视觉表现: 列表项的标记(项目符号或编号)会放置在列表项内容框的外部。你可以把它想象成标记“挂”在内容区域的左边。
  • 文本换行: 如果列表项的文本内容很长并发生换行,那么后续的文本行会与标记的 起始位置 对齐。也就是说,换行的文本不会缩进,而是紧接着第一行文本的下方开始,与标记的水平位置对齐。
  • 适用场景: 这是最常见的列表样式,给人的感觉是标记独立于内容,清晰明了。它在大多数情况下都能提供良好的可读性,尤其适合那些内容较短、每项都比较独立的列表。我个人在设计时,如果没什么特殊需求,通常会倾向于使用
    outside
    ,因为它保持了列表的传统外观,并且文本块的对齐感更强。

inside

  • 视觉表现: 列表项的标记被视为列表项内容的一部分,放置在内容框的内部,紧贴着第一行文本的开头。
  • 文本换行: 如果列表项的文本内容很长并发生换行,那么后续的文本行会 缩进,与第一行文本的起始位置对齐,而不是与标记对齐。整个列表项的文本内容形成一个缩进的块。
  • 适用场景:
    inside
    样式让标记看起来更像是文本的一部分。它在某些特定设计中很有用,例如当你希望列表项的标记不会占用额外的外部空间,或者当列表项文本与标记需要更紧密的视觉联系时。不过,如果列表项文本很长,
    inside
    可能会导致文本块的缩进显得有些深,或者在视觉上不如
    outside
    那么“干净利落”。在移动端布局或需要紧凑空间时,有时也会考虑
    inside
    ,因为它不会因为标记而额外挤压内容区域。

如何选择?

我的选择标准通常是这样的:

  1. 可读性优先: 如果列表内容是核心信息,需要清晰易读,我会选择
    outside
    。它让标记和内容保持一定的距离,视觉上更舒适。
  2. 设计需求: 如果设计稿明确要求标记与文本紧密结合,或者在狭窄的容器中需要节省横向空间,
    inside
    可能是更好的选择。
  3. 文本长度: 如果列表项的文本普遍较长,容易换行,那么
    outside
    通常能提供更好的视觉流,避免过深的缩进。如果列表项内容非常简短,
    inside
    outside
    的差异就不那么明显了。
  4. 自定义程度: 如果你打算使用伪元素来完全自定义列表标记,那么
    list-style-position
    的选择就没那么关键了,因为你可以通过
    padding-left
    和伪元素的
    left
    属性来精确控制标记位置。

总的来说,

outside
是一个更“安全”和通用的选择,而
inside
则适用于更具体的设计场景,需要你权衡其对文本对齐和空间利用的影响。

我可以为有序列表
<ol>
创建非传统编号,比如从特定数字开始或使用自定义计数器吗?

是的,完全可以!CSS 为有序列表(

<ol>
)提供了非常强大的自定义编号机制,远不止
list-style-type
那些预设的类型。你可以让编号从任何数字开始,甚至创建多级、复杂的自定义计数器。

1. 让编号从特定数字开始:

最简单的方法是使用 HTML 的

start
属性。这是直接作用在
<ol>
标签上的一个属性。

<ol start="5">
    <li>这是第五项</li>
    <li>这是第六项</li>
    <li>这是第七项</li>
</ol>

这会直接让列表从数字 5 开始编号。

另一种 CSS 的方法是使用

counter-reset
,但对于简单的起始数字,
start
属性更直接。

2. 使用 CSS 计数器创建自定义编号:

CSS 计数器(

counter-reset
counter-increment
counter()
函数)是实现非传统编号的核心。它们允许你创建和管理页面上的任何计数器,并将其显示在伪元素中。这对于创建像“1.1.1”这样的章节编号,或者其他复杂编号方案非常有用。

我们来看一个例子,如何创建一个从特定数字开始,并且可以实现多级编号的列表:

/* 首先,移除默认的列表样式和内边距 */
ol {
    list-style: none;
    padding: 0;
    margin: 0;
}

/* 定义一个主计数器,例如用于章节 */
ol.chapter-list {
    counter-reset: chapter; /* 初始化名为 'chapter' 的计数器 */
}

ol.chapter-list > li {
    counter-increment: chapter; /* 每次遇到一级li,'chapter' 计数器加1 */
    position: relative;
    padding-left: 40px; /* 为编号留出空间 */
    margin-bottom: 10px;
}

ol.chapter-list > li::before {
    content: counter(chapter) ". "; /* 显示 'chapter' 计数器的值 */
    position: absolute;
    left: 0;
    font-weight: bold;
    color: #c0392b;
}

/* 现在处理二级列表,例如子章节 */
ol.chapter-list li ol {
    counter-reset: section; /* 在每个一级li内部,重置名为 'section' 的计数器 */
    margin-top: 5px;
}

ol.chapter-list li ol li {
    counter-increment: section; /* 每次遇到二级li,'section' 计数器加1 */
    position: relative;
    padding-left: 60px; /* 为二级编号留出更多空间 */
    margin-bottom: 5px;
}

ol.chapter-list li ol li::before {
    content: counter(chapter) "." counter(section) ". "; /* 显示 'chapter' 和 'section' 计数器组合 */
    position: absolute;
    left: 0;
    font-weight: normal;
    color: #2c3e50;
}

HTML 结构:

<ol class="chapter-list">
    <li>
        第一章标题
        <ol>
            <li>第一章第一节</li>
            <li>第一章第二节</li>
        </ol>
    </li>
    <li>
        第二章标题
        <ol>
            <li>第二章第一节</li>
            <li>第二章第二节</li>
            <li>第二章第三节</li>
        </ol>
    </li>
</ol>

这段代码展示了如何利用

counter-reset
counter-increment
来创建分层的编号系统。
counter-reset
可以在父元素上初始化或重置一个计数器,而
counter-increment
则在子元素上递增它。
content
属性中的
counter()
函数则负责显示计数器的当前值。通过这种方式,我们可以完全脱离
list-style-type
的限制,创建出任何我们想要的编号格式,这为列表的样式设计带来了极大的灵活性和控制力。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1567

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1228

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1204

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

193

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

131

2025.08.07

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

CSS教程
CSS教程

共754课时 | 42.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号