CSS 选择器讲解以及优先级(带示例)

1. CSS 选择器

MDN CSS 专栏中将CSS基本选择器分为了五类,分别是:

除了这五类基本选择器外,常见的选择器还包括:

  • 伪类选择器: 元素特定状态, hover / active / focus, 注意 last-child / only-child 也属于伪类

  • 伪元素选择器: 元素的特定部分, before / after / placeholder

    Tips:

    1. 在 CSS 3.0 中一个冒号表示伪类 :hover 两个冒号表示 ::after 伪元素,但是 CSS 2.0 中伪元素和伪类都是一个冒号(按照规范伪元素应该用::,但为了保持兼容性,旧版本的 W3C 规范也适用,推荐都用一个冒号)
    2. 并不是所有的元素都可以直接加伪元素,比如 <a> 标签就不能直接使用 ::first-letter 的伪元素,因为 <a> 标签的默认 display: inline::first-letter 只能应用于块级元素。
  • 后代选择器: 空格,应用于符合条件的父元素下所有的匹配元素(子子孙孙), div p

  • 子代选择器: 大于号 >,仅应用于符合条件的父子关系的元素(子),div > p

  • 相邻兄弟选择器: 加号 +,匹配指定关系的紧邻兄弟元素,第二个元素被选定,h1 + h2 => 与 h1 相邻且具有共同父元素的 h2

    Tips:

    1. 相邻兄弟选择器是顺序敏感的,h1 + h2 必须 h1 标签在前,h2 标签在后;
    2. 所有的元素最终的父元素是 HTML body,直接在body下的元素互相也是兄弟元素,在选择器使用时需要注意影响面。
  • 通用兄弟选择器: 波浪号 ~,匹配指定关系的所有同层级兄弟元素,h1 ~ h2 => 与h1 具有共同父元素之后的所有同层级h2

    Tips

    1. 通用兄弟选择器同样需要顺序明确

注意:选择器都可以组合使用, 如 h1 + h2 + h3 将会匹配拥有同样父元素的 h1, h2, h3 中的 h3

2. SASS中的父选择器 &

CSS的嵌套是最常见的写法,在SASS中为了书写避免重复的父元素样式,引入了父选择器&,如SASS文件

a {
  color: red;
  &:after {
    content: ">"
  }
}

编译后

a {
  color: red;
}
a:after {
  content: ">";
}

TIPS

  1. 如果含有多层嵌套,最外层的父选择器会一层一层向下传递:
.container {
    color: red;
    &-button {
        background: yellow;
        &-icon {
            font-size: large;
        }
    }
}

编译后

.container {
  color: red;
}
.container-button {
  background: yellow;
}
.container-button-icon {
  font-size: large;
}
  1. 同一层级下的父选择器都是一样的:
.container {
    color: red;
    &-text {
        color: blue;
    }
    &-button &-disabled {
        background: yellow;
    }
}

编译后

.container {
  color: red;
}
.container-text {
  color: blue;
}
.container-button .container-disabled {
  background: yellow;
}
  1. 虽然叫父选择器,但他并不代表元素在HTML DOM的关系一定是父元素:
.container {
    color: red;

    .outer-container & {
        color: blue;
    }
}

编译后:

.container {
  color: red;
}
.outer-container .container { 
  color: blue;
}
  1. & 必须是选择器的第一个字符
.container {
    color: red;

    .outer-& & {
        color: blue;
    }
}

是无法编译的,但是可以写成:

.container {
    color: red;

    .&-outer & {
        color: blue;
    }
}

编译后成为:

.container {
  color: red;
}
.container-outer .container {
  color: blue;
}

虽然父选择器带来了便利,但是他也带来了一些麻烦:

  1. 元素类的命名可能存在大量重复
  2. 可能因为引用过多导致可阅读性较差
  3. 引用层级太深导致与DOM层级混乱

并不是用得越多越好,合理使用才是最佳。

3. 层叠与优先级

在HTML结构中元素之间肯定会存在层叠,但是我们其实并没有办法对于每个元素书写样式,所以CSS中存在样式的继承,具体可以看:MDN CSS 层叠与继承章节

本文主要针对层叠过后,多个样式选择器指向同一个元素的时候,CSS会采取如何的匹配原则

首先,明确排序依据标准:

有三个因素需要考虑,根据重要性排序如下,后面的更重要:

  1. 资源顺序: 资源加载的先后
  2. 优先级: 需要一个标准的权重比例
  3. 重要程度:是否是极其重要,甚至可以无视其他样式

CSS 标准的权重计算公式:

一个选择器的优先级可以说是由三个不同的值(或分量)相加,可以认为是百(ID)十(类)个(元素)——三位数的三个位数:

  • ID:选择器中包含 ID 选择器则百位得一分。
  • :选择器中包含类选择器、属性选择器或者伪类则十位得一分。
  • 元素:选择器中包含元素、伪元素选择器则个位得一分。

例子:

选择器 ID (百) 类(十) 元素(个) 优先级
h1 0 0 1 0-0-1
h1 + h2::before 0 0 3 0-0-3
#pwdContainer input 1 0 1 1-0-1
div .container a:hover 0 2 2 0-2-2
style="color: red" - - - 1-0-0-0
!important - - - TOP

Tips: 伪类和伪元素的优先级不同,大部分伪类为0-1-0,伪元素则为0-0-1

总结:

!important > 内联样式 > ID选择器 > 类选择器(属性选择器、伪类选择器)> 元素选择器(伪元素选择器)> 其他选择器

Tips:

  1. 通用选择器(*)、子选择器(>)和相邻同胞选择器(+)并不在这四个等级中,所以它们的权值都为 0 ;
  2. 样式表的来源不同时,优先级顺序为:内联样式 > 内部样式 > 外部样式 > 浏览器用户自定义样式 > 浏览器默认样式
  3. 继承得到的样式的优先级最低。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容