搜索
首页web前端css教程CSS3中的关系和属性选择器

Relational and Attribute Selectors in CSS3

以下摘录自 Alexis Goldstein、Louis Lazaris 和 Estelle Weyl 合着的书籍《HTML5 & CSS3 for the Real World, 2nd Edition》。本书在全球各地的商店有售,您也可以在此处购买电子书版本。

核心要点

  • CSS3 选择器允许对网页上的元素进行精确定位,扩展了先前 CSS 版本的功能。关系选择器和属性选择器是 CSS3 的关键特性。
  • 关系选择器根据元素在标记中的相互关系来定位元素。这些包括后代组合器 (E F)、子组合器 (E > F)、相邻兄弟选择器或下一个兄弟选择器 (E F) 和通用兄弟选择器或后续兄弟选择器 (E ~ F)。
  • CSS3 中的属性选择器允许根据元素的属性进行匹配,CSS3 通过允许模式匹配来扩展 CSS2 的属性选择器。这些包括E[attr]、E[attr=val]、E[attr|=val]、E[attr~=val]、E[attr^=val]、E[attr$=val] 和E[attr* =val]。
  • 所有现代浏览器都支持 CSS3 选择器,包括 IE9 及更高版本。使用这些选择器可以大大提高网页设计和开发的效率和有效性。

CSS3 选择器

CSS 选择器是 CSS 的核心。如果没有选择器来定位页面上的元素,修改元素 CSS 属性的唯一方法是使用元素的 style 属性并内联声明样式,这既笨拙又难以维护。因此我们使用选择器。最初,CSS 允许按类型、类和/或 ID 匹配元素。这需要向我们的标记中添加类和 ID 属性来创建挂钩,并区分相同类型的元素。 CSS2.1 添加了伪元素、伪类和组合器。使用 CSS3,我们可以使用各种选择器来定位页面上的几乎任何元素。

在下面的描述中,我们将包含早期 CSS 版本中提供给我们的选择器。之所以包含它们,是因为虽然我们可以使用 CSS3 选择器,但早于 CSS3 的选择器也是 CSS 选择器级别 3 规范的一部分,并且仍然受支持,因为 CSS 选择器级别 3 扩展了它们。即使对于那些已经存在相当一段时间的选择器,也值得在这里回顾一下,因为旧规范中有一些鲜为人知的隐藏的宝石。请注意,所有现代浏览器(包括 IE9 及更高版本)都支持所有 CSS3 选择器。

关系选择器

关系选择器根据元素在标记中的相互关系来定位元素。所有这些都从 IE7 开始支持,并且在所有其他主要浏览器中都支持:

后代组合器 (E F)

您一定应该熟悉这个。后代选择器定位任何作为元素 E 的后代(子元素、孙元素、曾孙元素等)的元素 F。例如,ol li 定位位于有序列表内的 li 元素。这将包括嵌套在 ol 中的 ul 中的 li 元素,这可能不是您想要的。

子组合器 (E > F)

此选择器匹配任何作为元素 E 的直接子元素的元素 F——任何进一步嵌套的元素都将被忽略。继续上面的例子,ol > li 只会定位直接位于 ol 内的 li 元素,并将忽略嵌套在 ul 内的那些元素。

相邻兄弟选择器或下一个兄弟选择器 (E F)

这将匹配任何与 E 共享相同父元素的元素 F,并且在标记中直接位于 E 之后。例如,li li 将定位给定容器中的所有 li 元素,除了第一个 li 元素。

通用兄弟选择器或后续兄弟选择器 (E ~ F)

这个有点棘手。它将匹配任何与任何 E 共享相同父元素并在标记中位于其之后的元素 F。因此,h1 ~ h2 将匹配任何位于 h1 之后的 h2,只要它们都共享相同的直接父元素——也就是说,只要 h2 没有嵌套在任何其他元素中。

让我们来看一个简单的例子:

<header>
  <h1 id="Main-title">Main title</h1>
  <h2 id="This-subtitle-is-matched">This subtitle is matched</h2>
</header>
<article>
  <p>blah, blah, blah …</p>
  <h2 id="This-is-not-matched-by-h-h-but-is-by-header-h">This is not matched by h1 ~ h2, but is by header ~ h2</h2>
  <p>blah, blah, blah …</p>
</article>

选择器字符串 h1 ~ h2 将匹配第一个 h2,因为 h1 和 h2 都是 header 的子元素或直接后代。您将在代码片段中看到的下一个 h2 不匹配,因为它的父元素是 article,而不是 header。但是,它将匹配 header ~ h2。类似地,h2 ~ p 只匹配最后一个段落,因为第一个段落位于它与父元素 article 共享的 h2 之前。

注意:为什么没有“父”选择器?

