第一个带有类的元素的 CSS 选择器

2023-11-21

我有一堆带有类名的元素red,但我似乎无法选择第一个元素class="red"使用以下 CSS 规则:

.home .red:first-child {
    border: 1px solid red;
}
<div class="home">
    <span>blah</span>
    <p class="red">first</p>
    <p class="red">second</p>
    <p class="red">third</p>
    <p class="red">fourth</p>
</div>

这个选择器有什么问题以及如何纠正它以定位第一个有班级的孩子red?


这是作者误解如何做到这一点的最著名的例子之一:first-child works. CSS2中引入, the :first-child伪类代表其父母的第一个孩子。就是这样。有一个非常常见的误解,即它会选择第一个与复合选择器其余部分指定的条件相匹配的子元素。由于选择器的工作方式(参见here以获得解释),这根本不是真的。

选择器级别 3 引入了:first-of-type伪类,它表示其元素类型的兄弟元素中的第一个元素。这个答案用插图解释了之间的区别:first-child and :first-of-type。然而,正如:first-child,它不考虑任何其他条件或属性。在 HTML 中,元素类型由标签名称表示。在问题中,该类型是p.

可惜没有类似的:first-of-class用于匹配给定类的第一个子元素的伪类。在这个答案首次发布时,新发布的 FPWD of Selectors level 4 引入了:nth-match()伪类,围绕现有选择器机制设计,正如我在第一段中提到的,通过添加选择器列表参数,您可以通过该参数提供复合选择器的其余部分以获得所需的过滤行为。近年来,该功能被归入:nth-child() itself,选择器列表作为可选的第二个参数出现,以简化事情并避免错误的印象:nth-match()匹配整个文档(请参阅下面的最后注释)。

当我们等待时跨浏览器支持(说真的,已经过去近 10 年了,而且最近 5 年只有一次实现),一种解决方法莉亚·维鲁而我独立开发的(她先做的!)就是先把你想要的样式应用到all该类的元素:

/* 
 * Select all .red children of .home, including the first one,
 * and give them a border.
 */
.home > .red {
    border: 1px solid red;
}

...然后“撤消”具有该类的元素的样式在第一个之后来, using 通用兄弟组合器~在压倒一切的规则中:

/* 
 * Select all but the first .red child of .home,
 * and remove the border from the previous rule.
 */
.home > .red ~ .red {
    border: none;
}

现在只有第一个元素class="red"会有一个边界。

以下是如何应用规则的说明:

.home > .red {
    border: 1px solid red;
}

.home > .red ~ .red {
    border: none;
}
<div class="home">
  <span>blah</span>         <!-- [1] -->
  <p class="red">first</p>  <!-- [2] -->
  <p class="red">second</p> <!-- [3] -->
  <p class="red">third</p>  <!-- [3] -->
  <p class="red">fourth</p> <!-- [3] -->
</div>
  1. 不适用任何规则;不渲染边框。
    该元素没有类red,因此被跳过。

  2. 仅应用第一条规则;呈现红色边框。
    该元素具有类red,但其前面没有任何具有该类的元素red在其父级中。因此,不应用第二条规则,仅应用第一条规则,并且元素保留其边框。

  3. 两条规则均适用;不渲染边框。
    该元素具有类red。它前面还至少有一个具有该类的其他元素red。因此这两个规则都适用,并且第二个规则border可以说,声明覆盖了第一个声明,从而“撤销”了它。

作为奖励,虽然它是在 Selectors 3 中引入的,但与 IE7 和更高版本不同的是,通用同级组合器实际上得到了 IE7 及更高版本的良好支持:first-of-type and :nth-of-type()仅 IE9 及以上版本支持。如果您需要良好的浏览器支持,那么您很幸运。

事实上,同级组合器是该技术中唯一重要的组成部分,and它具有如此惊人的浏览器支持,使得这项技术非常通用——除了类选择器之外,您还可以使用它来通过其他东西过滤元素:

  • 您可以使用它来解决:first-of-type在 IE7 和 IE8 中,只需提供类型选择器而不是类选择器(同样,在后面的部分的问题中详细介绍其错误用法):

     article > p {
         /* Apply styles to article > p:first-of-type, which may or may not be :first-child */
     }
    
     article > p ~ p {
         /* Undo the above styles for every subsequent article > p */
     }
    
  • 您可以按以下条件过滤属性选择器或任何其他简单的选择器而不是类。

  • 您还可以将这种压倒一切的技术与伪元素尽管伪元素从技术上讲并不是简单的选择器。

