我有一个项目类和一个紧凑的“修饰符”类:
.item { ... }
.item.compact { /* styles to make .item smaller */ }
这很好。但是,我想添加一个@media
查询,以便在屏幕足够小时强制.item
类紧凑。
首先想到的是,这就是我试图做的事情:
.item { ... }
.item.compact { ... }
@media (max-width: 600px) {
.item { @extend .item.compact; }
}
但这会产生以下错误:
你可能不会在@media中扩展外部选择器。你可能只 同一指令中的@extend选择器。
如何使用SASS完成此操作而无需使用复制/粘贴样式?
答案 0 :(得分:75)
简单的答案是:你不能,因为Sass不能(或不会)为它组成选择器。您不能进入媒体查询并扩展媒体查询之外的内容。如果只是简单地复制它而不是试图组合选择器,那肯定会很好。但事实并非如此,你不能。
如果你有一个案例,你将要重新使用媒体查询内外的代码块,并希望它能够扩展它,那么写一个mixin和一个扩展类:
@mixin foo {
// do stuff
}
%foo {
@include foo;
}
// usage
.foo {
@extend %foo;
}
@media (min-width: 30em) {
.bar {
@include foo;
}
}
这对你的用例并没有多大帮助,但它是另一种选择:
%foo {
@media (min-width: 20em) {
color: red;
}
}
@media (min-width: 30em) {
%bar {
background: yellow;
}
}
// usage
.foo {
@extend %foo;
}
.bar {
@extend %bar;
}
关于这个问题有很多正在进行的讨论(请不要为这些线程做出贡献,除非你有一些有意义的东西要添加:维护者已经意识到用户需要这个功能,这只是一个如何实现它的问题以及语法应该是什么。)
答案 1 :(得分:11)
为了记录,这里是我最终解决问题的方法,只复制一次生成的样式:
// This is where the actual compact styles live
@mixin compact-mixin { /* ... */ }
// Include the compact mixin for items that are always compact
.item.compact { @include compact-mixin; }
// Here's the tricky part, due to how SASS handles extending
.item { ... }
// The following needs to be declared AFTER .item, else it'll
// be overridden by .item's NORMAL styles.
@media (max-width: 600px) {
%compact { @include compact-mixin; }
// Afterwards we can extend and
// customize different item compact styles
.item {
@extend %compact;
/* Other styles that override %compact */
}
// As shown below, we can extend the compact styles as many
// times as we want without needing to re-extend
// the compact mixin, thus avoiding generating duplicate css
.item-alt {
@extend %compact;
}
}
答案 2 :(得分:2)
我认为SASS / SCSS不支持媒体查询中的@extend
指令。 http://designshack.net/articles/css/sass-and-media-queries-what-you-can-and-cant-do/
您可能需要使用mixin,尽管代码膨胀需要与您的目标进行权衡。
答案 3 :(得分:1)
这是我发现的最干净,最局部的解决方案。它尽可能利用@extend,并在内部媒体查询时回退到mixins。
Cross-Media Query @extend Directives in Sass
请参阅文章了解详细信息,但要点是,您可以调用mixin'占位符'然后决定是输出@extend还是@include。
@include placeholder('clear') {
clear: both;
overflow: hidden;
}
.a {
@include _(clear);
}
.b {
@include _(clear);
}
.c {
@include breakpoint(medium) {
@include _(clear);
}
}
最终它可能不仅仅是使用mixins,这是目前公认的答案。
答案 4 :(得分:0)
我使用断点,但它的想法是一样的:
@mixin bp-small {
@media only screen and (max-width: 30em) {
@content;
}
如何使用它:
.sidebar {
width: 60%;
float: left;
@include bp-small {
width: 100%;
float: none;
}
}
有关于mixins的a text,您可以在其中找到有关此选项的更多信息。
答案 5 :(得分:-2)
你能重组吗?
.compact { //compact-styles }
.item {}
.item.compact { @extend .compact }
@media (max-width: 600px) {
.item { @extend .compact; }
}
如果我正确理解文档,那应该有用。我认为你尝试的方式不起作用的原因是它在解析@extend时没有看到.item.compact,但这是一个不知情的猜猜,所以用卡车装盐! :)