加号选择器(+)用于选择下一个相邻同级。

前一个兄弟姐妹是否有同等的?


当前回答

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

.儿童{宽度:25px;高度:25px;}.child:悬停{背景:蓝色;}.child:has(+.child:悬停){背景:黄色;}.child:has(+.child+.child:悬停){背景:绿色;}.child:悬停+.child{背景:红色;}.child:悬停+.child+.child{背景:洋红色;}<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>

选择所有以前的同级

.儿童{宽度:25px;高度:25px;}.child:悬停{背景:蓝色;}.child:has(~.child:悬停){背景:红色;}<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>

其他回答

根据您的确切目标,有一种方法可以在不使用父选择器的情况下实现父选择器的有用性(即使存在)。。。

假设我们有:

<div>
  <ul>
    <li><a>Pants</a></li>
    <li><a>Socks</a></li>
    <ul>
      <li><a>White socks</a></li>
      <li><a>Blue socks</a></li>
    </ul>
  </ul>
</div>

我们可以做什么来使用间距使袜子块(包括袜子颜色)在视觉上突出?

什么会很好,但不存在:

ul li ul:parent {
  margin-top: 15px;
  margin-bottom: 15px;
}

存在的内容:

li > a {
  margin-top: 15px;
  display: block;
}
li > a:only-child {
  margin-top: 0px;
}

这将所有锚链接设置为顶部有15px的边距,并将其重置为0,以用于LI中没有UL元素(或其他标签)的链接。

没有“前一选择器”,但可以使用:not和~(“后选择器”)的组合。没有逆序,没有javascript。

.父级a{颜色:蓝色}.父项a.活动{颜色:红色}.parent a:不是(.parent a.active~a){颜色:红色}<div class=“parent”><a href=“”>链接</a><a href=“”>链接</a><a href=“”class=“active”>链接</a><a href=“”>链接</a><a href=“”>链接</a></div>

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

选择器级别4建议:has()(以前是主题指示符!),有一天,它将允许您选择前一个兄弟姐妹:

previous:has(+ next) {}

或(对于一般上一个兄弟姐妹而不是相邻兄弟姐妹):

previous:has(~ next) {}

在撰写本文时:has{}被大多数但不是所有主要浏览器支持。支持正在改善。


多年来,这个答案吸引了数十条“仍然不支持”的评论(现已删除)。请不要再添加了。答案中有一个指向定期更新的浏览器支持图表的链接。

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

您可以做的是使用CSS3选择器:名为nth-child()的伪类

#列表>*{显示:内联块;填充:20px 28px;右边距:5px;边框:1px实心#bbb;背景:#ddd;颜色:#444;边距:0.4em 0;}#列表:第n个子项(-n+4){颜色:#600b90;边框:1px红色虚线;背景:橙色;}<p>orange元素是使用li:nth child(-n+4)选择的上一个同级li</p><div id=“list”><span>1</span><!--将选择--><p>2</p><!--将选择--><p>3</p><!--将选择--><div>4</div><!--将选择--><div>5</div><p>6个</p><p>7个</p><p>8个</p><p>9个</p></div>

局限性

不能基于下一个元素的类选择上一个元素伪类也是如此

考虑flex和grid布局的order属性。

我将在下面的示例中重点讨论flexbox,但同样的概念适用于网格。


使用flexbox,可以模拟以前的同级选择器。

特别是,flex order属性可以在屏幕上移动元素。

下面是一个示例:

当元素B悬停时,您希望元素A变为红色。<ul><li>一个</li><li>B级</li></ul>

步骤

让ul成为一个柔性容器。ul{display:flex;}


颠倒标记中兄弟姐妹的顺序。<ul><li>B级</li><li>一个</li></ul>


使用同级选择器以元素a为目标(~或+即可)。li:悬停+li{背景色:红色;}


使用弹性顺序属性可以恢复视觉显示上同级的顺序。li:最后一个子项{顺序:-1;}


