Sass .scss:嵌套和多个类?

mat*_*att 298 sass

我正在使用Sass(.scss)来完成我当前的项目.

以下示例:

HTML

<div class="container desc">
    <div class="hello">
        Hello World
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

SCSS

.container {
    background:red;
    color:white;

    .hello {
        padding-left:50px;
    }
}
Run Code Online (Sandbox Code Playgroud)

这非常有效.

我可以在使用嵌套样式时处理多个类.

在上面的示例中,我正在谈论这个:

CSS

.container.desc {
    background:blue;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,所有div.container通常会red,但div.container.desc会是蓝色的.

我如何container用Sass将其嵌入其中?

Chr*_*oph 523

您可以使用父选择器引用 &,它将在编译后由父选择器替换:

对于你的例子:

.container {
    background:red;
    &.desc{
       background:blue;
    }
}

/* compiles to: */
.container {
    background: red;
}
.container.desc {
    background: blue;
}
Run Code Online (Sandbox Code Playgroud)

&会彻底解决,因此,如果你的父母选择嵌套本身,嵌套将更换前解决&.

这种表示法最常用于编写伪元素和类:

.element{
    &:hover{ ... }
    &:nth-child(1){ ... }
}
Run Code Online (Sandbox Code Playgroud)

但是,您可以放置&几乎任何您喜欢的位置*,因此也可以使用以下内容:

.container {
    background:red;
    #id &{
       background:blue;
    }
}

/* compiles to: */
.container {
    background: red;
}
#id .container {
    background: blue;
}
Run Code Online (Sandbox Code Playgroud)

但请注意,这会以某种方式破坏您的嵌套结构,从而可能会增加在样式表中查找特定规则的工作量.

*:前面不允许有空格以外的其他字符&.所以你不能直接连接selector+ &- #id&会抛出错误.

  • 只是旁注,`&`的常见用法是使用伪元素和伪类.例如:`&:hover`. (11认同)
  • @crush 为了完整起见,我将此添加到我的答案中。谢谢你的意见。 (2认同)
  • 谢谢。我以为我很愚蠢,因为基础指南中没有提到它!顺便说一句,文档已将 URL 移至:http://sass-lang.com/documentation/file.SASS_REFERENCE.html#parent-selector (2认同)
  • 如果在一行的末尾使用了 `&amp;`,它将将该行放在所有其他级别的其余类的开头。你可以通过在 `.container` 下执行 `&amp;.desc` 来组合元素,这会将 .desc 附加到它,从而产生 `.container.desc` (2认同)

Mur*_*eam 14

如果是这种情况,我认为您需要使用更好的方法来创建类名或类名约定.例如,就像你说的那样,你希望.container课程根据具体的用法或外观有不同的颜色.你可以这样做:

SCSS

.container {
  background: red;

  &--desc {
    background: blue;
  }

  // or you can do a more specific name
  &--blue {
    background: blue;
  }

  &--red {
    background: red;
  }
}
Run Code Online (Sandbox Code Playgroud)

CSS

.container {
  background: red;
}

.container--desc {
  background: blue;
}

.container--blue {
  background: blue;
}

.container--red {
  background: red;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码基于类命名约定中的BEM方法.您可以查看以下链接:BEM - 块元素修改器方法

  • 请注意,这听起来不错,但应该不惜一切代价避免。将来当您尝试在项目中搜索“.container--desc”但最终没有结果时,您会感谢我。 (2认同)