首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我如何才能推翻SCSS中的@extend指令呢?

我如何才能推翻SCSS中的@extend指令呢?
EN

Stack Overflow用户
提问于 2016-06-17 19:16:13
回答 1查看 529关注 0票数 1

我在按钮组里有按钮。按钮组有不同的大小,例如button-group-large。我的目标是避免在按钮组中显式地设置每个按钮的大小,让它从按钮组中推断出大小。那就是,而不是

代码语言:javascript
复制
<div class="button-group-large">
  <button class="button-large">Foo</button>
  <button class="button-large">Bar</button>
</div>

我宁愿这样写:

代码语言:javascript
复制
<div class="button-group-large">
  <button>Foo</button>
  <button>Bar</button>
</div>

我可以这样做(在SASS中):

代码语言:javascript
复制
.button-group-large {
  button { @extend .button-large; }
}

这是可行的,但会产生以下问题。如果我的一个按钮有一个特殊的类,.button-large类将优先。也就是说,如果我做了

代码语言:javascript
复制
<div class="button-group-large">
  <button class="special">Foo</button>
  <button>Bar</button>
</div>

然后,.special.button-large之间任何不同的属性都将得到.button-large值,而不是.special值。我希望这是相反的;.special应该在这里获胜。(作为一个真实的例子,.special可能设置一个“主”按钮颜色)。

下面是一个演示这个问题的小摆设:https://jsfiddle.net/wwr63qmv/3/

作为参考点,引导按钮组通过要求在每个按钮上而不是在按钮组上单独设置类来避免这个问题。这可能是唯一的答案。还有其他方法可以让.special类在这里获胜吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-18 05:23:03

您所面临的问题不是由Sass或@extend指令造成的。这就是CSS的工作方式。如果多个选择器指向同一元素,则最特定的选择器将获胜(或),如果特异性相同,则文件中定义的最新选择器将获胜。

当编译时,小提琴中的SCSS代码将产生以下输出:

代码语言:javascript
复制
.button, ul.button-group li button { /* check this selector */
  border: 1px solid black;
  color: black;
  border-radius: 2px;
}
.special-button { /* and this */
  border: 1px solid green;
  color: green;
}
ul.button-group {
  margin: 10px;
}
ul.button-group li {
  list-style-type: none;
  display: inline-block;
  padding: 5px;
}
p {
  font-family: monospace;
}

这两个选择器- ul.button-group li button.special-button都将针对具有类为.special-button的按钮。第一个选择器的特异性是013 (因为它有一个类和三个类型选择器作为完整复杂选择器的一部分),而对于第二个选择器的特异性是010 (因为它只有一个类选择器)。因此,从本质上说,第一个选择器获胜,并且只有在它下面指定的属性才适用于元素。

为了使.special-button风格得到应用,应该增加选择器的特异性。这可以简单地通过将选择器更改为ul.button-group li button.special-button来完成,但这意味着选择器现在只针对buttonclass='special-button',后者位于liul父程序有class='button-group'li中。这使得它非常具体,并意味着如果button.special-buttonul.button-group li之外,则属性将不适用。

另一种选择是将.special-button也扩展到li中,如下所示:

代码语言:javascript
复制
ul.button-group {
  margin: 10px;
  li {
    list-style-type: none;
    display: inline-block;
    padding: 5px;
    button { 
      @extend .button;
      &.special-button { /* note this */
        @extend .special-button;
      }
    }
  }
}

小提琴演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37888874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档