请注意,为了使其起作用,您需要提前知道其他同级元素的默认样式是什么,以便您可以覆盖第一个规则。此外,由于这涉及到覆盖 CSS 中的规则,因此您无法使用与选择器API, or Selenium的 CSS 定位器。

最后一点,请记住,这个答案假设问题正在寻找任意数量的具有给定类的第一个子元素。对于复杂选择器的第 n 次匹配,既没有伪类,也没有通用的 CSS 解决方案贯穿整个文档— 解决方案是否存在很大程度上取决于文档结构。 jQuery 提供:eq(), :first, :last以及更多用于此目的的内容,但请再次注意它们的功能与:nth-child() et al。使用选择器 API,您可以使用document.querySelector()获得第一个匹配:

var first = document.querySelector('.home > .red');

Or use document.querySelectorAll()使用索引器来选择任何特定的匹配:

var redElements = document.querySelectorAll('.home > .red');
var first = redElements[0];
var second = redElements[1];
// etc

虽然.red:nth-of-type(1)原始接受答案中的解决方案菲利普·道布迈尔作品(最初由Martyn但后来被删除),它的行为与您期望的方式不同。

例如,如果您只想选择p here:

<p class="red"></p>
<div class="red"></div>

...那么你就不能使用.red:first-of-type(相当于.red:nth-of-type(1)),因为每个元素都是其类型的第一个(也是唯一的)一个(p and div分别),所以both将由选择器匹配。

当某个类的第一个元素也是同类中的第一个,伪类可以工作,但是这纯属巧合。菲利普的回答证明了这种行为。当您在该元素之前插入相同类型的元素时,选择器将失败。从问题中获取标记:

<div class="home">
  <span>blah</span>
  <p class="red">first</p>
  <p class="red">second</p>
  <p class="red">third</p>
  <p class="red">fourth</p>
</div>

应用规则.red:first-of-type会起作用,但是一旦你添加另一个p没有班级:

<div class="home">
  <span>blah</span>
  <p>dummy</p>
  <p class="red">first</p>
  <p class="red">second</p>
  <p class="red">third</p>
  <p class="red">fourth</p>
</div>

