【问题标题】:SASS simplify a mixin with prefixesSASS 使用前缀简化 mixin
【发布时间】:2012-05-25 10:26:40
【问题描述】:

有没有更简洁的方法来做到这一点?

@each $prefix in webkit moz ms o {

    -#{$prefix}-transition: all 1s linear;
}
transition: all 1s linear;

我讨厌冗余,如果我能做得更简单,我更愿意

编辑:

只是为了清楚。我不是在寻找实现转换的方法,我想要的是更简单的代码。在我给你的例子中,我写了 2 倍的销售属性。我想对此进行优化。这是我要查找的示例(但 这不是有效的 SCSS)

@each $prefix in "-webkit-", "-moz-", "-ms-", "-o-", "" {

    #{$prefix}transition: all 1s linear;
}

【问题讨论】:

  • 我不确定你是如何评估“冗余”的。有时这与“复杂性”相反——The_One_Who_Follows_The_Spec 有一行,Others_Who_Dont 有一个 @each(这个列表将会消失随着时间的推移).. 将它们分开是更好的职责分离。此外,主观上,下面没有什么比你的版本更清楚地说明它的意图了,也不比你的版本更简洁 - 我很惊讶你正在寻找“改进”它。

标签: sass


【解决方案1】:

Transition 并不是唯一需要前缀的属性。随着供应商添加支持,您可以停止包含前缀。如果您将 mixin 的每个部分都抽象出来,那么从长远来看,您的代码将更易于维护。

$default-prefixes: webkit moz ms o;

@mixin build-prefix-values($property, $value, $prefixes: $default-prefixes) {
    @each $prefix in $prefixes {
        -#{$prefix}-#{$property}: #{$value};
    }
    #{$property}: #{$value};
} 

@mixin transition($property: all, $delay: 1s, $timing: linear) {
    $value: $property $delay $timing;
    // use default prefixes
    @include build-prefix-values('transition', $value);
}

// using defaults of 'all' '1s' and 'linear'
p {
    @include transition();
}

// using custom values
.fast {
    @include transition('height', '.1s', 'ease', '0');
}

现在假设您想为border-radius 编写一个@mixin,其中webkit 是您需要的唯一前缀。

@mixin border-radius($radius) {
    $prefixes: webkit;
    @include build-prefix-values('border-radius', $radius, $prefixes);
}

【讨论】:

  • 这并没有解决我的问题。此代码使用与我的代码相同的指令:首先对前缀使用循环,然后再次编写不带前缀的指令。
  • 较少关注优化 3 行代码,而更多地关注使其在本项目和下一个项目的生命周期内可重用。我的答案通过声明前缀 once 并声明循环 once 来消除冗余,这样您就可以一遍又一遍地重用它。当每个主流浏览器都支持每个没有前缀的 CSS3 属性时,您将能够编辑 one 位置 once 以消除所有额外的麻烦。如果一个新的浏览器风靡市场,你必须添加另一个前缀,你只需要进行 one 更改。这使您的代码更易于阅读和维护,从而更简单。
  • 您无视我的问题的性质,并假设我想用它实现什么。我不是在问如何为 css3 属性构建 mixins。我在问如何优化某些代码,如果可能的话。
【解决方案2】:

您可以使用 unquote sass function 取消引用每个前缀。我的意思是:

@each $prefix in "-webkit-", "-moz-", "-ms-", "-o-", "" {
    #{unquote($prefix)}transition: all 1s linear;
}

我认为这是实现它的更清洁的方法。

【讨论】:

    【解决方案3】:

    在 Bourbon 中,你有类似的 mixin(顺便说一下,我建议在你需要很多类似的东西时使用它):http://thoughtbot.com/bourbon/#transitions

    及其代码:https://github.com/thoughtbot/bourbon/blob/master/app/assets/stylesheets/functions/_transition-property-name.scss

    在此基础上,你有或多或少的最优解。

    【讨论】:

    • 这是一个有趣的链接,但它并没有真正回答我的问题。这个链接(github.com/thoughtbot/bourbon/blob/master/app/assets/…)确实是我对波旁威士忌感兴趣的地方,但正如你所看到的,它也是多余的。我正在寻找一种更清洁的方式。
    • 是的,很容易有 10 个“你可以使用 x”(例如,指南针)答案,但这不是 OP 所要求的......
    • @JustinMaxwell,感谢您的评论。在我的回答中,我给出了波旁威士忌中类似代码的链接。有与 OP 大致相同的解决方案。基于此,我得出结论,几乎不可能再优化。这就是我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 2012-09-14
    • 1970-01-01
    • 2020-03-08
    • 2021-09-24
    • 2019-08-19
    相关资源
    最近更新 更多