SCSS / CSS 最接近父选择器

Posted

技术标签:

【中文标题】SCSS / CSS 最接近父选择器【英文标题】:SCSS / CSS closest parent selector 【发布时间】:2014-10-15 18:35:47 【问题描述】:

我正在使用具有多种样式的代码库(来自重新设计)。我希望能够在元素上声明 class="v1" 或 class="v2" 以确定要使用的样式。

重要的是,某些页面可能包含具有两种样式的元素,在这种情况下,应用的样式应该是最接近版本的父级。例如,如果 body 是 v1,但 div 是 v2,那么里面的任何样式都应该是 v2。

在 SCSS 中,我可以这样做:

.v1 
  p 
    // stuff for version 1 of the styles
  


.v2 
  p 
    // stuff for version 2 of the css
  

哪种方式可以让我到达那里,但 v2 总是会覆盖 v1,因为它在 CSS 中较低。

例如,以下应该是红色,然后是蓝色,然后是红色,然后是蓝色。但是,它是红色的,然后是蓝色的,然后是蓝色的,然后是蓝色的。

<html>
  <head>
  <style type="text/css">
    .v1 span 
      color: red;
    
    .v2 span 
      color: blue;
    
  </style>
  </head>
  <body class="v1">
    <span>Outside</span>
    <div class="v2">
      <span>Div 1</span>
      <div class="v1">
        <span>Div 2</span>
        <div class="v2">
          <span>Div 3</span>
        </div>
      </div>
    </div>
  </body>
</html>

有什么好的方法可以做到这一点?

【问题讨论】:

【参考方案1】:

编辑

根据 OP 的评论,此答案仅针对 OP 的特定测试用例,并不能完全解决问题。

看看CSS Child Selectors

您之前所做的是告诉页面将 v1 类中的所有内容作为一个跨度并将红色应用于它。子 div 内的跨度都在具有 v1 类的父 div 内。使用子选择器,您可以明确告诉它在特定类中查找 span 的子元素。

以下似乎有效:

.v1 > span 
  color: red;

.v2 > span 
  color: blue;

你可以在这里查看这个例子JsFiddle

【讨论】:

我不确定这是否会继续在更深的嵌套中起作用,但确实如此。 jsfiddle.net/gerq2jbq/1 这只适用于这个特定的例子(跨度正好在 .v1 和 .v2 内)。问题更笼统:假设我有两个样式表,用于一个重要的网站,我希望它们适用,但仅适用于两种不同的上下文。我可以使用 SCSS 的所有功能。 我已更新我的答案以反映它不满足所有要求。当我能够提供更好的解决方案时,我会再次编辑。

以上是关于SCSS / CSS 最接近父选择器的主要内容,如果未能解决你的问题,请参考以下文章

SCSS/CSS 选择器选择所有输入类型

如何在 SCSS 中使用 Mixin 覆盖引用父选择器

使用 Sass 将父选择器附加到末尾

SCSS学习手册

带有父选择器的 BEM 嵌套 SCSS 会破坏 Sublime Text 语法突出显示?

sass使用(浅解)