是否有"以前的兄弟"CSS选择器?

Jou*_*key 1253 css css-selectors

加号(+)用于下一个兄弟.以前的兄弟姐妹是否有同等效力?

cle*_*tus 781

不,没有"以前的兄弟"选择器.

在相关的说明中,~是针对一般继承者兄弟(意思是元素在此之后,但不一定紧接在之后)并且是CSS3选择器.+是为了下一个兄弟,是CSS2.1.

看到相邻的兄弟组合子选择器3级5.7相邻同胞选择层叠样式表级别2版本1(CSS 2.1)规范.

  • 这是我做的一个例子,看看它能做什么,不能做什么.http://jsfiddle.net/NuuHy/1/ (41认同)
  • @Lie Ryan:是的,但是他的回答是关键是你没有**选择**前面的元素. (26认同)
  • 从CSS3标准:*由两个序列**表示的元素在文档树中共享相同的父**,由第一个序列**表示的元素在**之前(不一定是立即)由第二个序列表示的元素*. (13认同)
  • 对此有用的jquery函数是prev().例如$("#the_element").prev().css("background-color","red") (6认同)

man*_*ish 216

我找到了一种方法来塑造所有以前的兄弟姐妹(相反~),这取决于你需要什么.

假设您有一个链接列表,当悬停在一个链接上时,所有以前的链接都应该变为红色.你可以这样做:

/* default link color is blue */
.parent a {
  color: blue;
}

/* prev siblings should be red */
.parent:hover a {
  color: red;
}
.parent a:hover,
.parent a:hover ~ a {
  color: blue;
}
Run Code Online (Sandbox Code Playgroud)
<div class="parent">
  <a href="#">link</a>
  <a href="#">link</a>
  <a href="#">link</a>
  <a href="#">link</a>
  <a href="#">link</a>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 这些链接都变成红色,如果我将鼠标悬停在它们之间的空间,对我来说. (37认同)
  • 您可以添加其工作原理的说明.(似乎您将样式应用于所有项目以及以下项目,但可以明确说明) (14认同)
  • 这是我上面提到的小提琴:http://jsfiddle.net/y9zeLr1n/ (7认同)
  • 是的,但大部分时间都需要一个以前的而不是以前的所有! (6认同)
  • @Lynn答案只包含在悬停时使前一个链接变红的代码.其他样式取决于您的用例.对于星级评分组件(我猜这是常见的情况),你需要摆脱那个空间,并使红色链接成为红色. (3认同)

Que*_*tin 148

选择器级别4引入:has()(以前是主题指示符!),这将允许您选择以前的兄弟:

previous:has(+ next) {}
Run Code Online (Sandbox Code Playgroud)

