【问题标题】:Sass: Browser vendor prefixesSass:浏览器供应商前缀
【发布时间】:2012-09-29 02:09:04
【问题描述】:

我对 Sass/Compass 非常陌生,所以这个问题对你们中的许多人来说可能听起来很愚蠢。

无论如何,我需要知道的是如何为浏览器供应商前缀创建一个 mixin,我可以一遍又一遍地重复使用,而不必每次都键入它们。

我在网上看过教程,但我无法理解正确应用它们所需的一些概念。

我现在需要的是在 CSS 中完成这个:

* { 
    -webkit-box-sizing:border-box;
       -moz-box-sizing:border-box;          
        -ms-box-sizing:border-box; 
         -o-box-sizing:border-box; 
            box-sizing:border-box; 
  }

谢谢。

【问题讨论】:

    标签: sass


    【解决方案1】:

    听起来你想使用 Compass box-sizing mixin。您的 SASS 文件如下所示:

    @import "compass/css3/box-sizing";
    
    * {
        @include box-sizing(border-box);
    }
    

    并且会编译成这样:

    * {
      -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
      box-sizing: border-box; }
    

    您可以查看其他 CSS3 Compass mixins here。但请注意,Compass 不包括像 -ms-box-sizing 这样的前缀,例如,因为 IE8+ has implemented it without a prefix。如果你真的想要这些额外的属性,你会这样做:

    @import "compass/css3/shared"
    
    * {
        @include experimental(box-sizing, border-box, -moz, -webkit, -o, -ms, not -khtml, official);
    }
    

    【讨论】:

    • hopper,当我将它添加到我的 .scss 文件 @import "compass/css3/box-sizing"; 时,会在 .css 文件中注入一个编译错误。这是怎么回事?文件"box-sizing 在哪里?谢谢。
    • box-sizing 文件位于 Compass gem 的内部。你是如何执行编译的?如果您使用 SASS 命令行进行编译,则需要指定 --compass 选项以确保 Compass 文件位于加载路径上,例如sass --compass file.scss file.css.
    • 我在 CMD 行中所做的是:(已经在我的项目文件夹中)sass --watch scss:css --style compact。我在看文件夹,而不是文件。需要加--compass file.scss file.css吗?如果是这样,我是否必须使用这些文件,或者我可以让它“监视”文件夹吗? Tnx。
    • 监视文件夹应该可以正常工作 - 您只需在命令中添加 --compass 标志:sass --watch scss:css --style compact --compass
    • 啊哈!嗯,这是他们在我读过的任何教程中都没有提到的部分:如果你想使用 Compass 已经构建的 mixins,你需要在你的 CMD 行中包含 compass 标志“--compass”。它工作得很好。谢谢!
    【解决方案2】:

    我也想抽象出供应商前缀,但没有可用的指南针。

    @mixin vendor-prefix($name, $value) {
      @each $vendor in ('-webkit-', '-moz-', '-ms-', '-o-', '') {
        #{$vendor}#{$name}: #{$value};
      }
    }
    

    萨斯:

    * {
      @include vendor-prefix('box-sizing', 'border-box');
    }
    

    渲染:

    * {
      -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
      -ms-box-sizing: border-box;
      -o-box-sizing: border-box;
      box-sizing: border-box; }
    

    另见:
    http://stefanwienert.net/blog/2012/05/18/easy-css-vendor-prefix-mixin-for-sass/

    【讨论】:

    • 有趣的 Rimian 和非常方便的解决方案。不过,我只是看不到在没有 Compass 的情况下使用 Sass。谢谢你的信息,给你一个upvote。
    • 没有问题!我正在一个已经存在的框架内构建一个移动站点。我想我可能会看看我是否可以提供指南针。 :)
    • 这可能是最有用的答案,因为它可以推广到其他属性。
    • 用 mixin 来做是愚蠢的。如果您总是希望它用于某些属性,为什么要记住使用它?它应该在编译时自动发生。
    【解决方案3】:

    这是我处理供应商前缀的 sass 解决方案:https://github.com/Aloge/sass-prefixer

    它类似于@rimian 的解决方案,但您只需要包含一个带有 css 属性及其值的 mixin,它就会自动呈现带有必要供应商前缀的 css。 所以这个:

    * {
      @include prefix(box-sizing, border-box)
    }
    

    渲染:

    * {
      -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
      box-sizing: border-box;
    }
    

    但是这个:

    * {
      @include prefix(display, flex)
    }
    

    渲染:

    * {
      display: -moz-flex;
      display: -webkit-flex;
      display: flex;
    }
    

    它仍处于测试阶段,可能存在错误,但我正在努力改进它并添加新功能

    【讨论】:

    • 待办事项。不错的 mixins 人。要考虑的一件事是现在Opera is powered by Blink,所以我们需要注意何时以及是否使用-o- 前缀是因为我们正在考虑支持旧版本的Opera。如果你问我,在接下来的几个月里,我将在我的 CSS 中删除 -o- 前缀。所以像这样的 mixin 也应该注意这一点,这样我们就不会在 CSS 中注入不必要的前缀。给你一个upvote amigo。
    【解决方案4】:

    我鼓励您尝试编写自己的 mixin。这是我用于浏览器前缀的那个。

    @mixin prefix ($prop, $val...)
      -webkit-#{$prop}: #{$val}
      -moz-#{$prop}: #{$val}
      -ms-#{$prop}: #{$val}
      #{$prop}: #{$val}
    

    然后你可以通过简单的输入来使用它(以 box-sizing 为例):

    +prefix (box-sizing, border-box)
    

    产生以下 CSS:

    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    -ms-box-sizing: border-box;
    box-sizing: border-box;
    

    如果需要传递多个值,可以使用括号(对转换有用):

    +prefix (box-shadow, (0 2px rgba(black, 0.1), 0 0 0 1px rgba(black, 0.1))
    

    产生以下 CSS:

    -webkit-box-shadow: 0 2px rgba(0,0,0, 0.1), 0 0 0 1px rgba(0,0,0, 0.1);
    -moz-box-shadow: 0 2px rgba(0,0,0, 0.1), 0 0 0 1px rgba(0,0,0, 0.1);
    -ms-box-shadow: 0 2px rgba(0,0,0, 0.1), 0 0 0 1px rgba(0,0,0, 0.1);
    box-shadow: 0 2px rgba(0,0,0, 0.1), 0 0 0 1px rgba(0,0,0, 0.1);
    

    【讨论】:

    • 这很有趣,谢谢。当然比我见过的其他自定义 mixin 更容易使用。快速提问:+ 是什么?为什么不使用@include
    • 你可以同时使用 .sass 语法,但我发现“+”更易读——尤其是在使用短的 mixin 名称时。
    【解决方案5】:

    我认为您应该使用 Autoprefixer,这样您就不必再担心浏览器前缀了。 Autoprefixer 使用 caniuse.com 的数据库。 我建议您开始使用 Grunt 或 Gulp,然后将 Autoprefixer 插件作为一项任务,它将重新编译 css 并为您吐出所需的浏览器前缀。

    【讨论】:

    • 这是一个相当不完整的答案。您应该在响应本身中包含指向您推荐的外部库的链接以及解决方案的基本要点。 (即所需的 grunt 配置等)
    • 现在经验丰富,我确实使用 Autoprefixer,但我通过我使用的 Sass 编译器应用程序而不是任务运行器来使用它。我目前正在使用Koala App,它能够在生成源映射时应用 Autoprefixer。我也使用了Prepros,但如果您选择了源地图,它就无法使用 Autoprefixer。当然,我还没有尝试过最新版本 v.5.1(在撰写本文时)。
    【解决方案6】:
    $vendors: (
        '-webkit-','-apple-','-khtml-',
        '-moz-','-rim-','-xv-',
        '-ms-','-o-',''
    );
    @mixin pref($prop,$val...) {
        @each $key in $vendors {
            #{$key}#{$prop}:$val;
        }   
    }
    selector {
        @include pref(box-sizing,border-box);
    }
    

    呈现如下:

    selector {
        -webkit-box-sizing: border-box;
        -apple-box-sizing: border-box;
        -khtml-box-sizing: border-box;
        -moz-box-sizing: border-box;
        -rim-box-sizing: border-box;
        -xv-box-sizing: border-box;
        -ms-box-sizing: border-box;
        -o-box-sizing: border-box;
        box-sizing: border-box;
    }
    

    【讨论】:

    • 不错!但是,我现在使用 Autoprefixer :)。不过谢谢,给了你一个赞成票。
    • 谢谢,是的,现在的应用程序都有自己的自动前缀,我一直在使用考拉,但有时我会添加考拉没有的特殊供应商前缀。
    • 感谢它运行。但我想你忘了在 $vendors 之后写“:”
    • 你应该得到 1,000,000 票赞成!谢谢!欣赏它。
    【解决方案7】:

    完整的高级解决方案

    变量 :: 创建带有所有或可用前缀的变量

    /* CREATE vars with all or usable prefixes */
    $all-vendors: (
        'webkit','apple','khtml',
        'moz','rim','xv',
        'ms','o'
    );
    
    $using-vendors: (
        'webkit', 'moz', 'ms', 'o'
    );
    

    实际的混合函数 :: Mixin 用于多个声明 && Mixin 用于多个声明

    /** Mixin for multiple declarations **/
    @mixin prefs($declarations, $prefixes: ()) {
     @each $property, $value in $declarations {
       @each $prefix in $prefixes {
         #{'-' + $prefix + '-' + $property}: $value;
       }
       #{$property}: $value;
     }
    }
    
    /** Mixin for single property to be prefixed **/
    @mixin pref($property, $value, $prefixes){
        @each $prefix in $prefixes {
            #{'-' + $prefix + '-' + $property}: $value;
        }
        #{$property}: $value;
    }
    

    ###Actual Usage :: 在任何选择器中使用@include

    多个示例

    /** Prefixes usage **/
    .selector {
      @include prefs((
        column-count: 3,
        column-gap: 1.5em,
        column-rule: 2px solid hotpink
      ), $using-vendors);
    }
    

    Single pref mixin 示例

    .cc3 {
        @include pref(column-count,3,webkit moz ms);
    } 
    .ccc4 {
        @include pref(column-count, 4, $all-vendors);
    }
    

    最后用SASS编译器编译后

    输出

    .selector {
      -webkit-column-count: 3;
      -moz-column-count: 3;
      -ms-column-count: 3;
      column-count: 3;
      -webkit-column-gap: 1.5em;
      -moz-column-gap: 1.5em;
      -ms-column-gap: 1.5em;
      column-gap: 1.5em;
      -webkit-column-rule: 2px solid hotpink;
      -moz-column-rule: 2px solid hotpink;
      -ms-column-rule: 2px solid hotpink;
      column-rule: 2px solid hotpink; }
    
    .cc3 {
      -webkit-column-count: 3;
      -moz-column-count: 3;
      -ms-column-count: 3;
      column-count: 3; }
    
    .ccc4 {
      -webkit-column-count: 4;
      -apple-column-count: 4;
      -khtml-column-count: 4;
      -moz-column-count: 4;
      -rim-column-count: 4;
      -xv-column-count: 4;
      -ms-column-count: 4;
      column-count: 4; }
    

    其他选项是使用考拉,只需启用自动前缀,它就会像魅力一样工作。

    you can download it from here.

    *或使用 grunt 构建系统。 *

    【讨论】:

    • 伟大的混合,虽然相当复杂。我不得不承认,尽管这种方法在技术上令人印象深刻,但它仍然让开发人员知道哪些属性/值应该和不应该作为前缀。我们都知道这是徒劳的:p Autoprefixer 是与 Koala 或 Prepros(我使用的)、构建系统、IDE 或编译器的插件一起使用的唯一方法。感谢分享。
    • 感谢@RicardoZea 认识到这一点,我知道我已经付出了一切。本来可以从简单的开始并添加更高级的用例,但后来我最终会写一篇关于堆栈溢出的文章:D 再次感谢。 :)
    【解决方案8】:

    单个或多个声明的我的版本

    //prefix vendors
    $prefixes: (
        'webkit', 'moz'
    );
    
    //prefix mixin
    @mixin prefix($declarations: ()) {
        @each $property, $value in $declarations {
            @each $prefix in $prefixes {
                #{'-' + $prefix + '-' + $property}: $value;
            }
            #{$property}: $value;
        }
    }
    

    用于多个声明

    @include prefix((animation-name:fadeInDown,animation-duration: 1s));
    

    单一声明的用法

     @include prefix((animation-name:fadeInDown));
    

    【讨论】:

    • 渲染是什么?
    【解决方案9】:

    这里是 SASS 官方网站中给出的示例 - Link

    @mixin prefix($property, $value, $prefixes) {
      @each $prefix in $prefixes {
        -#{$prefix}-#{$property}: $value;
      }
      #{$property}: $value;
    }
    
    .gray {
      @include prefix(filter, grayscale(50%), moz webkit);
    }
    
    .gray {
      -moz-filter: grayscale(50%);
      -webkit-filter: grayscale(50%);
      filter: grayscale(50%);
    }
    

    【讨论】:

    • 感谢分享菲莉。这当然是一个选项,我看到的唯一问题是供应商前缀被硬编码到 mixin 中,这意味着作者必须知道并记住所有供应商前缀。我更喜欢自动化这项工作,这就是Autoprefixer 的亮点。再次感谢分享!
    猜你喜欢
    • 2017-12-21
    • 1970-01-01
    • 2017-03-15
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2022-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多