【问题标题】:SCSS @extend inside media query alternatives to avoid duplicate propertiesSCSS @extend 在媒体查询替代方案中避免重复属性
【发布时间】:2017-11-22 06:38:42
【问题描述】:

SCSS 中,您可以使用@mixin@extend 来重用代码。例如:

%even-row { background: pink; }

@mixin even-rows-mixin($columns) {
    @for $i from 1 through $columns {
        &:nth-child(#{2 * $columns}n + #{$i + $columns}) {
            @extend %even-row;
        }
    }
}

li {
    @include even-rows-mixin(8);
    width: 12%;
}

将生成:

li:nth-child(16n + 9),
li:nth-child(16n + 10),
li:nth-child(16n + 11),
li:nth-child(16n + 12),
li:nth-child(16n + 13),
li:nth-child(16n + 14),
li:nth-child(16n + 15),
li:nth-child(16n + 16) {
    background: pink;
}

li {
    width: 12%;
}

但是,我想在媒体查询中使用 mixin,这是不可能的:

@media (max-width: X) {
    li {
        @include even-rows-mixin(8);
        width: 12%;
    }
}

@media (max-width: Y) {
    li {
        @include even-rows-mixin(4);
        width: 16%;
    }
}

这会抛出一个错误:

You may not @extend an outer selector from within @media. You may only 
@extend selectors within the same directive. From "@extend %even-row"
on line N.

我可以删除@extend 并内联mixin 中的属性:

@mixin even-rows-mixin($columns) {
    @for $i from 1 through $columns {
        &:nth-child(#{2 * $columns}n + #{$i + $columns}) {
            background: pink;
        }
    }
}

但这会产生重复的代码:

@nth-child(16n + 9)  { background: pink; }
@nth-child(16n + 10) { background: pink; }

...

@nth-child(16n + 16) { background: pink; }

我想知道是否有更好的方法来编写此代码,而无需生成重复的属性或不必手动编写所有可能的选择器,可能使用插值或其他一些我不知道的功能。

这个问题是在回答了另一个问题后提出的:How to select even rows with list items,如果您想了解整个事情,请作为参考。

【问题讨论】:

    标签: css sass media-queries mixins extend


    【解决方案1】:

    你可以用整个选择器组构造一个选择器变量。

    @mixin even-rows-mixin($columns, $rule) {
       $selector : '';
        @for $i from 1 through $columns {
          $selector:  $selector + $rule + '('+ #{2 * $columns}n  + "+" + #{$i + $columns} + ') ,';
        }  
      #{$selector} {
        @content;
      }
    }
    
    li {
        width: 12%;
    }
    @include even-rows-mixin(8, 'li:nth-child') {
     background-color: pink; 
    };
    

    注意:由于某种原因,它在 codepen 编辑器中不起作用。但它正在使用 node-sass

    【讨论】:

      【解决方案2】:

      你能把%even-row 放在mixin 定义中吗?不过我没试过,可能会报错。

      【讨论】:

      • 这是一个想法,但我觉得它有点 hacky:在每个媒体查询的范围内创建一个变量,例如 $mixin-iteration: 0; 并且每次调用 mixin 时,检查变量的值是否为零并且添加%even-row,并增加变量的值。这样每个媒体查询只会被调用一次……我想?
      • 无论如何这都行不通,因为您仍在媒体查询中使用@extend。即使确实如此,如果您只是在第一次迭代中调用它,那么除了第一个选择器之外的所有选择器都将丢失。看看@karthick 的回答,这正是我所说的使用插值
      • 这确实是一个不错的方法,我很高兴有人可以帮助你。我应该在发布之前尝试测试我的建议!
      猜你喜欢
      • 2013-03-26
      • 2012-11-18
      • 2011-07-27
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 2011-02-12
      相关资源
      最近更新 更多