父选择器
在内部选择器中使用父选择器时,它会被相应的外部选择器替换。发生这种情况,而不是正常的嵌套行为。
SCSS 语法
.alert {
// The parent selector can be used to add pseudo-classes to the outer
// selector.
&:hover {
font-weight: bold;
}
// It can also be used to style the outer selector in a certain context, such
// as a body set to use a right-to-left language.
[dir=rtl] & {
margin-left: 0;
margin-right: 10px;
}
// You can even use it as an argument to pseudo-class selectors.
:not(&) {
opacity: 0.8;
}
}
Sass语法
.alert
// The parent selector can be used to add pseudo-classes to the outer
// selector.
&:hover
font-weight: bold
// It can also be used to style the outer selector in a certain context, such
// as a body set to use a right-to-left language.
[dir=rtl] &
margin-left: 0
margin-right: 10px
// You can even use it as an argument to pseudo-class selectors.
:not(&)
opacity: 0.8
CSS 输出
.alert:hover {
font-weight: bold;
}
[dir=rtl] .alert {
margin-left: 0;
margin-right: 10px;
}
:not(.alert) {
opacity: 0.8;
}
Head️抬头!
由于父选择器可以由类似的类型选择器代替h1
,因此只能在复合选择器的开始处允许,也可以使用类型选择器。例如,span&
不允许。
不过,我们正在考虑放宽此限制。如果您想帮助实现这一点,请查看GitHub问题。
添加后缀永久链接添加后缀
您还可以使用父选择器向外部选择器添加额外的后缀。当使用像BEM 这样的方法来使用高度结构化的类名时,这特别有用。只要外部选择器以字母数字名称结尾(如类,ID和元素选择器),就可以使用父选择器附加其他文本。
SCSS 语法
.accordion {
max-width: 600px;
margin: 4rem auto;
width: 90%;
font-family: "Raleway", sans-serif;
background: #f4f4f4;
&__copy {
display: none;
padding: 1rem 1.5rem 2rem 1.5rem;
color: gray;
line-height: 1.6;
font-size: 14px;
font-weight: 500;
&--open {
display: block;
}
}
}
Sass语法
.accordion
max-width: 600px
margin: 4rem auto
width: 90%
font-family: "Raleway", sans-serif
background: #f4f4f4
&__copy
display: none
padding: 1rem 1.5rem 2rem 1.5rem
color: gray
line-height: 1.6
font-size: 14px
font-weight: 500
&--open
display: block
CSS 输出
.accordion {
max-width: 600px;
margin: 4rem auto;
width: 90%;
font-family: "Raleway", sans-serif;
background: #f4f4f4;
}
.accordion__copy {
display: none;
padding: 1rem 1.5rem 2rem 1.5rem;
color: gray;
line-height: 1.6;
font-size: 14px;
font-weight: 500;
}
.accordion__copy--open {
display: block;
}
在SassScript中永久链接在SassScript中
父选择器也可以在SassScript中使用。这是一个特殊表达式,它以选择器函数使用的相同格式返回当前的父选择器:一个逗号分隔的列表(选择器列表),该列表包含以空格分隔的列表(复杂的选择器),该列表包含未加引号的字符串(复合选择器)。
SCSS 语法
.main aside:hover,
.sidebar p {
parent-selector: &;
// => ((unquote(".main") unquote("aside:hover")),
// (unquote(".sidebar") unquote("p")))
}
Sass语法
.main aside:hover,
.sidebar p
parent-selector: &
// => ((unquote(".main") unquote("aside:hover")),
// (unquote(".sidebar") unquote("p")))
CSS 输出
.main aside:hover,
.sidebar p {
parent-selector: .main aside:hover, .sidebar p;
}
如果&
表达式在任何样式规则之外使用,则返回null
。由于null
为false,这意味着您可以轻松地使用它来确定是否在样式规则中调用了mixin。
SCSS 语法
@mixin app-background($color) {
#{if(&, '&.app-background', '.app-background')} {
background-color: $color;
color: rgba(#fff, 0.75);
}
}
@include app-background(#036);
.sidebar {
@include app-background(#c6538c);
}
Sass语法
@mixin app-background($color)
#{if(&, '&.app-background', '.app-background')}
background-color: $color
color: rgba(#fff, 0.75)
@include app-background(#036)
.sidebar
@include app-background(#c6538c)
CSS 输出
.app-background {
background-color: #036;
color: rgba(255, 255, 255, 0.75);
}
.sidebar.app-background {
background-color: #c6538c;
color: rgba(255, 255, 255, 0.75);
}
高级嵌套永久链接高级嵌套
您可以将其&
用作普通的SassScript表达式,这意味着您可以将其传递给函数或将其包括在插值中,甚至可以包含在其他选择器中!将其与选择器功能和@at-root
规则结合使用,可以使您以非常强大的方式嵌套选择器。
例如,假设您要编写一个与外部选择器和元素选择器匹配的选择器。你可以这样写一个使用一个混合selector.unify()
功能结合&
了用户的选择。
SCSS 语法
@use "sass:selector";
@mixin unify-parent($child) {
@at-root #{selector.unify(&, $child)} {
@content;
}
}
.wrapper .field {
@include unify-parent("input") {
/* ... */
}
@include unify-parent("select") {
/* ... */
}
}
Sass语法
@use "sass:selector"
@mixin unify-parent($child)
@at-root #{selector.unify(&, $child)}
@content
.wrapper .field
@include unify-parent("input")
/* ...
@include unify-parent("select")
/* ...
CSS 输出
.wrapper input.field {
/* ... */
}
.wrapper select.field {
/* ... */
}
Head️抬头!
当Sass嵌套选择器时,它不知道用来生成选择器的插值方法。这意味着即使您用作&
SassScript表达式,它也会自动将外部选择器添加到内部选择器。这就是为什么您需要显式使用@at-root
规则来告诉Sass不包括外部选择器的原因。