CSS - 选择器

介绍

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

通过 CSS - 基础篇我们知道了什么是选择器,但是选择器 实际上是有很多种的,不同情况下,使用不同的选择器,接下来我们就看看有多少种选择器吧。

CSS选择器

常用的选择器类型:

  • 类型选择器|元素选择器 | 标签选择器
  • 通配选择器
  • ID选择器
  • Class选择器 | 类选择器
  • 属性选择器
  • 伪类选择器
  • 伪元素选择器
  • 后代选择器
  • 子代选择器
  • 相邻兄弟选择器
  • 通用兄弟选择器

注意: 选择器是可以组合使用的!

选择器列表

如果你有多个使用相同样式的 CSS 选择器,那么这些单独的选择器可以被混编为一个“选择器列表”,这样,规则就可以应用到所有的单个选择器上了,如下:

h1 , h2 {
  color: blue;
}

 

1、 类型选择器|元素选择器 | 标签选择器

通过 node 节点名称 匹配元素。
因此,在单独使用时,寻找特定类型的元素时,元素选择器都会匹配该文档中所有此类型的元素。

示例:

.html
<h1>我是标题</h1>

.css
h1 {
  ...
}

h1 { } 就是类型选择器。直接通过HTML标签名称匹配。

2、通配选择器

在 CSS 中,一个星号 (*) 就是一个通配选择器。它可以匹配任意类型的 HTML 元素。
在配合其他简单选择器的时候,省略掉通配选择器会有同样的效果。比如,*.warning.warning 的效果完全相同。

在 CSS3 中,星号 (*) 可以和命名空间组合使用:

  • ns|* - 会匹配ns命名空间下的所有元素
  • *|* - 会匹配所有命名空间下的所有元素
  • |* - 会匹配所有没有命名空间的元素

不推荐使用通配选择器,因为它是性能最低的一个 CSS 选择器。

3、ID选择器

在一个 HTML 文档中,CSS ID 选择器会根据该元素的 ID 属性中的内容匹配元素,元素 ID 属性名必须与选择器中的 ID 属性名完全匹配,此条样式声明才会生效。

示例:

.html
<p id="p1">我是段落</p>

.css
#p1 {
  ...
}

#p1 { } 即使ID选择器。在HTML标签元素中,需要添加属性 id="...",需要用到#来匹配。

4、Class选择器 | 类选择器

在一个 HTML 文档中,CSS 类选择器会根据元素的类属性中的内容匹配元素。
类属性被定义为一个以空格分隔的列表项,在这组类名中,必须有一项与类选择器中的类名完全匹配,此条样式声明才会生效。

示例:

.html
<p class="p1">我是段落</p> 

.css
.p1 {
  ...
}

.p1{ } 就是Class选择器。在HTML标签元素中,需要添加属性 class="...",需要用到.来匹配。

5、标签属性选择器 | 属性选择器

CSS 属性选择器通过已经存在的属性名或属性值匹配元素。

语法:

  • [attr]:表示带有以 attr 命名的属性的元素。

  • [attr=value]:表示带有以 attr 命名的属性,且属性值为 value 的元素。

  • [attr~=value]:表示带有以 attr 命名的属性的元素,并且该属性是一个以空格作为分隔的值列表,其中至少有一个值为 value。

  • [attr|=value]:表示带有以 attr 命名的属性的元素,属性值为“value”或是以“value-”为前缀开头。典型的应用场景是用来匹配语言简写代码。(如 zh-CN,zh-TW 可以用 zh 作为 value)。("-"为连字符,Unicode 编码为 U+002D)。

  • [attr^=value]:表示带有以 attr 命名的属性,且属性值是以 "value"开头的元素。

  • [attr$=value]:表示带有以 attr 命名的属性,且属性值是以 "value"结尾的元素。

  • [attr*=value]:表示带有以 attr 命名的属性,且属性值至少包含一个 "value" 值的元素。

  • [attr operator value i]:在属性选择器的右方括号前添加一个用空格隔开的字母 i(或 I),可以在匹配属性值时忽略大小写(支持 ASCII 字符范围之内的字母)。

  • [attr operator value s]:在属性选择器的右方括号前添加一个用空格隔开的字母 s(或 S),可以在匹配属性值时区分大小写(支持 ASCII 字符范围之内的字母)。

