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

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


当前回答

对于我的用例,需要更改焦点上的先前元素样式,并且悬停在父元素中只有两个项。为此,使用了:focuswithin和:hover伪类。

无论何时发生聚焦/悬停事件,都可以选择

.root元素:悬停.element到样式{background color:red;}.root元素:将焦点放在.element中,以设置样式{background color:green;}<div class=“root元素”>文本聚焦</span><input type=“text”placeholder=“type To Style”/></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/

我解决了这个问题,将元素放在一个柔性框中,然后使用flex direction:column reverse。

然后,我不得不手动反转HTML中的元素(以相反的顺序排列),这看起来很正常,而且很有效!

<div style="display: flex; flex-direction: column-reverse">
  <a class="element2">Element 2</a>
  <a class="element1">Element 1</a>
</div>
...
<style>
  .element2:hover + element1 {
    ...
  }
</style>

我需要一个解决方案来选择上一个兄弟tr。我使用React和Styled组件提出了这个解决方案。这不是我的确切解决方案(这是几小时后的记忆)。我知道setHighlighterRow函数存在缺陷。

OnMouseOver一行会将行索引设置为state,并使用新的背景色重新阅读前一行

class ReactClass extends Component {
  constructor() {
    this.state = {
       highlightRowIndex: null
    }
  }

  setHighlightedRow = (index) => {
    const highlightRowIndex = index === null ? null : index - 1;
    this.setState({highlightRowIndex});
  }

  render() {
    return (
       <Table>
        <Tbody>
           {arr.map((row, index) => {
                const isHighlighted = index === this.state.highlightRowIndex
                return {
                    <Trow 
                        isHighlighted={isHighlighted}
                        onMouseOver={() => this.setHighlightedRow(index)}
                        onMouseOut={() => this.setHighlightedRow(null)}
                        >
                        ...
                    </Trow>
                }
           })}  
        </Tbody>   
       </Table>
    )
  }
}

const Trow = styled.tr`
    & td {
        background-color: ${p => p.isHighlighted ? 'red' : 'white'};
    }

    &:hover {
        background-color: red;
    }
`;

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

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

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

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

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

这也是一样的。

可以按如下方式使用:has()。

.thePrevious:has(+ .theNextSibling)

我使用它来修复重叠的引导模式,如下所示。如果有多个模态,则之前的模态将被隐藏。

.modal.show.modal--open:has(~ .modal.show.modal--open){
   opacity: 0;
 }