【问题标题】:How to make Sass mixin more robust如何让 Sass mixin 更健壮
【发布时间】:2014-06-10 02:36:15
【问题描述】:

说明

我有以下混合:

@mixin insideBorder ($thickness:2px, $color:black, $alpha:.05) {
    box-shadow:inset 0 0 0 $thickness rgba($color, $alpha);
}

A. 一种使用方式如下:

@include insideBorder();

将输出:

box-shadow: inset 0 0 0 2px rgba(0, 0, 0, 0.05);

B.我也可以这样使用:

@include insideBorder(5px, red);

将输出:

box-shadow: inset 0 0 0 2px rgba(255, 0, 0, 0.05);

问题

但是,如果我只想更改颜色,我会采用以下两种方式之一:

  1. @include insideBorder(#369);
  2. @include insideBorder(red);

然后我会编译为:

  1. box-shadow: inset 0 0 0 #336699 rgba(0, 0, 0, 0.05);
  2. box-shadow: inset 0 0 0 red rgba(0, 0, 0, 0.05);

或者如果我这样做:

  • @include insideBorder(red, .5);

它会报错:

Syntax error: $color: 0.5 is not a color for 'rgba'...

问题

我如何改进这个 mixin,使它可以接受任意数量的参数,但取决于参数的类型,mixin“知道”它属于哪里?

【问题讨论】:

  • 请不要在您的问题中发布解决方案,这不是本网站的工作方式。如果您找到问题的解决方案,请将其作为答案发布。
  • @RicardoZea 以后,如果您认为编辑是错误的,请询问为什么要进行编辑,而不是维护您的主导地位。这样做可以避免编辑大战和其他不愉快。如果有分歧,无法通过反复回滚解决:只能讨论。您对 TinyGiant 的回复应该是您想要返回的内容的理由。相反,您所说的我完全不能同意。与其声称自己知道自己在说什么,因为你在这里工作的时间更长,你应该对你的立场给出一个令人信服的解释:教育人们。

标签: css sass mixins


【解决方案1】:

使用我由@Eric M Suzanne 制作和改进的这个 sass 脚本

DEMO

$insideBorderThickness: 2px !default;
$insideBorderColor: black !default;
$insideBorderAlpha: .05 !default;

@mixin insideBorder($values...) {
    $borderThickness: $insideBorderThickness;
    $borderColor: $insideBorderColor;
    $borderAlpha: $insideBorderAlpha;

    @each $value in $values {
        @if type_of($value) == number {
            @if unit($value) == "" {
                $borderAlpha: $value;
            } @else {
                $borderThickness: $value;
            }
        } @else if type_of($value) == color {
            $borderColor: $value;
        }
    }

    box-shadow: inset 0 0 0 $borderThickness rgba($borderColor, $borderAlpha);
}


然后你可以像这样使用@include:

@include insideBorder();

@include insideBorder(20px);

@include insideBorder(blue);

@include insideBorder(.6);

@include insideBorder(3em, orange, .5);


逻辑:

  • 为 box-shadow 定义了第一个默认值。

  • 当使用 insideBorder() mixin 时,它会将默认值分配给内部变量(以避免在每次调用 mixin 时更改默认值)。

  • 接下来,它将检查值类型是否为“数字”并将其分配给 alpha 变量,如果类型为带有任何其他测量单位(如 em-px-rm)的数字,则将其分配给厚度,如果类型为颜色,将赋值给颜色变量。

  • 最后它会根据变量值创建盒子阴影css。

【讨论】:

  • 正是我正在寻找的:D。 TBH 我没想到会这么复杂,呵呵。你可以清楚地看出我对 Sass 很陌生。我在这里创建了一个演示:jsfiddle.net/aw752。感谢一百万伊姆兰!
  • 干得好!您可以使用一些很酷的 Sass 功能来进一步清理它,同时使其更加灵活。 I forked the fiddle 并使用默认设置、可变参数和更宽松的 if 语句进行了一些调整(因此您可以使用您喜欢的任何单位设置边框宽度)。
  • 嘿 Imran,我发现这个 mixin 有问题。如果 include 的值留空(意味着它将使用默认值),它不会设置任何样式。说得通?这是一个小提琴,看例子'E':jsfiddle.net/aw752/1
  • @ricardozea 你错过了 "e" 类的样式:) ~ 在你的小提琴中你错误地使用了 "a" 类选择器两次css。检查这个 fiddle
  • 这是一个“更漂亮”Demo in CodePen
【解决方案2】:

你的 Mixin 很好。使用此技术包括:

@include insideBorder($thickness: 3px, $color: black, $alpha: .1);

或者~改变厚度和alpha

@include insideBorder($thickness: 3px, $alpha: .1);

或者~只改变alpha

@include insideBorder($alpha: .1);

通过这种方式,您可以通过告诉哪个值将转到哪个变量来具体化。

您可以阅读更多HERE

【讨论】:

  • 感谢 Imran,但我不需要添加供应商前缀,我为此使用了 Autoprefixer。注意我上面示例中编译的 CSS 中的值,它们出现在错误的位置。顺便说一句,您的 @include 声明有错字,并且表述不正确,您缺少混合名称:@inlucde (inset 0 0 0 2px rgba(255, 0, 0, 0.05));
  • 很抱歉,顺便说一句,我已经编辑了我的答案以匹配你想要检查的内容
  • 伊姆兰没问题。你的第一个例子和我上面的完全一样。其他两个示例正在取出属性,这不是我想做的事情,否则我将直接使用 box-shadow 属性而不使用 mixin,这违背了这个目的。不过还是谢谢。
  • 好的,所以我添加了另一个答案,它在 mixin 方面很有用,但让我们在 @include 方面少写一些〜检查一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
相关资源
最近更新 更多