...选择器将立即失败,因为第一个.red元素现在是second p元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第一个带有类的元素的 CSS 选择器 的相关文章

  • 图像下方不需要的边距

    我有一个图像和一个 div 我想将其放置在其下方 这是小提琴 http jsfiddle net d3Mne 1 http jsfiddle net d3Mne 1 问题是两者之间存在差距 此下边距仅出现在图像中 有什么办法可以去除吗 Se
  • CSS 变换源不能与 translate() 一起使用

    我想将 div 从中心点移开 但似乎translate 不关心变换原点是什么 并使用元素的左上角来移动它 这是一个测试来证实这一点 div class items div class item 1 style width 100px hei
  • 如何在 HTML 中制作三角形?

    我想使用基本的 CSS 在 HTML 页面中制作三角形 我正在使用需要时间加载的三角形图片 因此 我想减少页面的加载时间 HTML 不可能 但 CSS 可以 例子 div class div
  • 这个 CSS 选择器是什么? [类* =“跨度”]

    我在 Twitter Bootstrap 中看到了这个选择器 show grid class span background color eee text align center border radius 3px min height
  • 没有嵌套容器的桌面和移动 Flexbox 布局

    我有 3 个 div 它们必须按移动布局的特定顺序排列 但我必须将第 2 个 div 作为桌面布局的侧边栏 所以对于移动设备 分区1 分区2 分区3 对于桌面 分区1 div2 分区3 在桌面布局中 div 2 有阴影背景 因此必须是父级的
  • 输入和文本字段中的背景颜色

    我想更改表单文本和输入字段中的颜色背景 但是当我这样做时 它也会影响提交按钮 是否可以通过其他不影响按钮的方式来完成 我用过这段代码 input textarea background color d1d1d1 input type tex
  • CSS 中 calc() 的结果是什么

    我们现在已经开始使用calc 在CSS中 用于设置计算结果的宽度 例如 div div div div parent width 100px calcWidth width calc 100 3px height 100px backgro
  • 夜间值班。单击带有文本的元素

    我遇到问题 无法单击具有某些独特文本的网页元素 我有这样的结构 div class wg wagon type title Text div 我试试这个 click wg wagon type title contains Text 但我有
  • 显示带有背景颜色的百分比条

    例如 如果我有一个包含两列和 2 行的表 Col1 Percentage 50 50 70 70 如何用代表 COl1 值的颜色填充百分比列 像这样的东西 您可以使用具有两个紧接着的停止点的线性渐变 percentageFill heigh
  • 在 IE10 中禁用捏合放大

    在 IE10 触摸模式下 我希望仅使页面的特定部分可缩放 其余的不应该 我找到了这个 http msdn microsoft com en US library ie hh772044 aspx http msdn microsoft co
  • 使组合高度等于浏览器窗口的高度

    http featuredfotografer com http featuredfotografer com Codemirror div 与 header div 结合占用的高度超过了浏览器的高度 我怎样才能使它们的总高度达到浏览器窗口
  • `ie9` - contenteditable false 在父级可编辑时不起作用

    我正在尝试制作内容可编辑和不可编辑的容器 用户可以通过 3 种方式使用它 他们可以将内容与non editable 他们可以将内容与editable 他们可以在不选择其中之一的情况下放置内容 可编辑 我正在努力实现以下目标 content
  • CSS:缩放字体大小以适应父块元素的高度

    我发现的几乎每个问题和答案都谈到了视口大小 这确实不是我的问题 拿着这支笔 https codepen io njt1982 pen pZjZNM https codepen io njt1982 pen pZjZNM 我有一个非常基本的
  • 由于 MIME 类型不受支持,拒绝应用样式

    我不断收到一条错误消息 指出 MIME 类型 text html 不可执行或不是受支持的样式表 MIME 类型 并且启用了严格的 MIME 检查 我的链接代码是
  • 通过 JavaScript 检测浏览器换行

    我需要 javascript 来检测每个浏览器包装的文本行并将其包装到 span class line 我读过一些关于测量每个单词的 y 轴的文章 但还没有看到可靠的解决方案 这是我到目前为止所拥有的 看到它Jsfiddle http js
  • CSS3 box-shadow 用于类似重叠的 div

    我正在尝试用css3来实现这种效果 HTML 代码显然是这样的
  • 使用 JavaScript 使链接保持活动状态并在单击时显示悬停效果

    I am struggling to make this work I d like to make it where if O F is clicked the hover state stays active if another li
  • 保持未知数量的 div 居中,每行最多 4 个

    我有一个简单的问题 但我自己无法解决 简而言之 有一个未知电话我必须在页面中放置的元素数量 最多 每行 4 个元素 但仍居中 此图片给您一个提示 我为了示例而设置它 详细 在上图中我涵盖了不同的场景 例如 如果总共有 5 个元素 则应使用第
  • 无效的选择器:使用 Selenium 时不允许出现复合类名错误

    我正在尝试通过 Web Whatsapp 打印聊天中的一条消息 我可以通过 控制台 选项卡中的 Javascript 来完成此操作 我就是这样做的 recived msg document getElementsByClassName XE
  • FireFox 中的“contenteditable = true”高度问题

    当有空的时候div with contenteditable true CSS contenteditable true border 1px dashed dedede padding 3px HTML div div 在 IE 和 Ch

