整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

CSS --marker伪元素简介

CSS ::marker伪元素简介

y zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=9849

一、了解::marker伪元素

::marker 是CSS中新出的一种伪元素,用来匹配列表项中的“标记盒子”(盒模型中的一种,《CSS世界》中有介绍),并可以设置标记盒子里面的内容以及与字符显示相关的UI。

可以匹配任意设置了 display:list-item 的元素或伪元素,例如大家比较熟悉的 <li> 元素就可以直接使用::marker伪元素改变项目符号颜色、字号字体、甚至内容。

例如:

<ol>
    <li>有序列表</li>
    <li>作者张鑫旭</li>
    <li>看看序号的颜色?</li>
</ol>
::maker {
    color: deepskyblue;
    font-weight: bold;
}

实时效果如下所示(Chrome 86+):

  1. 有序列表
  2. 作者张鑫旭
  3. 看看序号的颜色?

普通元素应用::marker

如果是普通的HTML标签元素,例如 <div> 元素想要使用 ::marker 伪元素,可以设置 displaylist-item ,代码示意:

<div class="marker">summary元素有自己的marker伪元素</div>

可以使用如下所示的CSS代码让DIV元素有自己的标记:

div.marker {
  display: list-item;
  margin-left: 1em;
  padding-left: 5px;
}
div.marker::marker {
  content: '?';
}

实时渲染效果如下(左侧应该是个三角尖头,如果浏览器不支持会是一个圆点,如果什么都没有,您访问的是盗版):

summary元素有自己的marker伪元素

其中:

  • content:'?' 不是必须的,默认就会创建符号‘·’作为项目符号,如下图所示。
  • margin-left:1em 也不是必须的,可以设置 list-style-position:inside 让项目符号字符的位置在标签内。
  • 标记字符可以是任意字符,数量也不限,例如:div.marker::marker { content: '→→→→→'; }此时的效果是下面这幅模样:注意,Safari浏览器目前还不支持 content 自定义标记符号,仅支持 list-style-type 属性设置标记符号,是时候祭出这张十几年的老图了。

二、只支持部分CSS

和::first-letter伪元素、::first-line伪元素类似, ::marker 伪元素仅支持部分的CSS属性,具体如下:

  • 所有font相关的属性,例如 font-sizefont-family 等,但是不包括 line-height 属性。
  • white-space 属性;
  • text-shadow 属性(仅Chrome支持),其他text相关属性并不支持;
  • letter-spacingword-spacing 属性(仅Chrome支持);
  • color 属性;
  • text-combine-uprightunicode-bididirection 属性,这几个属性与文字排版方位相关;
  • content 属性,Safari目前不支持
  • 所有动画和过渡相关的CSS属性,也就是 animationtransition 属性;

其中,支持 animationtransition 属性着实让我意外了一番,这在字符性质的伪元素中还是很少见的。

不过, ::marker 伪元素支持的CSS属性里面支持动画的CSS属性并不多,也就是 color 属性能用用,因此,潜力一般般,完全没有 ::before::after 这两个伪元素支持动画和过渡来得给力。

然后Firefox浏览器虽然很早就支持了 ::marker 伪元素,但是 ::marker 支持动画是80这个版本才开始支持的,刚支持没多久,还很热乎。

使用示意:

.marker {
  display: list-item;
}
.marker::marker {
  transition: color .2s;
  content: '?';
}
.marker:hover::marker {
  color: deepskyblue;
}

效果参见下面的GIF录屏:

//zxx: 如果你看到这段文字,说明你现在访问是体验糟糕的垃圾盗版网站,你可以访问原文获得很好的体验:https://www.zhangxinxu.com/wordpress/?p=9849(作者张鑫旭)

三、::before/::after中使用::marker

我在 CSS Pseudo-Elements Module Level 4规范 中找到这么一句话:

The ::before::marker or ::after::marker selectors are valid and can be used to represent the marker boxes of ::before or ::after pseudo-elements that happen to be list items. However ::marker::marker is invalid, and the computed value of display on ::marker loses its list-item aspect.

意思是 ::before::marker::after::marker 选择器都是合法的,只需要 ::before::after 是列表项,也就是 display 计算值是 list-item

我勒个擦,这要是支持了可就牛逼大了, content 嵌套啊,可以做的事情那就多了呀,相当于任意元素的前后又多了一层伪元素,理论上,一层标签里面呈现的文字可以有5种不同的颜色,于是我火速整了个demo看看效果如何,究竟支不支持。

您可以狠狠地点击这里: ::before/::after中使用::marker伪元素demo

测试代码如下:

<div class="target">一个标签5种颜色</div>
.target::before {
    content: '左边符号颜色是?';
    display: list-item;
    list-style-position: inside;
    color: deepskyblue;
}
.target::before::marker {
    color: red;
}
.target::after {
    content: '右边符号颜色是?';
    display: list-item;
    list-style-position: inside;
    color: olive;
}
.target::before::marker {
    content: '橙色';
    color: orange;
    direction: rtl;
}

结果页面刷新一看……失望,只有3种颜色!