示例:

.html
<a href="https://www.baidu.com" title="baidu">百度一下</a>
<a class="xxxlogo" href="https://www.XXX.com" title="xxx">百度一下</a>
  • 存在 title属性的<a> 元素
a[title] {
  color: purple;
}
  • 存在href 属性并且属性值匹配"https://www.baidu.com"<a> 元素
a[href="https://www.baidu.com"] {
  color: green;
}
  • 存在 href 属性并且属性值包含"XXX"的<a>元素
a[href*="XXX"] {
  font-size: 2em;
}
  • 存在 href 属性并且属性值结尾是".com"<a>元素
a[href$=".com"] {
  font-style: italic;
}
  • 存在 class 属性并且属性值包含以空格分隔的"logo"<a>元素
a[class~="logo"] {
  padding: 2px;
}
多语言属性

示例:

  • 将所有包含 lang 属性的 <div> 元素的字重设为 bold
div[lang] {
  font-weight: bold;
}
  • 将所有语言为美国英语的 <div> 元素的文本颜色设为蓝色
div[lang~="en-us"] {
  color: blue;
}
  • 将所有语言为葡萄牙语的 <div> 元素的文本颜色设为绿色
div[lang="pt"] {
  color: green;
}
  • 将所有语言为中文的 <div> 元素的文本颜色设为红色,无论是简体中文(zh-CN)还是繁体中文(zh-TW)
div[lang|="zh"] {
  color: red;
}
  • 将所有 data-lang 属性的值为 "zh-TW" 的 <div> 元素的文本颜色设为紫色
div[data-lang="zh-TW"] {
  color: purple;
}

备注:和 JS 不同,CSS 可以在不使用双引号的情况下直接使用带连字符的属性名

6、伪类选择器

CSS 伪类 是添加到选择器的关键字,指定要选择的元素的特殊状态。像导航历史(:visited)、内容状态(:checked)、鼠标位置(:hover)。

示例:

.html
<a href="https://www.baidu.com" title="baidu">百度一下</a>

.css
a:hover { 
  ...
}

a:hover{ } 就是伪类选择器。a:hover{ }意思表示 在鼠标指针悬浮到一个<a>标签上的时候,需要展示的样式。

标准伪类索引
  • :active : 匹配被用户激活的元素。

它让页面能在浏览器监测到激活时给出反馈。当用鼠标交互时,它代表的是用户按下按键和松开按键之间的时间。

一般被用在 <a><button>元素中。这个伪类的一些其他适用对象包括包含激活元素的元素,以及可以通过他们关联的<label>标签被激活的表格元素。

这个样式可能会被后声明的其他链接相关的伪类覆盖,这些伪类包括 :link:hover:visited。为保证样式生效,需要把 :active 的样式放在所有链接相关的样式之后。

这种链接伪类先后顺序被称为 LVHA 顺序:link:visited:hover:active

示例:

a:link { color: blue; }          /* 未访问链接 */
a:visited { color: purple; }     /* 已访问链接 */
a:hover { background: yellow; }  /* 用户鼠标悬停 */
a:active { color: red; }         /* 激活链接 */

