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

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


当前回答

不幸的是,没有“上一个”同级选择器,但您仍然可以通过使用定位(例如向右浮动)获得相同的效果。这取决于你想做什么。

在我的情况下,我想要一个主要的CSS五星评级系统。我需要为之前的星星上色(或更换图标)。通过将每个元素向右浮动,我基本上得到了相同的效果(因此,星星的html必须写为“向后”)。

我在本例中使用FontAwesome,并在fa-star-o和fa-star的unicode之间进行交换http://fortawesome.github.io/Font-Awesome/

CSS:

.fa {
    display: inline-block;
    font-family: FontAwesome;
    font-style: normal;
    font-weight: normal;
    line-height: 1;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

/* set all stars to 'empty star' */
.stars-container {
    display: inline-block;      
}   

/* set all stars to 'empty star' */
.stars-container .star {
    float: right;
    display: inline-block;
    padding: 2px;
    color: orange;
    cursor: pointer;

}

.stars-container .star:before {
    content: "\f006"; /* fontAwesome empty star code */
}

/* set hovered star to 'filled star' */
.star:hover:before{
    content: "\f005"; /* fontAwesome filled star code */
}

/* set all stars after hovered to'filled star' 
** it will appear that it selects all after due to positioning */
.star:hover ~ .star:before {
    content: "\f005"; /* fontAwesome filled star code */
}

HTML格式:(40)

JSFiddle:http://jsfiddle.net/andrewleyva/88j0105g/

其他回答

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

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

/*默认链接颜色为蓝色*/.父级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/

这是类似问题的链接

CSS选择所有以前的兄弟姐妹以获得星级

因此,我使用每个人的回答来发布我的解决方案,任何人都可以将其作为参考,并可能提出改进建议。

//仅用于检查输入值//Consts公司const starRadios=document.querySelectorAll('input[name=“rating”]');//事件监听器starRadios.forEach((radio)=>radio.addEventListener('change',getStarRadioValue));//获取星形无线电值函数getStarRadioValue(事件){警报(event.target.value)//用它做点什么};.星级{字体大小:1.5rem;unicode bidi:bidi覆盖;方向:rtl;文本对齐:左侧;}.star-rating.editable标签:悬停{光标:指针;}.star-rating.editable.icon星形:悬停,.star-rating.editable.icon星形:悬停~.icon星形{背景色:#fb2727!重要的}.icon星形{位置:相对;背景色:#72747d;宽度:32px;高度:32px;显示:内联块;过渡:背景色0.3s;}.icon-star填充{背景色:#fb2727;}.icon星形>标签{显示:内联块;宽度:100%;高度:100%;左:0;顶部:0;位置:绝对;}.icon star>标签>输入[类型=“radio”]{位置:绝对;顶部:0;左:0;变换:translateY(50%)translateX(50%);显示:无;}<div class=“星级可编辑”><span class=“icon star”><标签><input type=“radio”name=“rating”value=“5”/></label></span><span class=“icon star”><标签><input type=“radio”name=“rating”value=“4”/></label></span><span class=“icon star”><标签><input type=“radio”name=“rating”value=“3”/></label></span><span class=“icon star”><标签><input type=“radio”name=“rating”value=“2”/></label></span><span class=“icon star”><标签><input type=“radio”name=“rating”value=“1”/></label></span></div>

如果您知道确切的位置,那么基于:nth-child()的排除以下所有兄弟姐妹将起作用。

ul li:not(:nth-child(n+3))

这将选择第三个之前的所有lis(例如第一个和第二个)。但是,在我看来,这看起来很难看,而且用例非常紧凑。

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

ul li:nth-child(-n+2)

这也是一样的。

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

假设我们有:

<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元素(或其他标签)的链接。