选择器—CSS学习笔记

115 阅读10分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情


前言

前面我们可能已经有了选择器的概念,知道它可以用来选择某个或某些html元素。本文将对选择器进行系统的讲解以便读者对于选择器有完整的认识。

选择器

什么是选择器?

CSS 选择器是 CSS 规则的第一部分。它是元素和其他部分组合起来告诉浏览器哪个 HTML 元素应当是被选为应用规则中的 CSS 属性值的方式。选择器所选择的元素,叫做“选择器的对象”。

选择器列表

既然可以使用单独的选择器,那么这些单独的选择器当然也可以可以被混编为一个“选择器列表”。例如h1,ph1 p,但要注意了当单个选择器无效时,组合的选择器也会失效,例如h1,..special(x)

选择器的种类

1.类型、类和ID选择器

此类选择器是最常用的最简单的选择器,接下来让我们来看看。

类型选择器

类型选择器也叫做标签选择器或者元素选择器,例如h1、p、span、div

h1{
   color:red;
}
全局选择器

全局选择器用*号表示,用来表示文档的所有内容。也可用于选择器列表中让选择器更易读,例如p :first-child(中间带空格)容易与p:first-child混淆,前者表示p后代的任何第一个子元素,而后者表示作为其他元素的第一子元素的p元素。

*{
    margin:0;
}
类选择器

类选择器以.起头,后面带一个类名。可以单独使用,也可指向特定元素,例如h1.special(其间不带空格)

h1.special{
   background-color: pink;
}
ID选择器

ID选择器以#起头,后面带一个id名。与类相似也可指向特定元素h1#special。但id选择器通常用来作为唯一的标识而使用,也就是只用一次不会改变,所以更通常我们会用类选择器。

h1#special{
  background-color: pink;
}

2.属性选择器

在编写html元素时我们知道元素可以带有属性,那么我们便可以凭借此来选择某些元素。下面我们通过一个列表来展示。

选择器示例描述
[*attr*]li[class]匹配带有一个名为class的属性的li元素。
[*attr*=*value*]li[class="special"]匹配带有一个名为class的属性的li元素,其值为special
[*attr*~=*value*]li[class~="special"]匹配带有一个名为class的属性的li元素,其值为special,或者匹配带有一个class属性的元素,其值有一个或者更多至少有一个和special匹配。例如<p class="a b c special">(注意,在一列中的好几个值,是用空格隔开的)。
[*attr*^=*value*]li[class^="box-"]匹配带有一个名为class的属性的元素,其值开头为*box-*子字符串。
[*attr*$=*value*]li[class$="-box"]匹配带有一个名为class的属性的元素,其值结尾为*-box*子字符串
*attr**=*value*]li[class*="box"]匹配带有一个名为class的属性的元素,其值的字符串中的任何地方,至少出现了一次box子字符串。

我们通过表格中的示例来实操一下

<ul>
    <li class="special">Item 1</li>
    <li class="a special">Item 2</li>
    <li class="bca">Item 3</li>
    <li class="bcabc">Item 4</li>
</ul>
li[class] {
    font-size: 20px;
}
​
li[class="special"] {
    background-color: yellow;
}
​
li[class~="special"] {
    color: red;
}
    li[class^="a"] {
    font-size: 30px;
}
​
li[class$="a"] {
    background-color: blue;
}
​
li[class*="a"] {
    color: green;
}

效果:

image.png

3.伪类与伪元素

什么是伪类?

类一般是对对象行为与方法的具体概括。伪类也类似,它用于特定状态下的元素,例如鼠标悬浮,链接访问等。

li:first-child选择了紧靠li的第一个子元素,first-child表示第一子元素的一种状态。与之相对的last-child就表示最后一个子元素。

用户行为伪类

当一个链接从点击到点击后时有好几种状态,例如

a:hover:鼠标悬浮于a上时

a:link:未访问链接时的状态

a:visited:访问链接后的状态

a:active:鼠标点击时的状态

什么是伪元素?

伪元素表现得像你往html文件中加入新的元素一样,通常以::+伪类名来表示。

备注: 一些早期的伪元素曾使用单冒号的语法,所以你可能会在代码或者示例中看到。现代的浏览器为了保持后向兼容,支持早期的带有单双冒号语法的伪元素。

下面是一些伪类与伪元素的参考

