8

问题

我目前在泡菜。我需要在 Sass 循环中对选择器进行分组。我尝试了许多不同的方法来做到这一点,例如:

body {
    $store: null;
    @for $i from 1 through 10 {
        $store: append($store, ".offset-by-#{$i}", comma);
    }
    // produces content: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;
    @each $j in $store {
        $store: unquote($j);
    }
    // produces .offset-by-10
}

我正在尝试使用纯 Sass(无 Ruby)来完成以下工作:

.offset-by-1,
.offset-by-2,
.offset-by-3,
...
.offset-by-10 { foo: bar; }

如果你是 Sass 大神,那么请告诉我在这里做什么。如果这是元语言的固有限制,那么也让我知道!

注意事项

我不能使用除了 mixin 之外的任何东西来完成此操作,因为预计函数将用于属性值。另一方面,mixin 允许生成整个代码块。

4

3 回答 3

17

保持简单,士兵!

%foo {
  foo: bar; }

@for $i from 1 through 10 {
  .offset-by-#{$i} {
    @extend %foo; }}

UPD您还可以使用这种方法拥有单独的样式:

%foo {
  foo: bar; }

@for $i from 1 through 10 {
  .offset-by-#{$i} {
    @extend %foo;
    margin-left: 50px * $i; }}

这导致以下CSS:

.offset-by-1, .offset-by-2, .offset-by-3, .offset-by-4, .offset-by-5, .offset-by-6, .offset-by-7, .offset-by-8, .offset-by-9, .offset-by-10 {
  foo: bar; }

.offset-by-1 {
  margin-left: 50px; }

.offset-by-2 {
  margin-left: 100px; }

.offset-by-3 {
  margin-left: 150px; }

.offset-by-4 {
  margin-left: 200px; }

.offset-by-5 {
  margin-left: 250px; }

.offset-by-6 {
  margin-left: 300px; }

.offset-by-7 {
  margin-left: 350px; }

.offset-by-8 {
  margin-left: 400px; }

.offset-by-9 {
  margin-left: 450px; }

.offset-by-10 {
  margin-left: 500px; }
于 2013-07-10T09:04:03.930 回答
10

你有没有尝试过这样的事情:

@mixin createNumbered($num, $className){
    @for $i from 1 through $num {
        .#{$className}-#{$i} {
            @content;
        }
    }
}

@include createNumbered(10, 'foo-bar'){
    color: white;
}

更新:

@mixin createNumbered($num, $className){
    $foo : '';
    @for $i from 1 through $num {
        $foo : $foo + '.' + $className + '-' + $i + ', ';
    }
    #{$foo} {
        @content;
    }
}

@include createNumbered(10, 'foo-bar'){
    color: white;
}
于 2013-07-09T23:02:18.890 回答
0

对于您的需要,这可能是多余的,但我需要能够添加:last-child到课程列表中。我在克拉克潘的答案上建立了这个:

@mixin group-classes($start, $stop, $step, $selector, $selector-suffix, $property, $value) {

  $selector-list: '';

  $i: $start;

  @while $i <= $stop {

    $comma: ', ';

    @if $i == $stop {
      $comma: '';
    }

    $selector-list: $selector-list + $selector + '-' + $i + $selector-suffix + $comma;

    $i: $i + $step;

  }

  #{$selector-list} {
    #{$property}: #{$value}
  }

}

然后使用它:

@include group-classes(1, 3, 1, '.e > .g', ':last-child', 'margin', 0);

结果:

.e > .g-1:first-child,
.e > .g-2:first-child,
.e > .g-3:first-child {
    margin:0!important;
}
于 2021-11-23T15:43:49.403 回答