您会注意到,到目前为止,还没有“父”或“祖先”选择器,也没有“前置兄弟”选择器。浏览器必须向后遍历 DOM 树或在决定是否应用样式之前递归到嵌套元素集的性能,阻止了拥有原生“向上遍历 DOM 树”选择器的能力。

jQuery 包含 :has() 作为祖先选择器。此选择器正在考虑用于 CSS 选择器级别 4,但尚未在任何浏览器中实现。如果并当它被实现时,我们将能够使用 E:has(F) 来查找具有 F 作为后代的 E,E:has(> F) 来查找具有 F 作为直接子元素的 E,E:has( F) 来查找直接位于兄弟 F 之前的 E,以及类似的。

浏览《The HTML5 Herald》的样式表,您会看到我们在许多地方使用了这些选择器。例如,在确定站点的整体布局时,我们希望三个列的 div 向左浮动。为了避免将此样式应用于嵌套在其内部的任何其他 div,我们使用子选择器:

main > div {
  float: left;
  overflow: hidden;
}

随着我们在接下来的几章中向站点添加新样式,您将看到许多此类选择器类型。

属性选择器

CSS2 引入了几个属性选择器。这些允许根据元素的属性进行匹配。CSS3 扩展了这些属性选择器,允许基于模式匹配进行一些定位。CSS 选择器级别 4 添加了一些更多内容:

E[attr] 匹配任何具有属性 attr 的元素 E,而不管属性的值如何。我们在第 4 章中使用了它来设置必需输入的样式;input:required 在最新的浏览器中有效,但 input[required] 也具有相同的效果,并且在 IE7 和 IE8 中也有效。

E[attr=val] 匹配任何具有属性 attr 且其值为 val 的元素 E。虽然不是新的,但在定位表单输入类型时它很有用;例如,使用 input[type=checkbox] 定位复选框。

E[attr|=val] 匹配任何其属性 attr 的值为 val 或以 val- 开头的元素 E。这最常用于 lang 属性。例如,p[lang|="en"] 将匹配任何被定义为英语的段落,无论是英国英语还是美国英语,使用

E[attr~=val] 匹配任何其属性 attr 的值中包含完整单词 val(由空格包围)的元素 E。例如,.info[title~=more] 将匹配任何具有类 info 且标题属性包含单词“more”的元素,例如“单击此处了解更多信息”。

E[attr^=val] 匹配任何其属性 attr 以值 val 开头的元素 E。换句话说,val 与属性值的开头匹配。

E[attr$=val] 匹配任何其属性 attr 以 val 结尾的元素 E。换句话说,val 与属性值的结尾匹配。

E[attr=val] 匹配任何其属性 attr 在任何位置与 val 匹配的元素 E。它类似于 E[attr~=val],只是 val 可以是单词的一部分。使用与之前相同的示例,.fakelink[title=info] {} 将匹配任何具有类 fakelink 且标题属性包含字符串 info 的元素,例如“单击此处了解更多信息”。

在这些属性选择器中,对于 HTML 中区分大小写的 value,val 的值区分大小写。例如,input[class^="btn"] 区分大小写,因为类名区分大小写,但 input[type="checkbox"] 不区分大小写,因为 type 值在 HTML 中不区分大小写。

如果值是字母数字的,则不必引用值,但有一些例外。空字符串、以数字开头的字符串、两个连字符和其他一些特殊情况需要用引号括起来。由于存在例外情况,因此养成始终为需要引号的情况包含引号的习惯是一个好主意。

在 CSS 选择器级别 4 中,我们可以通过在结束括号之前包含一个 i 来实现不区分大小写,E[attr*=val i]。

CSS3 中关系选择器和属性选择器的常见问题

CSS3 中关系选择器和属性选择器有什么区别?

CSS3 中的关系选择器用于根据元素与 HTML 文档中其他元素的关系来选择元素。例如,子元素、后代、相邻兄弟和通用兄弟选择器都是关系选择器的类型。另一方面,属性选择器用于根据元素的属性或属性值来选择元素。例如,您可以使用属性选择器选择所有类型属性为“text”的输入元素。

如何在 CSS3 中使用子组合器?

CSS3 中的子组合器由“>”符号表示。它用于选择特定元素的直接子元素。例如,如果您想选择具有类“parent”的父元素的所有直接子 div 元素,则应编写如下 CSS:

.parent > div { /* CSS 属性在此处 */ }

我可以在 CSS3 中使用多个属性选择器吗?

是的,您可以在 CSS3 中使用多个属性选择器。这允许您选择满足多个属性条件的元素。例如,如果您想选择所有类型属性为“text”且名称属性为“username”的输入元素,则应编写如下 CSS:

input[type="text"][name="username"] { /* CSS 属性在此处 */ }

