【问题标题】:how to use variable for @include name inide @each loop SCSS如何在@each循环SCSS中为@include名称使用变量
【发布时间】:2017-03-15 15:15:07
【问题描述】:

我想用 @each 用法替换这个 SCSS 代码。

body{
  @include us(){
    @include define-breakpoint("us")
  }
  @include xs(){
    @include define-breakpoint("xs")
  }
  @include sm(){
    @include define-breakpoint("xs")
  }
  @include md(){
    @include define-breakpoint("md")
  }
  @include lg(){
    @include define-breakpoint("lg")
  }
  @include xl(){
    @include define-breakpoint("xl")
  }
}

当我使用@each 函数编译器抛出一个错误 - 无效的 css with @include #{$bp}(){...}

$list: us xs sm md lg xl;
  @each $bp in $list{
    body{
    @include #{$bp}(){
      @include define-breakpoint("#{$bp}")
    }
    }
  }

大家都知道如何处理这个错误吗? 感谢任何帮助

【问题讨论】:

    标签: sass include each


    【解决方案1】:

    此代码的问题在于不能使用插值一个变量转换为一个标识符。 Sass 编译器不允许这样做。在您插入$bp 时,编译器需要一个标识符。它将那时的任何东西都视为标识符,而不是应该插值的东西。

    从您的代码看来,您已经定义了几个mixins@content 在块内传递,就像这样

    @mixin us() { @content; }
    @mixin sm() ( @contnet; }
    

    这就是他们被这样称呼的原因

    @include us(){
      @include define-breakpoint("us");
    }
    

    你可以重构你的代码,只使用一个mixin,因为唯一真正改变的是块中的代码。

    $list: us xs sm md lg xl;
    
    @mixin screen-size() { @content; }
    
    body {
      @each $size in $list {
        @include screen-size() {
          @include define-breakpoint($size);
        }
      }
    }
    

    另一种选择是定义 mixin 来代替参数,并让该块中的代码包含 define-breakpoint mixin 将参数作为参数传递。

    $list: us xs sm md lg xl;
    
    @mixin screen-size($size) { 
      @include define-breakpoint($size); 
    }
    
    body {
      @each $size in $list {
        @include screen-size($size);
      }
    }
    

    更新答案

    要实现代码中指定的附加功能,您可以对上一个答案进行以下调整

    //list now takes media query also
    $list: 'us' '(max-width: 519px)',
           'xs' '(min-width: 520px) and (max-width: 767px)',
           'sm' '(max-width: 768px)',
           'md' '(min-width: 769px)',
           'lg' '(min-width: 519px) and (max-width: 960px)',
           'xl' '(min-width: 961px)';
    
    //mixin takes media query as argument
    @mixin screen-size($query) {
      @media #{$query} {
        @content;
      }
    }
    
    body {
      @each $map in $list {
        @include screen-size( nth($map, 2) ) {
          @include define-breakpoint( nth($map,1) );
        }
      }
    }
    

    希望这能解决你的问题

    【讨论】:

    • 非常感谢您的回答。我的屏幕混合包含媒体查询:'@mixin us() { '@media (max-width: 519px) { '@content; } } '@mixin xs() { '@media (min-width: 520px) and (max-width: 767px) { @content; } } 所以如果我用 '@mixin screen-size(){'@content} 替换这些 mixin,我该如何考虑媒体查询?
    • 我已经考虑到这一点并更新了我之前的答案。它现在应该符合您的期望。
    • 在第二个 mixin 中我们不需要使用 $nth($map,1),只需 nth($map,1)
    • 我需要在我的 mixin 定义断点中有一个字符串 @mixin define-breakpoint($name){ &:after{ content: "#{$name}";显示:无; } }
    • 嘿,感谢您指出这一点,它应该是 nth 而不是 $nth。如果您希望这些值是字符串,则只需在 $list 变量中更改它们。用引号将它们括起来,例如'us''xs'...等等。我编辑了代码以显示$list 变量的外观。我希望这些改变就足够了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 2014-04-15
    • 2019-02-21
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多