DOM中有 ::marker 元素标记,但是没有任何匹配,连浏览器默认的样式都没有匹配。

这妥妥的欺骗纯情少年的感情啊!

明明规范说支持的,结果就像凌晨3点的菜市场——什么也没有!而且没有一个浏览器支持。

想起了一句诗,“王师北定中原日,家祭无忘告乃翁”,唉,什么时候上面的demo页面变成5种颜色了,大家记得知会我一声,我撒个花庆祝一下。

四、兼容性

目前,所有现代浏览器均已经支持了 ::marker 伪元素( 实时兼容性 ),Chrome浏览器也是最近几个月才支持的,很新鲜很热乎。

终于有办法可以让项目列表的符号的颜色和正文颜色不一样咯,用起来,渐进增强,不要担心浏览器不支持。

本文为原创文章,欢迎分享,勿全文转载,如果实在喜欢,可收藏,永不过期,且会及时更新知识点及修正错误,阅读体验也更好。

本文地址: https://www.zhangxinxu.com/wordpress/?p=9849


者:sunshine小小倩

转发链接:https://juejin.im/post/592d4a5b0ce463006b43b6da

一篇:Java 0基础入门(初识Html)

1.文本相关标签--标题标签

<h#></h#>:一般用来创建各级不同的标题,其中#的值可以为1-6中的值

代码<h1>Hello Java</h1>
<h2>Hello Java</h2>
<h3>Hello Java</h3>
<h4>Hello Java</h4>
<h5>Hello Java</h5>
<h6>Hello Java</h6>
<h7>Hello Java</h7>

代码请放在body中,然后再运行。

还不清楚Html结构的,请看上一篇文章。

运行结果如下:


标题标签运行结果

字体大小随着#值变大而变小

h标签会自动换行

当#的值超过6以后,就直接显示成了普通文本。

2.文本相关标签--特殊符号

空格

小于(<) <

大于(>) >

版权号(? ) ?

注册符(?) ?

3.文本相关标签--行的控制

段落标签<p>xxx</p>

相当于在页面中预留了一行空行,xxx是你在这个空行中填写的内容

换行标签<br>

ps:注意标签分为成对出现的和自闭合标签,书写时要注意规范

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		
		<p>
			<h1>是一级标题
		</p>
		<p>
			<h2>是二级标题
		</p>
		<h3>是三级标题
		<br>
		<h4>是四级标题
		
	</body>
</html>

3.图像标签

基本用法:

<img src="img1.jpg" width="100px" height="200px" alt=”” title=””/>

src--图片的路径(相对路径的写法../)

width--图片显示时的宽度(不一定是实际),像素为单位,px可以不写

height--图片显示时的高度(不一定是实际),像素为单位,px可以不写

alt,title--鼠标放在图片上显示的文字,几乎每个标签都可以加这两个属性,图片不存在时,图片位置显示设定的文字

<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>

	<body>
		<!--
    		src属性:当前图片的路径
    		路径:
    		(1)绝对路径:一个完整的路径,从ip开始到文件名结束
    		(2)相对路径:要引用的图片资源相对于当前页面的路径
    		
    		width属性:显示的宽度
    		heigth属性:显示的高度
    		1.如果只给定宽度或高度,那么另外一个高度或宽度的值
    		会根据原图的宽高比进行自动计算
    		2.如果同时给定了宽度和高度,并且不符合原图的比例,
    		那么就会失真

    	-->
    	<!--绝对路径-->
		<img src="http://zt.tgbus.com/ff15coming/assets/images/bg_02.jpg" width="500px"/>
		<!--相对路径,图片和文件在同一目录下-->
		<img src="001.jpg" height="300px"/>
		<!--相对路径,图片所在的目录和页面同一级-->
		<img src="img/002.jpg" width="100px" height="500px"/>
		
		
		<!--
			alt/title:
			(1)鼠标放在对应图片上时能够显示出对应的说明性文字
			(2)当图片不存在时,会在原来显示图片的地方加上说明性文字
			(3)alt/title在不同浏览器中可能有兼容性问题,所以一起写,作用是一样的
			(4)后面学习的标签中都可以加上这两个属性,来作为鼠标放上去时的说明
		-->
		<img src="img/002.jpg" alt="图片002" title="图片002"/>
		<img src="img1111/002.jpg" alt="图片002" title="图片002"/>
	</body>

</html>

4.文字布局--内容分隔标签

用于在页面上绘制水平线

<hr size="5" color="red" width="300" align="left">

<hr size="10" color="black" width="200">

<hr size="5" color="#0000FF" width="50%" align="right">

size--线的厚度

color--线的颜色,颜色的写法支持多种形式

width--线的宽度

align--对齐方式(尽可能使用后面学习的CSS样式来对齐)

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		第一行
		<!--分隔标签-->
		<hr/>
		第二行
		
		<!--
			size:线的厚度
			color:线的颜色
			align:对齐方式 left right
			width:线的宽度(像素,相对于外部元素宽度的百分比)
		-->
		<hr size="5" color="red" width="300" align="left"/>
		<hr size="5" color="#FF1493" width="30%" align="right"/>
		<hr color="#D84D2A" />
	</body>