伪类
选择器描述
:active在用户激活(例如点击)元素的时候匹配。
:any-link匹配一个链接的:link:visited状态。
:blank匹配空输入值的``元素
:checked匹配处于选中状态的单选或者复选框。
:current (en-US)匹配正在展示的元素,或者其上级元素。
:default匹配一组相似的元素中默认的一个或者更多的 UI 元素。
:dir基于其方向性(HTMLdir属性或者 CSSdirection属性的值)匹配一个元素。
:disabled匹配处于关闭状态的用户界面元素
:empty匹配除了可能存在的空格外,没有子元素的元素。
:enabled匹配处于开启状态的用户界面元素。
:first匹配分页媒体的第一页。
:first-child匹配兄弟元素中的第一个元素。
:first-of-type匹配兄弟元素中第一个某种类型的元素。
:focus当一个元素有焦点的时候匹配。
:focus-visible当元素有焦点,且焦点对用户可见的时候匹配。
:focus-within匹配有焦点的元素,以及子代元素有焦点的元素。
:future (en-US)匹配当前元素之后的元素。
:hover当用户悬浮到一个元素之上的时候匹配。
:indeterminate匹配未定态值的 UI 元素,通常为复选框
:in-range用一个区间匹配元素,当值处于区间之内时匹配。
:invalid匹配诸如<input>的位于不可用状态的元素。
:lang基于语言(HTMLlang属性的值)匹配元素。
:last-child匹配兄弟元素中最末的那个元素。
:last-of-type匹配兄弟元素中最后一个某种类型的元素。
:left分页媒体 (en-US)中,匹配左手边的页。
:link匹配未曾访问的链接。
:local-link (en-US)匹配指向和当前文档同一网站页面的链接。
:is()匹配传入的选择器列表中的任何选择器。
:not匹配作为值传入自身的选择器未匹配的物件。
:nth-child匹配一列兄弟元素中的元素——兄弟元素按照an+b形式的式子进行匹配(比如 2n+1 匹配元素 1、3、5、7 等。即所有的奇数个)。
:nth-of-type匹配某种类型的一列兄弟元素(比如,<p>元素)——兄弟元素按照an+b形式的式子进行匹配(比如 2n+1 匹配元素 1、3、5、7 等。即所有的奇数个)。
:nth-last-child匹配一列兄弟元素,从后往前倒数。兄弟元素按照an+b形式的式子进行匹配(比如 2n+1 匹配按照顺序来的最后一个元素,然后往前两个,再往前两个,诸如此类。从后往前数的所有奇数个)。
:nth-last-of-type匹配某种类型的一列兄弟元素(比如,<p>元素),从后往前倒数。兄弟元素按照an+b形式的式子进行匹配(比如 2n+1 匹配按照顺序来的最后一个元素,然后往前两个,再往前两个,诸如此类。从后往前数的所有奇数个)。
:only-child匹配没有兄弟元素的元素。
:only-of-type匹配兄弟元素中某类型仅有的元素。
:optional匹配不是必填的 form 元素。
:out-of-range按区间匹配元素,当值不在区间内的的时候匹配。
:past (en-US)匹配当前元素之前的元素。
:placeholder-shown匹配显示占位文字的 input 元素。
:playing (en-US)匹配代表音频、视频或者相似的能“播放”或者“暂停”的资源的,且正在“播放”的元素。
:paused (en-US)匹配代表音频、视频或者相似的能“播放”或者“暂停”的资源的,且正在“暂停”的元素。
:read-only匹配用户不可更改的元素。
:read-write匹配用户可更改的元素。
:required匹配必填的 form 元素。
:right分页媒体 (en-US)中,匹配右手边的页。
:root匹配文档的根元素。
:scope匹配任何为参考点元素的的元素。
:valid匹配诸如<input>元素的处于可用状态的元素。
:target匹配当前 URL 目标的元素(例如如果它有一个匹配当前URL 分段的元素)。
:visited匹配已访问链接。
伪元素
选择器描述
::after匹配出现在原有元素的实际内容之后的一个可样式化元素。
::before匹配出现在原有元素的实际内容之前的一个可样式化元素。
::first-letter匹配元素的第一个字母。
::first-line匹配包含此伪元素的元素的第一行。
::grammar-error匹配文档中包含了浏览器标记的语法错误的那部分。
::selection匹配文档中被选择的那部分。
::spelling-error匹配文档中包含了浏览器标记的拼写错误的那部分。

4.关系选择器

什么是关系选择器?

通过关系符,我们可以将前后两种元素建立联系,通过这样建立的选择器叫做关系选择器。

后代选择器

通过``空格来组合选择器。例如A B表示的关系是选择所有以A选择器为祖先(父亲、父亲的父亲等等..)的B选择器。我们通过一个简单的小例子来说明。

<p>
    <em>aaaa</em>
    bbbb
    <em>aaaaa</em>
</p>
<p>
    <em>ccccc</em>
    <span>dddd <em>eeee</em> dddd</span>
</p>
p em {
    color: red;
}

结果是p元素里的所有em都被选择到了

子代关系选择器

通过 >来组合选择器。例如A>B表示的关系是选择所有以A选择器为父亲的B选择器。

邻接兄弟选择器

通过 +来组合选择器。例如 A+B表示的关系是选择所有紧随A选择器之后的B选择器。

通用兄弟选择器

通过 ~来组合选择器。例如 A~B表示的关系是选择所有A选择器之后的同级B选择器

选择器的权重

从上面我们已知道了有哪些选择器,但有时候他们组合成一个选择器列表时我们会不知道哪个优先,这个时候就需要引入一个权重的概念以此计算选择器的优先级。

  • 第一等:代表内联样式,如: style=””,权值为1000。
  • 第二等:代表ID选择器,如:#content,权值为0100。
  • 第三等:代表类,伪类和属性选择器,如.content,权值为0010。
  • 第四等:代表类型选择器和伪元素选择器,如div p,权值为0001。
  • 通配符、子选择器、相邻选择器等的。如*、>、+,权值为0000。
  • 继承的样式没有权值。

比较优先级时,需要将所有的选择器的优先级进行相加计算,最后优先级越高,则越优先显示

例如div #span>.class>.class1有1个ID选择器,2个类选择器,一个类型选择器,他的权重就是0121。

当权重相同时则越后面优先级越高

总结

以上就是所有关于CSS选择器的内容了,下面我们将会针对CSS的盒模型进行讲解。