使用与&组合的选择器列表在Sass SCSS中的嵌套选择器中

时间:2014-06-11 01:37:36

标签: css sass css-selectors ampersand

在我正在研究的S​​ass表中,我希望能够在变量中存储一些body类,并在嵌套在选择器内的选择器中使用它们来处理某些元素,例如这样:

$classes: ".bodyClass1, .bodyClass2";

.aClass, .anotherClass {
  /* some styles */
  #{$classes} & {
    /* Styles under $classes */
  }
  #{$classes} &:hover {
    /* Styles under $classes when hovering */
  }
}

我正在寻找的输出是:

.aClass, .anotherClass {
  /* some styles */
}
.bodyClass1 .aClass, .bodyClass2 .aClass, .bodyClass1 .anotherClass, .bodyClass2 .anotherClass {
  /* Styles under $classes */
}
.bodyClass1 .aClass:hover, .bodyClass2 .aClass:hover, .bodyClass1 .anotherClass:hover, .bodyClass2 .anotherClass:hover {
  /* Styles under $classes when hovering */
}

但它呈现为:

.aClass, .anotherClass {
  /* some styles */
}
.aClass .bodyClass1, .bodyClass2 .aClass, .anotherClass .bodyClass1, .bodyClass2 .anotherClass {
  /* Styles under $classes */
}
.aClass .bodyClass1, .bodyClass2 .aClass:hover, .anotherClass .bodyClass1, .bodyClass2 .anotherClass:hover {
  /* Styles under $classes when hovering */
}

我可以通过在&类之后使用&:hover&:activebody等创建单独的变量来解决此问题,但我想知道是否存在以我试图使用变量的方式使用变量。

编辑:

srekoble使用循环的解决方案对我来说非常有用!我将它改编成一个函数,如果其他人可能想要使用它,那么这就是:

$classes: ".bodyClass1", ".bodyClass2";

@function c($classes, $append: null){
  $processedClasses: "";

  $length: length($classes);

  @for $i from 1 through $length {
    @if $append {
      $processedClasses: #{$processedClasses}#{nth($classes, $i)} #{$append}#{", "};
    } @else {
      $processedClasses:  #{$processedClasses}#{nth($classes, $i)}#{", "};
    }
  }

  @return $processedClasses;
}

.aClass, .anotherClass {
  /* some styles */

  #{c($classes, "&")} {
    /* Styles under $classes */
  }
  #{c($classes, "&:hover")} {
    /* Styles under $classes when hovering */
  }
}

输出为:

.aClass, .anotherClass {
  /* some styles */
}
.bodyClass1 .aClass, .bodyClass2 .aClass, .bodyClass1 .anotherClass, .bodyClass2 .anotherClass {
  /* Styles under $classes */
}
.bodyClass1 .aClass:hover, .bodyClass2 .aClass:hover, .bodyClass1 .anotherClass:hover, .bodyClass2 .anotherClass:hover {
  /* Styles under $classes when hovering */
}

2 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

$classes: ".bodyClass1" , ".bodyClass2";

.aClass, .anotherClass {
  /* some styles */
  @for $i from 1 through 2 {
    #{nth($classes, $i)} & {
      /* Styles under $classes */
    }

    #{nth($classes, $i)} &:hover {
      /* Styles under $classes when hovering */
    }
  }
}

示例:http://sassmeister.com/gist/acb0096e9d35e1ae437d

答案 1 :(得分:2)

这将是另一种在我看来更具可扩展性的方法。因为每次更新变量时都不必编辑for循环中的数字。

$classes: (bodyClass1, bodyClass2);

@each $class in $classes {
  .aClass, .anotherClass {
    // your styles
    .#{$class} & {
      // your styles
      &:hover { 
         // your styles
      }
    }
  }
}

关于SassMeister http://sassmeister.com/gist/6edf0319bd4d8462fa95