……瞧!上一个同级选择器已诞生(或至少是模拟的)。

以下是完整代码:

上一页{显示:柔性;}li:悬停+li{背景色:红色;}李:最后一个孩子{顺序:-1;}/*非必要装饰风格*/李{高度:200px;宽度:200px;背景色:浅绿色;边距:5px;列表样式类型:无;光标:指针;}<ul><li>B级</li><li>一个</li></ul>

根据flexbox规范:

5.4.显示顺序:顺序属性默认情况下,柔性项的显示和布局与源文档中显示的顺序相同。这个order属性可用于更改此排序。order属性通过将弹性项分配给序数组来控制弹性项在弹性容器中的显示顺序。它接受一个<integer>值,该值指定flex项的顺序组属于。

所有弹性项的初始订单值为0。

另请参见CSS网格布局规范中的顺序。


使用flex order属性创建的“以前的同级选择器”示例。

.container{display:flex;}.box5{顺序:1;}.box5:悬停+.box4{背景颜色:橙色;字体大小:1.5em;}.box6{顺序:-4;}.box7{顺序:-3;}.box8{顺序:-2;}.box9{顺序:-1;}.box9:hover~:not(.box12):第n个孩子(-1n+5){背景色:橙色;字体大小:1.5em;}.box12{顺序:2;}.box12:hover~:最后第n个孩子(-1n+2){背景色:橙色;字体大小:1.5em;}.box21{顺序:1;}.box21:悬停~.box{背景色:橙色;字体大小:1.5em;}/*非必要装饰风格*/.容器{填充:5px;背景色:#888;}.box格式{高度:50px;宽度:75px;边距:5px;背景色:浅绿色;显示:柔性;对齐内容:中心;对齐项目:居中;文本对齐:居中;光标:指针;}<p>使用flex<code>order</code>属性构造上一个同级选择器</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”><14</span></div><div class=“box box15”><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>

jsFiddle公司


附带说明——关于CSS的两个过时的信念

Flexbox打破了长期以来对CSS的信念。

一个这样的信念是,在CSS中不可能有前一个同级选择器。

如果说这种信念是普遍存在的,那就轻描淡写了。以下是关于堆栈溢出的相关问题示例:

使用选择器选择CSS中元素的前一个同级CSS:选择上一个同级CSS选择上一个同级CSS中的上一个相邻选择器悬停时选择上一个同级获取前一个同级的CSS选择器使用CSS更改悬停时同级元素的颜色如何使用selenium css语法选择上一个同级CSS选择器,用于选择在另一个元素之前出现的元素?如何仅使用CSS将样式添加到活动输入的上一个同级下一个和上一个元素的CSS选择器悬停div时如何影响其他元素

如上所述,这种观点并不完全正确。可以使用flex order属性在CSS中模拟以前的同级选择器。

z指数神话

另一个长期以来的观点是,z索引只对定位元素有效。

事实上,该规范的最新版本——W3C编辑草案——仍然认为这是正确的:

9.9.1指定堆栈级别:z索引所有物z指数值:auto||inherit初始:自动适用于:定位的图元继承:否百分比:不适用媒体:视觉计算值:按规定(添加强调)

然而,事实上,这些信息是过时和不准确的。

即使位置是静态的,作为弹性项或网格项的元素也可以创建堆叠上下文。

4.3.柔性项目Z-订购Flex项的绘制与内联块完全相同,除了使用订单修改的文档顺序代替原始文档顺序和z索引值而不是自动创建堆叠上下文,即使位置是静态的。5.4.Z轴排序:Z轴索引属性网格项的绘制顺序与内联块完全相同,除了顺序修改的文档顺序是用于代替原始文档顺序和z索引值,而不是自动创建堆叠上下文,即使位置是静态的。

下面是一个z索引在非定位弹性项上工作的演示:https://jsfiddle.net/m0wddwxs/