通过纯 CSS 选择一对中的 <br> 个元素之一

Selecting one of the <br> elements in a pair by pure CSS

有没有办法 select 一个元素,紧跟在另一个元素之后(或之前)纯 CSS?

敌人的例子,在 <br><br> 对中隐藏 <br> 之一:

<p>text text <br><br>text text <br>text text <br><br>text text</p>
<p>text text <br>text text <br><br>text text <br><br>text text</p>
<p>text text <br><br>text text <br>text text <br><br>text text</p>

并最终将其处理为:

<p>text text <br>text text <br>text text <br>text text</p>
<p>text text <br>text text <br>text text <br>text text</p>
<p>text text <br>text text <br>text text <br>text text</p>
br + brbr ~ br 申请的

display: none; 如上所述无效。

这里的问题是,唯一分隔 br 元素的是文本。 CSS 中的兄弟组合器忽略元素之间的所有 non-element 节点,包括(但不限于)注释、文本和空格,因此就 CSS 而言,您的所有段落正好有五个连续 br children 每个:

<p>  <br><br>  <br>  <br><br>  </p>
<p>  <br>  <br><br>  <br><br>  </p>
<p>  <br><br>  <br>  <br><br>  </p>

也就是说,每个段落中第一段之后的每个 br 是一个 br + br(并且扩展为 also a br ~ br)。

您将需要使用 JavaScript 来迭代段落,找到 br 紧跟或紧跟另一个 br 元素节点而不是文本节点的元素节点,并且删除所述其他节点。

var p = document.querySelectorAll('p');

for (var i = 0; i < p.length; i++) {
  var node = p[i].firstChild;

  while (node) {
    if (node.nodeName == 'BR' && node.nextSibling.nodeName == 'BR')
      p[i].removeChild(node.nextSibling);

    node = node.nextSibling;
  }
}
<p>text text <br><br>text text <br>text text <br><br>text text</p>
<p>text text <br>text text <br><br>text text <br><br>text text</p>
<p>text text <br><br>text text <br>text text <br><br>text text</p>

这可能不可靠,但至少在 Firefox 上有效:

br {
  display: block;
}

br {
  display: block;
}
<p>text text <br><br>text text <br>text text <br><br>text text</p>
<p>text text <br>text text <br><br>text text <br><br>text text</p>
<p>text text <br><br>text text <br>text text <br><br>text text</p>