特别声明:如果您喜欢小站的内容,可以点击申请会员进行全站阅读。如果您对付费阅读有任何建议或想法,欢迎发送邮件至: airenliao@gmail.com!或添加QQ:874472854(^_^)
在 奇妙的 CSS 计数器世界 第一部分 主要介绍了使用 list-style
(以及它们的子属性list-style-type
、list-style-image
和list-style-position
)属性给列表项设置列表项标记符样式。除此之外,还可以使用 @counter-style
规则来自定义列表项标记符(list-style-type
的值)。事实上,每个列表顶的标记符都是::marker
伪元素生成的标记框的内容。在这部分中,我们开始进入::marker
伪元素世界。感兴趣的请继续往下阅读。
::marker 伪元素
在 CSS 中,li
元素和使用display
为list-item
的元素都会有一个标记框(Marker Box),对应的就是::marker
伪元素。列表项或display
为list-item
的元素其标记符的特征(即标记符样式)是由这个标记框的样式决定的,它是一个符号或序列号。默认情况之下,无序列表的标记符是一个符号,而有序列表的标记符是一个序列号。
注意,
display
除了list-item
会生成列表项标记框之外,还可以是inline list-item
和block list-item
,有关于display
更详细的介绍,可以阅读《display
属性》一文。
在 CSS 布局模型中,列表项的标记由一个与每个列表项相关的标记框表示:
这个标记的内容可以通过列表项上的list-style-type
和list-style-image
属性以及::marker
伪元素分配属性来控制。虽然,使用 list-style-image
可以引用图片来调转标记符样式或使用list-style-type
使用字符以及结合@counter-style
自定义的标记符给列表标记符设置样式。但他们有一定的局限性,比如要控制他们的位置,个性化的样式等。但我们可以使用::marker
伪元素content
定义列表项标记符,并且可以很好的对其样式做个性化方面的处理。比如说,只改变列表项标记符的 颜色、大小、位置 等,甚至还可以构建个性化非常强的标记符效果。
CSS Lists and Counters Module Level 3规范第一部分内容就是专门介绍::marker
伪元素的!简单地说,列表项的标记框(Marker Box)是由一个列表项的::marker
伪元素生成的,而且作为该列表项的第一个子元素。
列表项标记框的内容
试着回忆一下,默认的列表项和display
为list-items
的元素,::marker
对应的内容是什么?这里指的是其计算之后的内容。比e如,在列表项上未显式使用 CSS 的 list-style-type
或 list-style-image
指定任何标记符样式,那么标记框(即::marker
)的content
的值为normal
。
规范中对于标记框的内容是什么,是有明确的规则声明的。简单地说,标记框的内容是由下面这些条件中第一个为真的条件决定的:
- ①:
::marker
伪元素的content
的值不是normal
:标记框的内容由content
属性决定,和伪元素::before
和::after
完全一样,但当content
的值为none
时,::marker
被移除,标记框中会没有任何内容 - ②:元素的
list-style-image
显式定义了一个标记符为图像 :标记框包含了一个匿名的内联替换元素(代表指定的标记图像),并且在标记图像后面紧跟了一个空格符(U+0020
,即空格键符,相当于按了键盘上的 SPACE键) - ③:元素的
list-style-type
显式定义了一个标记符 :标记框包含一个由指定标记字符串组成的文本 - 否则,标记框会没有内容,并且
::marker
不会生成一个框,类似于display: none
一样
此外,UA可能转化为空格或丢弃任何保留的强制换行。
我们通过示例来解释。
先来看第一种情况。如果规则②和规则③都成立(为真),即没有显式给列表项设置list-style-type
和list-style-image
属性值,这个时候:
- 无序列表的列表项(
li
)的list-style-type
是disc
,list-style-image
为none
- 有序列表的列表项(
li
)的list-style-type
是decimal
,list-style-image
为none
display
为list-item
的元素,和无序列表项的表现相似,即list-style-type
为disc
,list-style-image
为none
在此基础上,我们将调整 规则①。即,在::marker
伪元素的content
指定不同的值:
:root {
--content: normal;
}
.list-item::marker {
content: var(--content);
}
content
的值运用了上一部分中提到的content
可用值,最终效果如下:
当::marker
的content
的值为normal
时,标记框的内容则是列表项list-style-type
的默认值:
当::marker
的content
的值设置为none
时,这个时候标记框会被移除,相当于display: none
:
当::marker
的content
的值设置为inherit
时,它的表现将和content
取值为normal
相同。
当::marker
的content
的值设置为空字符串(" "
),列表项标记框的内容为空字符串,并且将覆盖list-style-type
的默认样式。虽然标记框内容为空,但::marker
不会被移除:
当::marker
的content
的值设置为其他格式,比如文本字符串,HTML实体符,Emoji表情符号,图像等,标记框的内容将是content
的值指定的内容,并且会覆盖list-style-type
的默认样式:
接下来看第二种情况,将规则②中的list-style-image
显式设置一个指定的值,但规则③不变(list-style-type
不显式设
如需转载,烦请注明出处:https://www.w3cplus.com/css/css-counter-style-part2.html
如果文章中有不对之处,烦请各位大神拍正。如果你觉得这篇文章对你有所帮助,打个赏,让我有更大的动力去创作。(^_^)。看完了?还不过瘾?点击向作者提问!