CSS3 中相邻兄弟组合器的用途是什么?

CSS3 中的相邻兄弟组合器由“ ”符号表示。它用于选择直接位于另一个特定元素之后的元素,并且这两个元素共享相同的父元素。例如,如果您想选择直接位于 p 元素之后的 div 元素,则应编写如下 CSS:

p div { /* CSS 属性在此处 */ }

如何在 CSS3 中选择具有特定属性值的元素?

要在 CSS3 中选择具有特定属性值的元素,请使用带方括号的属性选择器、属性名称和值。例如,如果您想选择所有类型属性为“text”的输入元素,则应编写如下 CSS:

input[type="text"] { /* CSS 属性在此处 */ }

我可以在 CSS3 中组合关系选择器和属性选择器吗?

是的,您可以在 CSS3 中组合关系选择器和属性选择器。这允许您根据元素与其他元素的关系及其属性来选择元素。例如,如果您想选择具有类“form”的表单元素的所有直接子输入元素,其中输入元素的类型属性为“text”,则应编写如下 CSS:

form.form > input[type="text"] { /* CSS 属性在此处 */ }

CSS3 中的通用兄弟组合器是什么?

CSS3 中的通用兄弟组合器由“~”符号表示。它用于选择特定元素的兄弟元素,而不管它们在 HTML 文档中的顺序如何。例如,如果您想选择 p 元素的所有兄弟 div 元素,则应编写如下 CSS:

p ~ div { /* CSS 属性在此处 */ }

如何在 CSS3 中选择不具有特定属性的元素?

要在 CSS3 中选择不具有特定属性的元素,请使用带有属性选择器的 :not() 伪类。例如,如果您想选择所有类型属性不为“submit”的输入元素,则应编写如下 CSS:

input:not([type="submit"]) { /* CSS 属性在此处 */ }

我可以在 CSS3 中将关系选择器与伪类结合使用吗?

是的,您可以在 CSS3 中将关系选择器与伪类结合使用。这允许您根据元素与其他元素的关系及其状态来选择元素。例如,如果您想选择导航元素的所有直接子 a 元素,这些元素正在被悬停,则应编写如下 CSS:

nav > a:hover { /* CSS 属性在此处 */ }

如何在 CSS3 中选择包含特定值的特定属性的元素?

要在 CSS3 中选择包含特定值的特定属性的元素,请使用带方括号的属性选择器、属性名称和值以及 *= 运算符。例如,如果您想选择所有 href 属性包含“example”的 a 元素,则应编写如下 CSS:

a[href*="example"] { /* CSS 属性在此处 */ }

以上是CSS3中的关系和属性选择器的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
模拟鼠标运动模拟鼠标运动Apr 22, 2025 am 11:45 AM

如果您曾经在现场演讲或课程中必须显示一个互动动画,那么您可能知道它并不总是那么容易与您的幻灯片进行互动

通过Astro Action和Fuse.js为搜索提供动力通过Astro Action和Fuse.js为搜索提供动力Apr 22, 2025 am 11:41 AM

对于Astro,我们可以在构建过程中生成大部分网站,但是有一小部分服务器端代码可以使用Fuse.js之类的搜索功能来处理搜索功能。在此演示中,我们将使用保险丝搜索一组个人“书签”

未定义:第三个布尔值未定义:第三个布尔值Apr 22, 2025 am 11:38 AM

我想在我的一个项目中实现一条通知消息,类似于您在保存文档时在Google文档中看到的信息。换句话说,一个

捍卫三元声明捍卫三元声明Apr 22, 2025 am 11:25 AM

几个月前,我正在使用黑客新闻(就像一个人一样),并且遇到了一篇(现已删除的)文章,内容涉及不使用if语句。如果您是这个想法的新手(就像我

使用网络语音API进行多语言翻译使用网络语音API进行多语言翻译Apr 22, 2025 am 11:23 AM

自科幻小说以来,我们就幻想着与我们交谈的机器。今天这很普遍。即便如此,制造的技术

JetPack Gutenberg块JetPack Gutenberg块Apr 22, 2025 am 11:20 AM

我记得当古腾堡被释放到核心时,因为那天我在WordCamp我们。现在已经过去了几个月,所以我想我们越来越多的人

在VUE中创建可重复使用的分页组件在VUE中创建可重复使用的分页组件Apr 22, 2025 am 11:17 AM

大多数Web应用程序背后的想法是从数据库中获取数据,并以最佳方式将其呈现给用户。当我们处理数据时

使用'盒子阴影”和剪辑路径一起使用'盒子阴影”和剪辑路径一起Apr 22, 2025 am 11:13 AM

让我们对您可以做一些有意义的事情做一些逐步的情况,但是您仍然可以用CSS欺骗来完成它。在这个

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。