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

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


当前回答

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

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

/*默认链接颜色为蓝色*/.父级a{颜色:蓝色;}/*上一个兄弟姐妹应该是红色的*/.parent:悬停{颜色:红色;}.父项a:悬停,.父a:悬停~a{颜色:蓝色;}<div class=“parent”><a href=“#”>链接</a><a href=“#”>链接</a><a href=“#”>链接</a><a href=“#”>链接</a><a href=“#”>链接</a></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/

你可以使用双重否定

SELECTOR:not([SELECTOR]FILTER):not([SELECTOR]FILTER + SELECTOR) { ... }

用TAG或.CLASS替换SELECTOR(使用#ID可能太具体)。将FILTER替换为其他:PSUEDO-SELECTOR(我只尝试过:悬停)或.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) {}

/*解决方案*/div.parent:hover>div.child:not(:hover):not(:悬停~.child){背景色:红色;边界半径:1.5em;}div.parent:hover>div.child:not(:hover):not(:悬停~.child)>div{背景色:黄色;}/*做得漂亮(有点)*/分部租金{宽度:9em;高度:9em;/*布局*/显示:栅格;栅格样板列:自动自动;栅格样板行:自动自动;}分部子项{/*尺寸*/高度:3em;宽度:3em;/*布局*/位置:相对;/*光标*/光标:指针;/*演示文稿*/边框:1px黑色实心;边界半径:1.5em;}.星{/*尺寸*/宽度:2.5em;高度:2.5em;/*放置*/位置:绝对;顶部:50%;左:50%;转换:转换(-50%,-50%);/*几何形状*/-webkit剪辑路径:多边形(50% 0%,63% 38%,100% 38%,69% 59%,82% 100%,50% 75%,18% 100%,31% 59%,0% 38%,37% 38%);剪辑路径:多边形(50% 0%,63% 38%,100% 38%,69% 59%,82% 100%,50% 75%,18% 100%,31% 59%,0% 38%,37% 38%);/*演示文稿*/背景色:浅灰色;}div.child:悬停{/*演示文稿*/背景色:黄色;边界半径:1.5em;}div.child:悬停>div.star{/*演示文稿*/背景色:红色;}<div class=“parent”><div class=“child”href=“#”></div></div><div class=“child”href=“#”></div></div><div class=“child”href=“#”></div></div><div class=“child”href=“#”></div></div><div class=“child”href=“#”></div></div><div class=“child”href=“#”></div></div><div class=“child”href=“#”></div></div><div class=“child”href=“#”></div></div><div class=“child”href=“#”></div></div></div>

没有这样的选择器,但在DOM API中有一个非常只读的属性

Node.previousSibling节点

我找到了最简单的解决方案。它可能只适用于你正在做的事情。

假设您想将鼠标悬停在“sibling_2”上以更改以下示例中的“sibling_1”:

<div class='parent'><div class='sibling_1'></div><div class='sibling_2'></div></div>

由于没有以前的元素选择器,您可以简单地切换“sibling_1”和“sibling_2”并应用,使它们看起来相同。

.父级{显示:柔性;弯曲方向:行反转;}

现在您可以这样选择它们。.sibling_1:悬停~.sibling_2{#您的CSS}

虽然没有以前的CSS选择器。我找到了一个快速而简单的方法来自己选择一个。以下是HTML标记:

<div class="parent">
    <div class="child-1"></div>
    <div class="child-2"></div>
</div>

在JavaScript中,只需执行以下操作:

document.querySelector(".child-2").parentElement.querySelector(".child-1")

这将首先选择父div,然后从child-2 div中选择child-1 div。

如果您使用jQuery,只需执行以下操作:

$(".child-2").prev()