...但在撰写本文时,浏览器支持已超出前沿.

  • ["出血边缘为浏览器支持"](http://caniuse.com/#search=%3Ahas)可能是言过其实.在编写本文时,即使是最新版本的Chrome也无法使用`:has()`伪类. (43认同)
  • @ReedMartin - 这就是为什么我说*超出前沿的距离* (25认同)
  • 要跟踪 FIrefox 上 `has()` 的状态,请关注 Bugzilla 上的此问题:https://bugzilla.mozilla.org/show_bug.cgi?id=418039 (11认同)
  • ":has未标记为动态选择器配置文件的一部分,这意味着它不能在样式表中使用;只能使用document.querySelector()等函数." - https://developer.mozilla.org/en-US/docs/Web/CSS/:has (9认同)
  • @JacobvanLingen — https://caniuse.com/#feat=css-has — 目前没有浏览器支持它。 (4认同)
  • @ArchLinuxTux:“这个限制现在被删除了”,所以从前我们可以使用这个功能:D。 (2认同)

Mic*_*l_B 139

考虑orderflex和网格布局的属性.

我将在下面的示例中关注flexbox,但相同的概念适用于Grid.


使用flexbox,可以模拟先前的兄弟选择器.

特别是,flex order属性可以在屏幕周围移动元素.

这是一个例子:

当元素B悬停时,您希望元素A变为红色.

<ul>
    <li>A</li>
    <li>B</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

脚步

  1. 制作ul一个flex容器.

    ul { display: flex; }
    
    Run Code Online (Sandbox Code Playgroud)

  1. 在标记中反转兄弟姐妹的顺序.

    <ul>
       <li>B</li>
       <li>A</li>
    </ul>
    
    Run Code Online (Sandbox Code Playgroud)

  1. 使用兄弟选择器来定位元素A(~+将执行).

    li:hover + li { background-color: red; }
    
    Run Code Online (Sandbox Code Playgroud)

  1. 使用flex order属性可以恢复可视显示中兄弟节点的顺序.

    li:last-child { order: -1; }
    
    Run Code Online (Sandbox Code Playgroud)

......瞧!先前的兄弟选择器诞生(或至少模拟).

这是完整的代码:

ul {
    display: flex;
}

li:hover + li {
    background-color: red;
}

li:last-child {
    order: -1;
}

/* non-essential decorative styles */
li {
    height: 200px;
    width: 200px;
    background-color: aqua;
    margin: 5px;
    list-style-type: none;
    cursor: pointer;
}
Run Code Online (Sandbox Code Playgroud)
<ul>
    <li>B</li>
    <li>A</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

来自flexbox规范:

5.4.显示顺序:order属性

默认情况下,Flex项目的显示和排列顺序与它们在源文档中显示的顺序相同.该 order属性可用于更改此顺序.

order属性通过将弹性项目分配给序列组来控制弹性项目在弹性容器中的显示顺序.它需要一个<integer>值,它指定flex项所属的哪个序数组.

order所有弹性项的初始值为0.

另请参阅orderCSS网格布局规范.


使用flex order属性创建的"previous sibling selectors"的示例.

.container { display: flex; }

.box5 { order: 1; }    
.box5:hover + .box4 { background-color: orangered; font-size: 1.5em; }

.box6 { order: -4; }
.box7 { order: -3; }
.box8 { order: -2; }
.box9 { order: -1; }
.box9:hover ~ :not(.box12):nth-child(-1n+5) { background-color: orangered;
                                              font-size: 1.5em; }
.box12 { order: 2; }
.box12:hover ~ :nth-last-child(-1n+2) { background-color: orangered;
                                        font-size: 1.5em; }
.box21 { order: 1; }
.box21:hover ~ .box { background-color: orangered; font-size: 1.5em; }

/* non-essential decorative styles */
.container {
    padding: 5px;
    background-color: #888;
}
.box {
    height: 50px;
    width: 75px;
    margin: 5px;
    background-color: lightgreen;
    display: flex;
    justify-content: center;
    align-items: center;
    text-align: center;
    cursor: pointer;
}
Run Code Online (Sandbox Code Playgroud)
<p>
Using the flex <code>order</code> property to construct a previous sibling selector
</p>

<div class="container">
    <div class="box box1"><span>1</span></div>
    <div class="box box2"><span>2</span></div>
    <div class="box box3"><span>3</span></div>
    <div class="box box5"><span>HOVER ME</span></div>
    <div class="box box4"><span>4</span></div>
</div>

<br>

<div class="container">
    <div class="box box9"><span>HOVER ME</span></div>
    <div class="box box12"><span>HOVER ME</span></div>
    <div class="box box6"><span>6</span></div>
    <div class="box box7"><span>7</span></div>
    <div class="box box8"><span>8</span></div>
    <div class="box box10"><span>10</span></div>
    <div class="box box11"><span>11</span></div>
</div>

<br>

<div class="container">
    <div class="box box21"><span>HOVER ME</span></div>
    <div class="box box13"><span>13</span></div>
    <div class="box box14"><span>14</span></div>
    <div class="box box15"><span>15</span></div>
    <div class="box box16"><span>16</span></div>
    <div class="box box17"><span>17</span></div>
    <div class="box box18"><span>18</span></div>
    <div class="box box19"><span>19</span></div>
    <div class="box box20"><span>20</span></div>
</div>
Run Code Online (Sandbox Code Playgroud)

的jsfiddle


附注 - 关于CSS的两种过时信念

Flexbox打破了人们对CSS的长期信念.

一个这样的信念是CSS中不可能使用先前的兄弟选择器.

说这种信念是普遍的,这是轻描淡写的.以下是Stack Overflow相关问题的示例:

如上所述,这种看法并不完全正确.可以使用flex order属性在CSS中模拟先前的兄弟选择器.

z-index神话

另一个长期存在的信念是z-index仅适用于定位元素.

事实上,该规范的最新版本--W3C编辑的草案 - 仍然断言这是真的:

9.9.1指定堆栈级别:z-index 属性

z-index

  • 价值:汽车| | 继承
  • 初始:自动
  • 适用于:定位元素
  • 继承:没有
  • 百分比:N/A.
  • 媒体:视觉
  • 计算值:如指定的那样

(重点补充)

但实际上,这些信息已经过时且不准确.

作为弹性项目网格项目的元素即使在何时position也可以创建堆叠上下文static.

4.3.Flex项目Z-Ordering

柔性物品油漆完全一样内嵌块,不同之处在于为了改性文档顺序代替原始文档顺序的使用,并且z-index其它值比auto创建一个堆叠内容即使positionstatic.

5.4.Z轴订购:z-index属性

的网格项目的绘制顺序是完全一样的内联块,不同之处在于为了改性文档顺序代替原始文档顺序的使用,并且z-index比其它值auto创建一个堆叠内容即使 positionstatic.

以下是z-index处理非定位弹性项目的演示:https://jsfiddle.net/m0wddwxs/

  • `order`属性不是解决方案,因为它仅用于更改_visual_ order,因此它不会恢复您在HTML中必须更改的原始_semantical_顺序,以使此变通方法正常工作. (11认同)
  • 请记住,您引用的CSS2.2 ED实际上仍然是CSS2.CSS2中不存在flexbox和网格布局,因此就CSS2而言,该信息肯定是正确的.至少,文本可以更新,以提及z-index可能适用于未来CSS级别中的其他类型的元素,就像它说其他属性可能建立堆叠上下文一样,例如不透明度. (5认同)
  • @BoltClock 我的评论与浏览器支持无关。该技术打破语义以支持呈现。我相信在服务器端添加到以前的兄弟元素中的普通类要合理得多。 (3认同)
  • 如果有人在理解`z-index`何时工作时遇到困难,即使是"omg,也没有指定`position`!",规范提到了_stacking context_的概念,[本文关于MDN]很好地解释了这个概念. (https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context) (3认同)
  • @Michael_B,欢迎你!我已经处理了很多不知道这件事的前锋.另外一件事我想提一下,_faux上一个兄弟选择器_也适用于`float:right`(或任何其他方法来反转排序,其中`flex/order`几乎没有(最少?)副作用) .掀起两个小提琴:[展示`浮动:正确'方法](https://jsfiddle.net/foozle/t9819puk/),[展示`方向:rtl`](https://jsfiddle.net/foozle/ ajyoLc1g /) (3认同)
  • @Marat Tanalin:对于90%的用例,假设浏览器支持不是问题,这将很好地工作。剩下的10%用例要么是1)更改视觉顺序不是解决方案的案例,要么是2)根本不涉及CSS的案例。幸运的是,对于#2,选择器4提供了:has(),选择器库的开发人员可以轻松实现它。 (2认同)
  • 常见的误解是选择器与级联有关。CSS定义的级联是在每个元素的基础上进行的。从理论上讲,没有什么可以排除以前的同级选择器的存在或使其成为矛盾之处-特别是现在[选择器已完全超越了层叠样式表](https://blog.novalistic.com/archives/2018/01/使用-css-selectors-for-non-css#history),将CSS参数模拟出来。 (2认同)

Bry*_*sen 68

我有同样的问题,但后来我有一个"呃"的时刻.而不是写作

x ~ y
Run Code Online (Sandbox Code Playgroud)

y ~ x
Run Code Online (Sandbox Code Playgroud)

显然这匹配"x"而不是"y",但它回答"有匹配吗?" 问题,简单的DOM遍历可能比在javascript中循环更有效地使您获得正确的元素.

我意识到最初的问题是一个CSS问题所以这个答案可能完全无关紧要,但其他Javascript用户可能会像我一样通过搜索偶然发现问题.

  • 先前兄弟选择器的想法是它将选择前一个元素.不幸的是,如此处所述,逆转它并不提供此功能. (149认同)
  • 苛刻,你有点苛刻.(对不起,无法抗拒.)重点是,有时候你只需要知道"存在吗?".其他时候你可以使用":before"在两个元素之间放置一些东西.最后,如果你必须使用find("y~x")进入jQuery,则prev()比许多替代方案更容易. (19认同)
  • 我相信这很容易找到y.问题是如果y只能相对于x找到,并且在反转它时,你找不到y,因为你必须首先找到x.这当然是关于y在兄弟之前而不是在下一个之前的问题,但也可能适用于y是一个跟随兄弟. (17认同)
  • 感谢@Zenexer澄清这个答案没有提供原始问题的实际解决方案,我开始觉得自己愚蠢地思考`y~x`如何解决我的问题 (14认同)
  • 我理解这个答案背后的想法,但是答案中给出的推理并没有多大意义.选择器`y~x`没有回答"有没有匹配?" 问题,因为这里给出的两个选择器意味着完全不同的东西.例如,给定子树`<root> <x /> <y /> </ root>`,`y~x`就没有办法产生匹配.如果问题是"存在吗?" 然后选择器就是`y`.如果问题是"在给定任意位置的兄弟x的情况下是否存在?" 那么你需要*两个*选择器.(虽然也许我只是在这一点上挑剔...) (4认同)

Rok*_*jan 25

.基本上反转HTML中所需元素的HTML顺序并使用
~ Next兄弟运算符:

float-right +逆转HTML元素的顺序

div{ /* Do with the parent whatever you know just to make the
  inner float-right elements appear where desired */
  display:inline-block;
}
span{
  float:right;  /* float-right the elements! */
}
span:hover ~ span{ /* On hover target it's "previous";) elements */
  background:red;
} 
Run Code Online (Sandbox Code Playgroud)
<div>
  <!-- Reverse the order of inner elements -->
  <span>5</span>
  <span>4</span>
  <span>3</span>
  <span>2</span>
  <span>1</span>
</div>
Run Code Online (Sandbox Code Playgroud)


父与direction: rtl;+逆内元素的顺序

.inverse{
  direction: rtl;
  display: inline-block; /* inline-block to keep parent at the left of window */
}
span:hover ~ span{ /* On hover target it's "previous";) elements */
  background:gold;
}
Run Code Online (Sandbox Code Playgroud)
Hover one span and see the previous elements being targeted!<br>

<div class="inverse">
  <!-- Reverse the order of inner elements -->
  <span>5</span>
  <span>4</span>
  <span>3</span>
  <span>2</span>
  <span>1</span>
</div>
Run Code Online (Sandbox Code Playgroud)


Vic*_*ban 23

没有“前一个选择器”,但您可以使用:not~(“后选择器”)的组合。没有相反的顺序,没有 javascript。

.parent a{
  color: blue
}

.parent a.active{
  color: red
}

.parent a:not(.parent a.active ~ a){
  color: red
}
Run Code Online (Sandbox Code Playgroud)
<div class="parent">
  <a href="">link</a>
  <a href="">link</a>
  <a href="" class="active">link</a>
  <a href="">link</a>
  <a href="">link</a>
</div>
Run Code Online (Sandbox Code Playgroud)

我认为我的方法比“设置所有 div 的样式,而不是删除 div 之后的样式”、使用 javascript 或使用相反的顺序更直接。

  • 读者注意事项:请注意,这不是一个前一个兄弟选择器,而是一个“通用前一个兄弟”选择器,因为它将匹配任何匹配元素,而不仅仅是前一个(但不会脱离解决方案,这很有创意)。 (2认同)
  • 我使用 `.parent a:not(.parent a.active ~ a, a.active, .parent :first-child) { color: red }` 只为第二个孩子着色。 (2认同)

Rou*_*ica 19

+是为了下一个兄弟姐妹.以前的兄弟姐妹是否有同等效力?

你可以使用两个斧头选择器:!?

常规CSS中有2个后续兄弟选择器:

  • +立即随后的兄弟选择
  • ~任何后续的兄弟选择器

在传统的CSS中,没有先前的兄弟选择器.

但是,在ax CSS后处理器库中,有2个先前的兄弟选择器:

  • ?立即前一个兄弟选择器(相对的+)
  • !任何以前的兄弟选择器(对面~)

工作实例:

在下面的示例中:

  • .any-subsequent:hover ~ div 选择任何后续 div
  • .immediate-subsequent:hover + div 选择紧接着的后续 div
  • .any-previous:hover ! div 选择任何以前的 div
  • .immediate-previous:hover ? div 选择前一个 div

div {
  display: inline-block;
  width: 60px;
  height: 100px;
  color: rgb(255, 255, 255);
  background-color: rgb(255, 0, 0);
  text-align: center;
  vertical-align: top;
  cursor: pointer;
  opacity: 0;
  transition: opacity 0.6s ease-out;
}

code {
  display: block;
  margin: 4px;
  font-size: 24px;
  line-height: 24px;
  background-color: rgba(0, 0, 0, 0.5);
}

div:nth-of-type(-n+4) {
  background-color: rgb(0, 0, 255);
}

div:nth-of-type(n+3):nth-of-type(-n+6) {
  opacity: 1;
}

.any-subsequent:hover ~ div,
.immediate-subsequent:hover + div,
.any-previous:hover ! div,
.immediate-previous:hover ? div {
  opacity: 1;
}
Run Code Online (Sandbox Code Playgroud)
<h2>Hover over any of the blocks below</h2>

<div></div>
<div></div>

<div class="immediate-previous">Hover for <code>?</code> selector</div>
<div class="any-previous">Hover for <code>!</code> selector</div>
<div class="any-subsequent">Hover for <code>~</code> selector</div>
<div class="immediate-subsequent">Hover for <code>+</code> selector</div>

<div></div>
<div></div>

<script src="https://rouninmedia.github.io/axe/axe.js"></script>
Run Code Online (Sandbox Code Playgroud)

  • **ax**是一个CSS后处理器.它不使用与CSS预处理器相同的语法,如Sass,Less或Stylus. (19认同)
  • 当我尝试在rails项目中的sass上实现它时,这给了我一个语法错误. (2认同)
  • @Rounin 你介意添加一些文档链接吗?我找不到 *axe* 后处理器。 (2认同)

Rom*_*kin 18

2023年情况发生了变化,现在有了这样的选择器:

    // 1 item before
    :has(+ .item:hover) {
        ...
    }
Run Code Online (Sandbox Code Playgroud)

如果您之前想选择 3 个项目,请执行以下操作:

    // 3 items before
    :has(+ .item:hover),
    :has(+ .item + .item:hover),
    :has(+ .item + .item + .item:hover) {
        ...
    }
Run Code Online (Sandbox Code Playgroud)

在这里查看我的演示https://codepen.io/ro31337/pen/YzJbEZv

  • 您还可以使用 item:has(~ item:hover) 更改当前悬停元素之前的所有先前同级元素。 (2认同)

Vad*_*kov 16

另一个flexbox解决方案

您可以使用HTML中的元素顺序.然后除了orderMichael_B的答案中使用,您可以使用flex-direction: row-reverse;flex-direction: column-reverse;取决于您的布局.

工作样本:

.flex {
  display: flex;
  flex-direction: row-reverse;
   /* Align content at the "reversed" end i.e. beginning */
  justify-content: flex-end;
}

/* On hover target its "previous" elements */
.flex-item:hover ~ .flex-item {
  background-color: lime;
}

/* styles just for demo */
.flex-item {
  background-color: orange;
  color: white;
  padding: 20px;
  font-size: 3rem;
  border-radius: 50%;
}
Run Code Online (Sandbox Code Playgroud)
<div class="flex">
  <div class="flex-item">5</div>
  <div class="flex-item">4</div>
  <div class="flex-item">3</div>
  <div class="flex-item">2</div>
  <div class="flex-item">1</div>
</div>
Run Code Online (Sandbox Code Playgroud)


0x1*_*ene 15

目前没有正式的方法可以做到这一点,但你可以使用一个小技巧来实现这一目标!请记住它是实验性的并且有一些限制......(如果您担心导航器兼容性,请查看此链接)

你可以做的是使用CSS3选择器:伪classe调用 nth-child()

#list>* {
  display: inline-block;
  padding: 20px 28px;
  margin-right: 5px;
  border: 1px solid #bbb;
  background: #ddd;
  color: #444;
  margin: 0.4em 0;
}

#list :nth-child(-n+4) {
  color: #600b90;
  border: 1px dashed red;
  background: orange;
}
Run Code Online (Sandbox Code Playgroud)
<p>The oranges elements are the previous sibling li selected using li:nth-child(-n+4)</p>

<div id="list">
  <span>1</span><!-- this will be selected -->
  <p>2</p><!-- this will be selected -->
  <p>3</p><!-- this will be selected -->
  <div>4</div><!-- this will be selected -->
  <div>5</div>
  <p>6</p>
  <p>7</p>
  <p>8</p>
  <p>9</p>
</div>
Run Code Online (Sandbox Code Playgroud)

限制

  • 您无法根据下一个元素的类选择以前的元素
  • 伪类也是如此

  • 我有一个复杂的选择器,但假设它是 `li#someListItem` 并且我想要它之前的节点(这就是我解释“前一个”的方式) - 我不明白您提供的信息如何帮助我通过 CSS 来表达。你只是选择前 n 个兄弟姐妹,并假设我知道 n 个。基于这个逻辑,任何选择器都可以做到这一点并选择我需要的元素(例如 :not() )。 (2认同)

Har*_*odi 8

我的要求是在 @Quentin 的答案的帮助下选择当前悬停项目的前一个和后两个兄弟姐妹,我选择了前一个兄弟姐妹。

.child{
  width: 25px;
  height: 25px;
}

.child:hover {
    background:blue;
}

 .child:has( + .child:hover) {
  background: yellow;
}

.child:has(+ .child + .child:hover){
  background:green;
}

.child:hover + .child {
  background: red;
}

.child:hover + .child + .child {
  background: magenta;
}
Run Code Online (Sandbox Code Playgroud)
<ul class="parent">
  <li class="child"></li>
  <li class="child"></li>
  <li class="child"></li>
  <li class="child"></li>
  <li class="child"></li>
  <li class="child"></li>
</ul>
Run Code Online (Sandbox Code Playgroud)

选择所有先前的兄弟姐妹

.child {
    width: 25px;
    height: 25px;
}

.child:hover {
    background: blue;
}

.child:has(~ .child:hover) {
    background: red;
}
Run Code Online (Sandbox Code Playgroud)
<ul class="parent">
  <li class="child"></li>
  <li class="child"></li>
  <li class="child"></li>
  <li class="child"></li>
  <li class="child"></li>
  <li class="child"></li>
</ul>
Run Code Online (Sandbox Code Playgroud)


meg*_*ere 7

覆盖悬停时下一个兄弟姐妹的样式,这样看起来只有前一个兄弟姐妹在悬停时添加了样式。

ul li {
  color: red;
}

ul:hover li {
  color: blue;
}

ul:hover li:hover ~ li{
  color: red;
}
Run Code Online (Sandbox Code Playgroud)
<ul>
    <li>item 1</li>
    <li>item 2</li>
    <li>item 3</li>
</ul>
Run Code Online (Sandbox Code Playgroud)


Car*_*rel 7

你可以使用双重否定

SELECTOR:not([SELECTOR]FILTER):not([SELECTOR]FILTER + SELECTOR) { ... }
Run Code Online (Sandbox Code Playgroud)

替换SELECTORTAGor .CLASS(使用#ID可能太具体了)。替换FILTER为其他一些:PSUEDO-SELECTOR(我只试过:hover)或.CLASS(更多用于通过 Javascript 切换)。

由于典型用法可能依赖于悬停(请参见下面的示例)

/* Effect only limited when hovering */
TAG.CLASS:not(TAG.CLASS:hover):not(TAG.CLASS:hover + TAG.CLASS) {}
/* Effect only applied when hovering */
PARENT.CLASS:hover > CHILD.CLASS:not(CHILD.CLASS:hover):not(CHILD.CLASS:hover + CHILD.CLASS) {}
Run Code Online (Sandbox Code Playgroud)

SELECTOR:not([SELECTOR]FILTER):not([SELECTOR]FILTER + SELECTOR) { ... }
Run Code Online (Sandbox Code Playgroud)
/* Effect only limited when hovering */
TAG.CLASS:not(TAG.CLASS:hover):not(TAG.CLASS:hover + TAG.CLASS) {}
/* Effect only applied when hovering */
PARENT.CLASS:hover > CHILD.CLASS:not(CHILD.CLASS:hover):not(CHILD.CLASS:hover + CHILD.CLASS) {}
Run Code Online (Sandbox Code Playgroud)


ker*_*nel 6

如果您知道确切的位置,:nth-child()则可以基于 - 排除所有后续兄弟姐妹。

ul li:not(:nth-child(n+3))
Run Code Online (Sandbox Code Playgroud)

这将选择li第 3 个之前的所有 s(例如第 1 个和第 2 个)。但是,在我看来,这看起来很难看,而且用例非常紧张。

您还可以选择从右到左的第 n 个子级:

ul li:nth-child(-n+2)
Run Code Online (Sandbox Code Playgroud)

其作用相同。


She*_*man 6

不可以。通过 CSS 是不可能的。它需要记住“级联”;-)。


但是,如果您能够将JavaScript添加到您的页面,那么一点点jQuery可以帮助您实现最终目标。
您可以使用 jQueryfind对您的目标元素/类/id 执行“前瞻”,然后回溯以选择您的目标。
然后您使用 jQuery 为您的元素重新编写 DOM (CSS)。

根据Mike Brant 的这个答案,以下 jQuery 代码段可能会有所帮助。

$('p + ul').prev('p')
Run Code Online (Sandbox Code Playgroud)

这首先选择<ul>紧跟在 a 之后的所有s <p>
然后它“回溯”以<p>从该组<ul>s 中选择所有先前的s。

实际上,已通过 jQuery 选择了“上一个兄弟”。
现在,使用该.css函数为该元素传入 CSS 新值。


就我而言,我正在寻找一种方法来选择具有 id 的 DIV #full-width,但前提是它具有.companies.

我可以控制 下的所有 HTML .companies,但无法更改它上面的任何 HTML。
级联只向 1 个方向进行:向下。

因此我可以选择 ALL #full-width
或者我可以选择.companies只跟在#full-width.
但我不能只选择#full-widths进行 .companies

而且,我再次无法.companies在 HTML 中添加任何更高的内容。HTML 的那部分是在外部编写的,并包装了我们的代码。

但是使用 jQuery,我可以选择所需的#full-widths,然后分配适当的样式:

$("#full-width").find(".companies").parents("#full-width").css( "width", "300px" );
Run Code Online (Sandbox Code Playgroud)

这将查找所有#full-width .companies,并仅选择那些.companies,类似于如何使用选择器来定位 CSS 标准中的特定元素。
然后它用于.parents“回溯”并选择 的所有父项.companies
但过滤这些结果以仅保留#fill-width元素,因此最终,
它仅选择#full-width具有.companies类后代的元素。
最后,它为width结果元素分配一个新的 CSS ( ) 值。

$('p + ul').prev('p')
Run Code Online (Sandbox Code Playgroud)
$("#full-width").find(".companies").parents("#full-width").css( "width", "300px" );
Run Code Online (Sandbox Code Playgroud)
$(".parent").find(".change-parent").parents(".parent").css( "background-color", "darkred");
Run Code Online (Sandbox Code Playgroud)

jQuery 参考文档:
$()或 jQuery():DOM 元素。
. find:获取当前匹配元素集中每个元素的后代,由选择器、jQuery 对象或元素过滤。
. parent:获取匹配元素集中每个元素的前一个兄弟元素。如果提供了选择器,则仅当它与该选择器匹配时才检索前一个同级(过滤结果以仅包含列出的元素/选择器)。
. css:为一组匹配的元素设置一个或多个 CSS 属性。


归档时间:

查看次数:

618554 次

最近记录:

5 年,10 月 前