p:active { background: #eee; }   /* 激活段落 */

form :active {
  color: red;
}
  • :hover:适用于用户使用指示设备虚指一个元素(没有激活它)的情况。

可以在任何伪元素上使用,遵循 LVHA 的先后顺序。

示例:
使用:hover 伪类可以创建复杂的层叠机制。一个常见用途,比如,创建一个纯 CSS 的下拉按钮(不使用 JavaScript)。

.css
div.menu-bar ul ul {
  display: none;
}
div.menu-bar li:hover > ul {
  display: block;
}

.html
<div class="menu-bar">
  <ul>
    <li><a href="example.html">Menu</a>
      <ul>
        <li><a href="example.html">Link</a></li>
        <li><a class="menu-nav" href="example.html">Submenu</a>
          <ul>
            <li><a class="menu-nav" href="example.html">Submenu</a>
              <ul>
                <li><a href="example.html">Link</a></li>
                <li><a href="example.html">Link</a></li>
                <li><a href="example.html">Link</a></li>
                <li><a href="example.html">Link</a></li>
              </ul>
            </li>
            <li><a href="example.html">Link</a></li>
          </ul>
        </li>
      </ul>
    </li>
  </ul>
</div>

代码解析:
在读懂这个示例之前,你要先熟悉 后代选择器 、子代选择器、以及CSS block属性。

备注: 在触摸屏上 :hover 有问题,基本不可用。不同的浏览器上:hover 伪类表现不同。
:focus伪类选择器常伴随在:hover伪类选择器左右,需要根据你想要实现的效果确定它们的顺序。

  • :link:用来选中元素当中的链接。

它将会选中所有 尚未访问 的链接,包括那些已经给定了其他伪类选择器的链接(例如:hover、..等)
遵循 LVHA 的先后顺序。

示例:

a:link {
  color: slategray;
}
  • :visited:表示用户已访问过的链接。

出于隐私原因,可以使用此选择器修改的样式非常有限。
遵循 LVHA 的先后顺序。

示例:

a:visited {
  color: green;
}

限制:出于隐私原因,浏览器严格限制您可以让此伪类应用的样式,以及使用它们的方式:https://developer.mozilla.org/zh-CN/docs/Web/CSS/:visited

  • :focus:表示获得焦点的元素(如表单输入)。

当用户点击或触摸元素或通过键盘的“tab”键选择它时会被触发。

示例:

input:focus {
  color: red;
}
  • :focus-visible:可以有效地根据用户的输入方式 (鼠标 vs 键盘) 展示不同形式的焦点。

当元素匹配:focus伪类并且客户端 (UA) 的启发式引擎决定焦点应当可见 (在这种情况下很多浏览器默认显示“焦点框”。) 时,:focus-visible伪类将生效。

.css
input, button {
  margin: 10px;
}
.focus-only:focus {
  outline: 2px solid black;
}
.focus-visible-only:focus-visible {
  outline: 4px dashed darkorange;
}

.html
<input value="Default styles"><br>
<button>Default styles</button><br>
<input class="focus-only" value=":focus only"><br>
<button class="focus-only">:focus only</button><br>
<input class="focus-visible-only" value=":focus-visible only"><br>
<button class="focus-visible-only">:focus-visible only</button>

键盘选中:

鼠标选中:

Firefox 通过较旧的前缀伪类 :-moz-focusring 支持类似的功能。

  • :focus-within
  • :any-link
  • :blank
  • :checked
  • :default
  • :defined
  • :dir(...)
  • :disabled
  • :drop:被舍弃了
  • :empty
  • :enabled
  • :first
  • :first-child
  • :first-of-type
  • :fullscreen
  • :has(...)
  • :host
  • :host(...)
  • :host-context
  • :indeteminate
  • :in-range
  • :invalid
  • :is(...)
  • :lang(...)
  • :last-child
  • :left
  • :local-link
  • :not(...)
  • :nth-child(...)
  • :nth-col(...)
  • :nth-last-child
  • :nth-last-col(...)
  • :nth-last-of-type(...)
  • :nth-of-type
  • :only-child
  • :only-of-type
  • :optional
  • :out-of-range
  • :past
  • :placeholder-shown
  • :read-only
  • :read-write
  • :required
  • :right
  • :root
  • :scope
  • :target
  • :target-within
  • :target-invalid
  • :user-invalid
  • :valid
  • :where

太多了,后期慢慢更新吧,自己有兴趣的可以去自己看 https://developer.mozilla.org/zh-CN/docs/Web/CSS/Pseudo-classes

7、伪元素选择器

伪元素 是一个附加至选择器末的关键词,允许你对被选择元素的特定部分修改样式。

实例:::first-line伪元素可改变段落首行文字的样式。

.csss
p::first-line{
  color: blue;
  text-transform: uppercase;
}

注意:

  • 一个选择器中只能使用一个伪元素。伪元素必须紧跟在语句中的简单选择器/基础选择器之后。

  • 按照规范,应该使用双冒号(::)而不是单个冒号(:),以便区分伪类和伪元素。
    但是,由于旧版本的 W3C 规范并未对此进行特别区分,因此目前绝大多数的浏览器都同时支持使用这两种方式来表示伪元素。

规范定义的伪元素
  • ::after (:after)
  • ::backdrop
  • ::before (:before)
  • ::cue
  • ::cue-region
  • ::first-letter (:first-letter)
  • ::first-line (:first-line)
  • ::file-selector-button
  • ::grammar-error
  • ::marker
  • ::part(...)
  • ::placeholder
  • ::selection
  • ::slotted()
  • ::spelling-error
    -::target-text

太多了,后期慢慢更新吧,自己有兴趣的可以去自己看 https://developer.mozilla.org/zh-CN/docs/Web/CSS/Pseudo-elements

8、后代选择器 (所有后代

官方: 后代组合器 通常用单个空格(" ")字符表示,组合了两个选择器
如果第二个选择器匹配的元素具有与第一个选择器匹配的祖先(父母,父母的父母,父母的父母的父母等)元素,则它们将被选择。利用后代组合器的选择器称为后代选择器。

就是 两个选择器 以空格相隔开 组成 后台选择器。使用条件如下:

  • 1、第二个选择器匹配的元素 必须是 第一个选择器匹配的元素子元素 | 子子...元素 ,这样样式才会生效。
  • 2、后代选择器匹配的元素样式 是显示在 所有的 第二个选择器匹配的元素 上的,无论在 DOM 中"跳跃" 多少次。

示例:

.css
div p{
    color: green;
    padding: 0px;
    margin: 0px;
}
.html
<div id="d1" class="d1">111111
    <p>222222</p>
    <p>333333
        <p>444444</p>
    </p>
    <div>555555
        <p>666666
            <p>777777</p>
        </p>
    </div>
</div>

效果:

 
 

9、子代选择器 (直接后代、 一级子元素)

当使用> 选择符分隔两个元素时,它只会匹配那些作为第一个元素的直接后代 (子元素) 的第二元素。

示例:

.css
span { background-color: white; }
div > span {
  background-color: DodgerBlue;
}
.html
<div>
  <span>Span 1. In the div.
    <span>Span 2. In the span that's in the div.</span>
  </span>
</div>
<span>Span 3. Not in a div at all</span>

效果:

 
 

10、相邻兄弟选择器

通过 + 介于两个选择器之间进行组合的选择器。
当第二个元素 紧跟在 第一个元素之后,并且两个元素都是属于同一个父元素的子元素,则第二个元素将被选中。

示例:

.css
p + p {
    color: red;
    padding: 0px;
    margin: 0px;
}
.html
<p>first</p>
<p>second</p>
<p>third
    <p>third-child</p>
    <p>third-child</p>
</p>
<h4>标题</h4>
<p>four</p>
<p>five</p>
<p>six</p>

效果:

如果中间插入其他的元素,会断掉的,但是会在后续的匹配元素继续按照规则进行样式的设置。

 
 

11、通用兄弟选择器

兄弟选择符~,位置无须紧邻,只须同层级,A~B 选择A元素之后所有同层级B元素。

示例:

.css
p ~ p {
    color: red;
    padding: 0px;
    margin: 0px;
}
.html
<p>first</p>
<p>second</p>
<p>third
    <p>third-child</p>
    <p>third-child</p>
</p>
<h4>标题</h4>
<p>four</p>
<p>five</p>
<p>six</p>

效果:

如果中间插入其他的元素,不会断掉。可与相邻兄弟选择器比较,进行观察。

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

推荐阅读更多精彩内容

  • 其实平时用得多的选择器无非也就是那么几个,时间久了,许多不常用的选择器就慢慢忘记了。为了不让自己忘记这些选择器,今...
    盛夏晚清风阅读 1,805评论 0 5
  • class 和 id 的使用场景? class 重在样式的复用,重普遍性。id重在划分样式区域,可以作为样式表中的...
    南山码农阅读 369评论 0 0
  • 1.class 和 id 的使用场景? 类选择器允许以一种独立于文档元素的方式来指定样式。该选择器可以单独使用,也...
    草鞋弟阅读 2,401评论 0 1
  • 1. class 和 id 的使用场景 ? class 规定元素的类名,用于概念上相似的元素,这些元素可以出现在同...
    饥人谷_Mily阅读 470评论 0 0
  • 发现很多选择器已经忘了叫啥了,借此看一下MDN的文档,本文只是抛砖引玉,记录下阅读过程中的一些新知识,或是当作以后...
    小遁哥阅读 236评论 0 0