likes
comments
collection
share

css中使用选择器如何获取到当前元素的前一个相邻节点

作者站长头像
站长
· 阅读数 61

css中使用选择器如何获取到当前元素的前一个相邻节点?

让人迷糊的 previous sibling

在jquery中可以直接使用 $(selector).prev() 来得到。但是直接使用css,很多地方都直接说没有提供的方法。如下关于 is there a "previous sibling" selector 的一个提问:

css中使用选择器如何获取到当前元素的前一个相邻节点 (图片来自:stackoverflow.com/questions/1…

:has 的出现

但是从2022年开始,随着各大浏览器厂商对于 :has 这一伪类的支持,逐渐打破了这一僵局。使用如下方式可以实现获取 指定元素的相邻前一个节点,如下:

/*选择span元素,这个元素的紧邻后一个元素是p,换句话说就是,p元素的紧前节点*/
.container:has(+p) 

如下,Edit fiddle - JSFiddle - Code Playground

css中使用选择器如何获取到当前元素的前一个相邻节点

选择器大全

至于对其他的选择器比较全面的了解和学习,可以及参考如下w3c提供的官方说明:

css中使用选择器如何获取到当前元素的前一个相邻节点 (图片来自:www.w3.org/TR/selector…)

这里对于如下选择器语法的说明,相对更加容易理解:

PatternRepresentsDescriptionLevel
E Fan F element descendant of an E elementDescendant combinator1
E > Fan F element child of an E elementChild combinator2
E + Fan F element immediately preceded by an E elementNext-sibling combinator2
E ~ Fan F element preceded by an E elementSubsequent-sibling combinator3

示例

Represents这列可以明显地看到它的每一句描述的主语是F,并且F在Pattern 这一列都是在 空格、>、+、- 这些符号的后面。通过这就能明确每一种所代表的含义。

  • descendant
  • child
  • next-sibling
  • subsequent-sibling

descendant jsfiddle.net/tuqgxwhy/28…

css中使用选择器如何获取到当前元素的前一个相邻节点

child

css中使用选择器如何获取到当前元素的前一个相邻节点

next-sibling

css中使用选择器如何获取到当前元素的前一个相邻节点

subsequent-sibling jsfiddle.net/tuqgxwhy/27…

css中使用选择器如何获取到当前元素的前一个相邻节点

:has的兼容性

因为这一伪类是在Selectors Level 4 中才出现的,各浏览器厂商的支持,几乎都从2022年才逐步开始,具体的兼容的情况如下:

css中使用选择器如何获取到当前元素的前一个相邻节点

(图片来自:caniuse.com/?search=%3A…

这也是我们在功能实现时,对兼容性的要求必须要考虑的一个重要因素。

Selectors level 4 是什么

在mdn web docs 上对应 :has 的说明中能够看到它对应的 specification 提到的 Selectors Level 4。前面提到的选择器的部分引用的实际上是 Selectors Level3 中的内容。

那么什么是 Selector Level呢,如下来自

Selectors Levels 1, 2, and 3 are defined as the subsets of selector functionality defined in the [CSS1](https://www.w3.org/TR/REC-CSS1), [CSS2.1](https://www.w3.org/TR/CSS21/), and [Selectors Level 3](https://www.w3.org/TR/css3-selectors/) specifications, respectively. This module defines Selectors Level 4.

其中关于这个Level的说明,在 CSS Levels 中说明了,为什么 CSS 不采用传统的 versions的概念,而使用 Level 代替的缘由。

reference

stackoverflow.com/questions/6…

转载自:https://juejin.cn/post/7255126807552786491
评论
请登录