04_伪类和伪元素的区别?聊一下css选择器的优先级

一、伪类

1、定义

The pseudo-class concept is introduced to permit selection based on information that lies outside of the document tree or that cannot be expressed using the other simple selectors.

伪类存在的意义是为了通过选择器,格式化DOM树以外的信息以及不能被常规CSS选择器获取到的信息。

2、要点

  • 格式化DOM树以外的信息。比如: <a> 标签的:link:visited 等。这些信息不存在于DOM树中。
  • 不能被常规CSS选择器获取到的信息。比如:要获取第一个子元素,我们无法用常规的CSS选择器获取,但可以通过 :first-child 来获取到。

二、伪元素

1、定义

Pseudo-elements create abstractions about the document tree beyond those specified by the document language. For instance, document languages do not offer mechanisms to access the first letter or first line of an element's content. Pseudo-elements allow authors to refer to this otherwise inaccessible information. Pseudo-elements may also provide authors a way to refer to content that does not exist in the source document (e.g., the ::before and ::after pseudo-elements give access to generated content).

伪元素可以创建一些文档语言无法创建的虚拟元素。比如:文档语言没有一种机制可以描述元素内容的第一个字母或第一行,但伪元素可以做到(::first-letter::first-line)。同时,伪元素还可以创建源文档不存在的内容,比如使用 ::before::after

2、常见的伪元素选择器

  • ::first-letter 选择元素文本的第一个字(母)
  • ::first-line 选择元素文本的第一行
  • ::before 在元素内容的最前面添加新内容
  • ::after 在元素内容的最后面添加新内容
  • ::selection匹配被用户选中或者处于高亮状态的部分
  • ::placeholder匹配占位符的文本,只有元素设置了 placeholder 属性时,该伪元素才能生效

三、伪类和伪元素的区别

1、伪类是为了弥补CSS选择器的不足,用来更方便地获取信息

<ul>
    <li>test1</li>
    <li>test2</li>
</ul> 

li:first-child {
    color: #f00;
}

// 选择器不能直接选取第一个子元素
// 伪类弥补了选择器的不足

2、伪元素本质上是创建了一个虚拟容器(元素),我们可以在其中添加内容或样式

.first-letter {
  color: #f00;
}

<p>
    <span class="first-letter">H</span>ello, World
</p>

上面的代码其实就是:

p::first-letter {
  color: #f00;
}

除了上面这个本质区别以外,在CSS3中,伪类用单冒号:表示;而伪元素用双冒号::表示。

四、伪类和伪元素的主要用法

1、伪类

(1):first-child 匹配第一个子元素

li:first-child {
  color: #f00;
}

<ul>
    <li>test1</li>
    <li>test2</li>
</ul>    

(2):last-child 匹配最后一个子元素

<ul>
    <li>test1</li>
    <li>test2</li>
    <li>test3</li>
</ul>

li:last-child {
  color: #f00; 
}

(3):first-of-type 匹配属于其父元素的第一个特定类型的子元素

p:first-of-type {
  color: #f00;  
}

<div>
    <h1>h1文本</h1>
    <p>p文本</p>
</div>

(4)last-of-type 匹配属于其父元素的最后一个特定类型的子元素

h1:last-of-type {
  color: #f00;
}

<div>
    <h1>h1文本</h1>
    <h1>h1文本2</h1>
    <p>p文本</p>
</div>

2、伪元素

(1)::before 在被选元素之前插入内容;::after 在被选元素之后插入内容

清除浮动
.clearAll::after {
    content: '';
    display: block;
    height: 0;
    clear: both;
    visibility: hidden;
}
.clearAll {
    zoom : 1;
}
画分割线
* {
    padding: 0;
    margin: 0;
}
.spliter::before, 
.spliter::after {
    content: '';
    display: inline-block;
    border-top: 1px solid black;
    width: 200px;
    margin: 5px;
}
</style>
</head>
<body>
  <p class="spliter">分割线</p>
</body>
计数器

使用CSS实现计数器,用到的属性有:

  • counter-reset: 属性设置某个选择器出现次数的计数器的值。默认为 0
  • counter-increment: 属性设置某个选取器每次出现的计数器增量。默认增量是 1
  • content: 插入生成内容
.chooses {
  counter-reset: letters;
}
.chooses input:checked {
  counter-increment: letters;
}

.choose span::after {
  content: counter(letters);
}

<div class="chooses">
    <input type="checkbox">a
    <input type="checkbox">b
    <input type="checkbox">c
    <input type="checkbox">d
    <input type="checkbox">e
    <input type="checkbox">f
    <input type="checkbox">g
    <input type="checkbox">h
    <input type="checkbox">i
    <input type="checkbox">j
</div>
<p class="choose">我选择了<span></span>个字母</p>

(2)::first-letter 匹配元素中文本的首字母

::first-letter巧妙控制羊角符号
.price {
    display: inline-block;
    color: #FF5802;
}
.price:first-letter {
    margin-right: 5px;
    font-size: xx-large;
    vertical-align: -2px;
}

原价:<span class="price">¥399</span>
::before伪元素与::first-letter伪元素共用一个选择器
p:before {
    content: '验证:';
}
p:first-letter {
    color: #f00;
}

<p>一个选择器可以同时使用多个伪元素</p>

五、css优先级

1、不同级别

  • 属性后面使用 !important 会覆盖页面内任何位置定义的元素样式
  • 作为style属性写在元素内的样式
  • id选择器
  • 类选择器
  • 标签选择器
  • 通配符选择器
  • 浏览器自定义或继承

总结排序:!important > 行内样式>ID选择器 > 类选择器 > 标签 > 通配符 > 继承 > 浏览器默认属性

2、同一级别

同一级别中后写的会覆盖先写的样式

3、优先级算法(多个级别的组合)

  • !important 优先级最高
  • 行内样式的权值为 1000
  • ID 选择器的权值为 100
  • 类选择器、属性选择器、伪类选择器的权值为 10
  • 元素选择器、关系选择器、伪元素选择器的权值为 1
  • 通配符选择器的权重为 0
div.test {
    background-color:#00f;
    width:100px;
    height: 100px;
}

.test.test2 {
    background-color:#f00;
    width:100px;
    height: 100px;
}

<div class="test test2"></div>

根据优先级算法中的规则对应做加法,比较权值,如果权值相同那就后面的覆盖前面的,如果不同,权值大的覆盖权值小的。div.test 的权值是1+10=11,而 .test.test2 的权值是10+10=20,所以div会应用 .test.test2 变成红色

要点:

  • !important的优先级是最高的,但出现冲突时则需比较”四位数“
  • 优先级相同时,则采用就近原则,选择最后出现的样式
  • 继承得来的属性,其优先级最低

!important > 行内样式>ID选择器 > 类选择器 > 标签 > 通配符 > 继承 > 浏览器默认属性

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容