【问题标题】:CSS/SCSS Adjacent sibling selector between certain typesCSS/SCSS 某些类型之间的相邻兄弟选择器
【发布时间】:2017-05-16 11:15:56
【问题描述】:

有没有什么方法可以完成兄弟选择器的所有组合,而不必一一写出来?

假设我想在第二个元素中使用font-size: 30px;,任何元素都可以是abspan

我通常会写:

a + b, b + a, a + span, span + a, b + span, span + b {
  font-size: 30px;
}

但这会导致n*(n-1) 组合!

我期待这样的事情:

{a,b,span} + {a,b,span} {
  font-size: 30px;
}

如果没有其他选择,请告诉我最好的选择是否始终确保包含的元素始终是我想要的类型,以便我可以使用 *:

* + * {...}

CSS 解决方案(如果可能),或 SCSS(如果它导致更清洁或唯一可能的解决方案)。

编辑:

你们中的一些人建议nth-child。虽然这对一两种格式有好处,但这不是我的目标(我的错,应该更好地指定它)。

我的意思是为包含不同格式的长 div 文本提供结果。即:

<div class="text">
  <span>The weather</span> <i>is</is> <img src... /> <b>nice</b> <span>today</span>
</div>

所以,我最初的想法是将我想要格式化的那些更改为&lt;div class="whatever"&gt;,这样我就可以将div 专注于某个类。但话又说回来,像{ span, i, b } 这样的东西是最理想的。

【问题讨论】:

  • 这个怎么样? jsfiddle.net/0zguo1jr/1
  • @VincentG 这不是理想的解决方案,我必须始终确保a 旁边的元素是我要格式化的类型。
  • 您可以使用* &gt; :nth-child(2):nth-child(2),但这会导致继承/级联问题,除非您真的希望每个第二个孩子(无限制)都被设计。
  • @DavidThomas Ugh 是的:/,我宁愿确保所有元素的类型都正确,而不是必须对每个 nth-child 进行硬编码

标签: css sass css-selectors


【解决方案1】:

在兼容的浏览器中 (sigh...),可以选择使用:

:matches(a, b, span) + :matches(a, b, span):nth-child(2) {
  color: #f90;
}

&lt;a&gt;&lt;b&gt;&lt;span&gt; 类型的前一个兄弟元素之后设置&lt;a&gt;&lt;b&gt;&lt;span&gt; 元素的样式。

当然,问题在于“在兼容的浏览器中”部分,到目前为止,IE 和 Edge 都不愿意加入那个特定的一方。此外,Webkit(Chrome、Opera 和 Android)正在使用 :-webkit-any() 实现以供应商为前缀的错误版本。不过,从好的方面来说,正如我现在所写的,Safari、桌面和 iOS 都正确地实现了 :matches() 伪类。

因此,如果您不需要 IE/Edge 支持,您可以选择:

:-webkit-any(a, b, span) + :-webkit-any(a, b, span):nth-child(2) {
  color: #f90;
}
:-moz-any(a, b, span) + :-moz-any(a, b, span):nth-child(2) {
  color: #f90;
}
:matches(a, b, span) + :matches(a, b, span):nth-child(2) {
  color: #f90;
}

a::before {
  content: 'link';
}
b::before {
  content: 'bold'
}
span::before {
  content: 'span';
}
em::before {
  content: 'em';
}
:-webkit-any(a,
b,
span) +:-webkit-any(a,
b,
span):nth-child(2) {
  color: #f90;
}
:-moz-any(a,
b,
span) +:-moz-any(a,
b,
span):nth-child(2) {
  color: #f90;
}
:matches(a,
b,
span) +:matches(a,
b,
span):nth-child(2) {
  color: #f90;
}
<div>
  <a href="#"></a> <span></span>
</div>
<div><span></span>
  <a href="#"></a>
</div>
<div><b></b>  <span></span>
</div>
<div><b></b>
  <a href="#"></a>
</div>
<div><b></b>  <em></em>
</div>
<div><em></em>
  <a href="#"></a>
</div>

JS Fiddle demo.

参考资料:

【讨论】:

  • anymatches 绝对是我要找的东西
  • 很高兴能帮上忙!虽然我有点失望 - 经过半小时的观察 - 我仍然无法弄清楚如何在 SCSS/SASS 中实现相同的效果(尽管在我的辩护中我从未使用过它之前...)。
  • 考虑到 CSS 可以与 SCSS 一起使用,我对此很满意。再次感谢:)
  • 伪类最初由 Moz 实现为 :-moz-any() 供内部使用多年,然后才被提议并指定为 :matches()。称其为“不正确”充其量是不诚实的。此外,现在是 2017 年,但我认为除 Apple 之外的任何供应商都没有计划实施全部或大部分 selectors-4。谁知道这需要多长时间。
  • 另外,IE is no longer being actively developed。未来只有 Microsoft Edge 会接收新功能。
【解决方案2】:

我认为

a *:nth-child(2), b *:nth-child(2) {
  font-size: 30px;
}

应该工作

【讨论】:

  • 您的意思是写@DavidThomas 刚刚评论的内容吗?如果是这样的话,我的回答还是一样。我宁愿确保所有元素都是正确的类型,而不是必须对每个 nth-child 进行硬编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
  • 2011-10-30
  • 2012-03-08
  • 1970-01-01
  • 2017-12-18
相关资源
最近更新 更多