SASS 带有可选和可变参数的混合

SASS Mixin with optional and variable parameters

有没有办法在 sass mixin 中同时使用可选元素和可变元素?

我试试

@mixin name($className,  $centered: false, $dimension...)

但第一个维度值分配​​给了$centered

切换参数顺序不编译

@mixin name($className, $dimension..., $centered: false )

错误是:

SASSInvalid CSS after "..., $dimension...": expected ")", was ", $centered: fa..."

因为没有可选参数的 mixin 在很多地方使用(超过 70 个)我不希望你改变它来添加新参数,所以我想保留它可选?

有什么方法可以改变这个 mixin,或者我必须在没有 $centered 的情况下保留原始版本并使用新参数创建一个 ovverride?

有关信息,这是混合主体:

    @for $i from 1 through length($dimension){                              
        @if($centered) {
            .#{$className}Td#{$i}, .#{$className}Th#{$i}  { 
                width: nth($dimension, $i); 
                text-align:center;
            }
        }
        @else{
            .#{$className}Td#{$i}, .#{$className}Th#{$i} {width: nth($dimension, $i); }
        }
    }

使用完整的牛皮示例进行编辑:

只是我以更快的方式为我的 table 的列宽定义 css,所以这个

@include nome("columnsName", 40%, 30%, 30%);

以这种方式呈现:

.columnsNameTd1, .columnsNameTh1{width: 40%;}

.columnsNameTd2, .columnsNameTh2{ width: 30%; }

.columnsNameTd3, .columnsNameTh3{ width: 30%;}

我想要一种方法让所有列的文本居中对齐,也许会很有趣,看看是否有一种方法可以指定居中的列,让所有其他列默认居中

好的,如果您尝试测试列表的最后一个值怎么办,因为 sass 似乎不支持列表后的任何其他参数作为参数。

@function last($list) {
  @return nth($list, length($list));
}
//returns the last item of a list

@mixin nome($className, $dimension...) {
    @for $i from 1 through length($dimension){
        @if(last($dimension) == true) {
            .#{$className}Td#{$i}, .#{$className}Th#{$i}  {
                width: nth($dimension, $i);
                text-align:center;
            }
        }
        @else{
            .#{$className}Td#{$i}, .#{$className}Th#{$i} {width: nth($dimension, $i); }
        }
    }
}

因此,如果您添加 @include nome("className", 4%, 4%, 4%, 6%, 70%, 12%, true); 并且最后一个值是 true,它应该使您的 div 居中,或者无论您想做什么!

你不能按照你的要求去做,因为可变参数(... 语法)绝对必须在最后。您有 2 个选项,我推荐选项 #2。

选项 1(检查最后一个元素是否为布尔值):

@mixin name($className, $dimension...) {
    $last: nth($dimension, length($dimension));
    $centered: if(type-of($last) == bool, $last, false);
    $length: if(type-of($last) == bool, length($dimension) - 1, length($dimension));

    @for $i from 1 through $length {
        .#{$className}Td#{$i}, .#{$className}Th#{$i} {
            width: nth($dimension, $i);
            @if($centered) {
                text-align: center;
            }
        }
    }
}

选项 2(使用 @content 指令):

@mixin name($className, $dimension...) {
    @for $i from 1 through length($dimension) {
        .#{$className}Td#{$i}, .#{$className}Th#{$i} {
            width: nth($dimension, $i);
            @content;
        }
    }
}

// usage
@include name(rar, 10%, 20%, 30%);

@include name(rar, 10%, 20%, 30%) {
    text-align: center;
}