</html>

5.文字布局--项目列表和编号(有序列表)

<ol type="1">

<li>填写信息</li>

<li>收电子邮件</li>

<li>注册成功</li>

</ol>

type值:(改变序号类型)

1:效果1,2,3,4……

a:效果a,b,c,d

A:效果A,B,C,D

i:效果i,ii,iii,iv,v

I:效果I,II,III,IV,V

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<!--
			type属性:
				1  阿拉伯数字作为序号
				a 小写字母作为序号
				A 大写字母作为序号
				i 罗马数字的小写形式
				I 罗马数字的大写形式
		-->
		<ol type="I">
			<li>第一项</li>
			<li>第二项</li>
			<li>第三项</li>
			<li>第四项</li>
			<li>第五项</li>
			<li>第六项</li>
		</ol>
	</body>
</html>

6.文字布局--项目列表和编号(无序列表)

<ul type="circle">

<li>如何激活会员名?</li>

<li>如何注册淘宝会员?</li>

<li>注册时密码设置有什么要求?</li>

<li>支付宝认证</li>

</ul>

type值:

disc:效果——实心黑色小圆点

square:效果——实心黑色小方块

circle:效果——空心小圆点

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<!--
			type属性取值:
				circle:空心圈
				disc:实心圆
				square:正方形
		-->
		<ul type="circle">
			<li>第一项</li>
			<li>第二项</li>
			<li>第三项</li>
			<li>第四项</li>
			<li>第五项</li>
			<li>第六项</li>
		</ul>
	</body>
</html>

7.预格式文本标签

pre:pre 元素可定义预格式化的文本。被包围在 pre 元素中的文本通常会保留空格和换行符。而文本也会呈现为等宽字体。

<pre> 标签的一个常见应用就是用来表示计算机的源代码

8.页面链接

<a> 标签定义超链接,用于从一个页面链接到另一个页面。最重要的是href属性,用于指定要跳转的页面的路径。

相对路径:指定从根目录到文件的完整路径。

绝对路径:指定相对于当前文件的文件位置。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<!--
        	<a></a>:页面链接
        	如果没有给定href属性,那么a标签之间的内容以普通文本方式显示
        	href:用来指定当前链接要跳转的路径
        	路径可以是相对路径也可以是绝对路径
     
        -->
		<a href="http://www.baidu.com" >百度</a>
		<a href="图像标签.html">图像标签</a>
		
		<!--图片链接-->
		<a href="http://zt.tgbus.com/ff15coming/">
			<img src="http://zt.tgbus.com/ff15coming/assets/images/bg_02.jpg" width="500px"/>
		</a>
		
		<!--
			阻止链接的跳转行为
		-->
		<a href="#">淘宝</a>
		<!--了解-->
		<a href="javascript:void(0);">京东</a>
	</body>
</html>

使用a标签制作锚点,实现跳转到页面指定位置

(1)本页跳转(页面很长,内容很多,点击a标签内容,迅速定位到你要找的内容)

<!--定义a标签,跳转到指定锚点-->

<a href="#helpme">[新人上路]</a>

<!--定义一个锚点,给定name属性-->

<a name="helpme">新人上路指南</a>

(2)其它页跳转(定位到1.html这种不是本页面的,a标签name值为t2的内容处)

<a href="1.html#t2">[新人上路]</a>

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<!--
			1.定义要进行点击的链接
		-->
		<a href="#position1">位置1</a>
		<a href="#position2">位置2</a>
		<a href="#position3">位置3</a>
		<!--
			2.要跳转的位置
		-->	
		<br><br><br><br><br><br><br><br><br><br><br><br><br>
		<br><br><br><br><br><br><br><br><br><br><br><br><br>
		<a name="position1">位置1</a>
		<br><br><br><br><br><br><br><br><br><br><br><br><br>
		<br><br><br><br><br><br><br><br><br><br><br><br><br>
		<a name="position2">位置2</a>
		<br><br><br><br><br><br><br><br><br><br><br><br><br>
		<br><br><br><br><br><br><br><br><br><br><br><br><br>
		<p id="position3">位置3</p>
		<br><br><br><br><br><br><br><br><br><br><br><br><br>
		<br><br><br><br><br><br><br><br><br><br><br><br><br>
	</body>
</html>

使用a标签打开电子邮件发送窗口

这个方法是调用outlook客户端,现在已经很少用了!

在href前面加上mailto前缀,后面跟合法的邮箱地址

<a href="mailto:429661318@qq.com">

发送邮件

</a>

指定超链接在何处打开目标 URL

在href属性存在的情况下,指定target属性

_blank:在空白页打开

_self:直接在本页打开

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<!--
			target属性:指定页面的打开的地方
				_self:在当前页打开
				_blank:在空白页打开
		-->
		<a href="http://www.baidu.com" target="_self">在当前页打开</a>
		<a href="http://www.baidu.com" target="_blank">在空白页打开</a>
	</body>
</html>

标签的学习就到这,下一篇会介绍表单、表单元素的写法。喜欢的可以关注下,谢谢!!

下一篇:Java 0基础入门 (Html表单、表单元素)