随机推荐

  • C# 将复选框添加到 WinForms 上下文菜单

    我的表单上有一系列复选框 我希望能够从上下文菜单以及表单本身中选择这些 上下文菜单链接到应用程序的系统托盘图标 我的问题是 是否可以将上下文菜单链接到这些复选框 或者甚至可以将复选框添加到上下文菜单中 甚至是组合 菜单项有一个Checked
  • 列出 Google 表格中的工作表名称并跳过前两个

    我找到了列出 Google 表格中所有工作表名称的代码 来自here function SheetNames Usage as custom function SheetNames GoogleClock try var sheets Sp
  • Python 中的双精度浮点值?

    是否有比 float 精度更高的数据类型 Python 内置的float类型具有双精度 它是 Cdouble在 CPython 中 Javadouble在 Jython 中 如果您需要更高的精度 请获取NumPy并使用其numpy floa
  • 使用 JAVA JNI 和 C++ 进行通用调用

    我正在使用 JNI 并且必须将一些泛型类型传递给 C 我不知道如何在 C 方面解决这个问题 HashMap
  • Spring MVC 继承类的验证

    我很难相信我是唯一一个想要这样做的人 但我找不到任何参考资料来帮助我克服障碍 使用 Spring MVC 和基于注释的验证 我使用框架 4 0 和 Java 1 7 考虑一个简单的类层次结构 如下所示 abstract class Foo
  • SQL Server存储过程插入多个表[重复]

    这个问题在这里已经有答案了 我有2张桌子 custlogin and custinfo custlogin custid int primary key auto notnull custusename varchar 25 custpas
  • 生成随机位 - C rand() 中缺乏随机性

    我在用rand 生成 0 或 1 rand 2 我正在使用当前时间 srand time NULL 经过多次调试 我意识到rand 永远不会连续返回 16 次或更多次偶数 奇数 这是一个已知的问题 C 附带有更好的 PRNG 吗 我使用 V
  • pandas groupby 应用于多个列以生成新列

    我喜欢使用 groupby apply 在 pandas 数据框中生成一个新列 例如 我有一个数据框 df pd DataFrame A 1 2 3 4 B A B A B C 0 0 1 1 并尝试通过 groupby apply 生成新
  • 如何获取字符串中某个模式的所有索引?

    我想要这样的东西 abcdab search a g return 0 4 是否可以 You can use the RegExp exec方法多次 var regex a g var str abcdab var result var m
  • 删除所有出现的新行和制表符

    我仍在学习一些不错的正则表达式 但我认为这会起作用 这有效 str replace g replace r n n r gm 但它的较短版本则不然 我哪里做错了 str replace g r n n r gm 正则表达式分隔符是 所以你有
  • JWT 和一次性令牌?

    我正在滚动我自己的 JWT 令牌身份验证 但是 我真的希望它是一次性令牌 因此一旦使用它 服务器会生成一个新令牌 并且客户端必须在期间使用该令牌下一个请求 调用 然而 据我了解 JWT 应该是 无状态的 但通过一次性令牌的方法 我想我需要以
  • 什么是 BOOST_ROOT?

    我正在尝试构建 x64 版本http code google com p quickfast 这就是构建脚本使用 BOOST ROOT 的方式 set SETUP CHECKING BOOST ROOT BOOST ROOT if not
  • Hibernate 表和列的自动保留字转义

    我正在尝试对几种不同的数据库使用一种 Hibernate 映射 H2 Oracle MySql 每个数据库都有不同的保留字列表 我希望 Hibernate 自动转义保留字 我知道我可以 使用反引号强制转义 为了安全起见 转义所有内容 更改所
  • JavaScript 中 {} 和 [] 之间的区别

    我正在研究 javascript 我遇到了这个 if i do let object object length 它会抱怨 object length 未定义 但 let object object length works 有谁知道为什么
  • nginx 和 uwsgi 服务器中 uwsgi 模块的区别

    我是linux开发新手 我对我读到的文档有点困惑 我的最终目标是托管一个简单的 python 支持的 Web 服务 该服务将检查传入的有效负载 并将其转发到其他服务器 这应该少于 30 行 Python 代码 我计划使用 nginx 来提供
  • 从 C 函数返回多个值

    重要的 请参阅这个非常相关的问题 在 C 中返回多个值 我想知道如何在 ANSI C 中做同样的事情 您会使用结构体还是传递函数中参数的地址 我追求极其高效 快速 的代码 时间和空间 即使以可读性为代价 EDIT 感谢所有的答案 好吧 我想
  • Scala 中的映射类型

    有没有办法从 Scala 中的现有类型派生类型 例如 对于case class Person name String age Int 我想要一个Product Tuple of Option String Option Int 即从现有类型
  • 如何修复警告“CoreUI:RunTimeThemeRefForBundleIdentifierAndName()无法在标识符为'(null)'的捆绑包中找到Assets.car”?

    我正在尝试在 iOS 13 beta 上测试应用程序 当我点击欢迎屏幕上的按钮以转到另一个屏幕时 应用程序冻结然后终止 当我在 Xcode 11 中调试时 我在控制台中看到以下警告行 框架 CoreUI RunTimeThemeRefFor
  • Java 中的 AES-256-CBC

    我正在尝试编写一个简单的 Java 程序 该程序将使用以下命令加密纯文本AES 256 CBC 有类 import javax crypto Cipher import javax crypto spec IvParameterSpec i
  • 第一个带有类的元素的 CSS 选择器

    我有一堆带有类名的元素red 但我似乎无法选择第一个元素class red 使用以下 CSS 规则 home red first child border 1px solid red div class home span blah spa