使用scss为css样式自动添加浏览器前缀

当一个浏览器实现一个新的属性、值或者选择器,而这个特征还不是处于候选推荐标准状态的时候,这属性的前面会添加一个前缀以便于它的渲染引擎识别。

浏览器使用前缀来尝试一些新属性、值和选择器,即使他们还没有最终定稿——这是一个好的测试方法,在必要时也可以对他们进行修正或者重新定义。如果浏览器一上来就直接使用标准属性,那他们就会被直接锁定在这个特征的实现上而不易变更。

开发这可能会立即使用无前缀的属性,而且也会一直期望它能够保持同样的表现不再变更。如果浏览器在之后对这个属性做了变更,不管是由于它的实现存在缺陷,或者是由于规范本身发生了变更,所有现存的使用了这个属性的网站都有可能面临出问题的风险。除了会出现这样的锁定问题外,这种方式也有可能强迫其他浏览器和W3C去适配它的实现。

1. 使用 scss 来实现为样式添加浏览器前缀,废话不多说,直接上代码。
@mixin prefix($stylename, $value, $options: webkit moz o ms) {
    #{$stylename}: $value;

    @each $option in $options {
        @if $option == webkit {
            -webkit-#{$stylename}: $value;
        }
        @else if $option == moz {
            -moz-#{$stylename}: #{$value};
        }
        @else if $option == o {
            -o-#{$stylename}: #{$value};
        }
        @else if $option == ms {
            -ms-#{$stylename}: #{$value};
        }
    }
}

.test {
    @include prefix(background, blue);
}

编译后的结果:

.test {
  background: blue;
  -webkit-background: blue;
  -moz-background: blue;
  -o-background: blue;
  -ms-background: blue;
}

ps:

  1. 很明显,上述代码中 $stylename 要用 #{} 包起来的。
  2. 形参中 $options 可以是 [webkit moz o ms],但是却不能写成数组的形式,这可能是 scss 语法的原因吧。
  3. $option 有默认值,所以可以不用传参,若要指定生成哪些浏览器前缀,可以使用 @include prefix(background, blue, webkit moz)

有的样式值有兼容性该怎么写呢?或者是新增了属性值,而不是属性时,怎么来写呢?

比如 background, 当值为渐变色时,就存在兼容性,而且是 background 的值是新增的,所以应该写成下图所示的样子。

那么此时就只需要:

.test {
    // @include prefix(background, linear-gradient())
    皮一下,很开森。
    其实这种情况下,用这个封装的前缀就不太合适了,还是老老实实分开单独写吧,或者封装一个background linear-gradient的mixin。
    因为这里liner-gradient值是不一样的,并不只是前缀的问题。
}

写成 left , to right 这种形式各浏览器之间有兼容性问题,所以我们可以改写成 90deg 这种形式。

2. 封装一个动画 prefix-frames
@mixin prefix-keyframes($name, $options: [webkit moz o ms]) {
    @keyframes #{$name} {
        @content;
    }
    @each $option in $options {
        @if $option == webkit {
            @-webkit-keyframes #{$name} {
                @content;
            }
        }
        @else if $option == moz {
            @-moz-keyframes #{$name} {
                @content;
            }
        }
        @else if $option == o {
            @-o-keyframes #{$name} {
                @content;
            }
        }
        @else if $option == ms {
            @-ms-keyframes #{$name} {
                @content;
            }
        }
    }
}

@include prefix-keyframes(colorchange) {
    from {
        color: red;
    }
    to {
        color: black;
    }
};

解析后的css

@keyframes colorchange {
  from {
    color: red; }
  to {
    color: black; } }

@-webkit-keyframes colorchange {
  from {
    color: red; }
  to {
    color: black; } }

@-moz-keyframes colorchange {
  from {
    color: red; }
  to {
    color: black; } }

@-o-keyframes colorchange {
  from {
    color: red; }
  to {
    color: black; } }

@-ms-keyframes colorchange {
  from {
    color: red; }
  to {
    color: black; } }
3. 分享几个我常用的 mixin
// 浮动
@mixin float($f: left) {
    float: $f;
}
.test {
    @include float();
    @include float(right);
}

// 清除浮动
@mixin clearfix() {
    zoom: 1;
    &:after {
        content: ‘‘;
        display: block;
        clear: both;
    }
}
.test {
    @include clearfix();
}

// 三角形
@mixin triangle($size, $dir, $color) {
    display: block;
    width: 0;
    height: 0;
    border: $size solid transparent;
    border-#{$dir}: $size solid #{$color};
}
.test {
    @include triangle(20px, left, red);
}

// 设置宽高
@mixin size($w, $h: auto) {
    width: $w;
    height: $h;
}
.test {
    @include size(200px);
    @include size(200px, 200px);
}
// 标题一行,多余用省略号
@mixin text-overflow {
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
// 文字不换行
@mixin word-break {
    word-break: break-all;
    word-wrap: break-word;
    white-space: normal;
}
// 圆角
@mixin border-radius($radius) {
    -webkit-border-radius: $radius;
    -moz-border-radius: $radius;
    border-radius: $radius;
    // 这样写是不是就更完美了。
    // @include prefix(border-radius, $radius);
}


世界上只有一种真正的英雄主义,那就是在认清生活真相之后依然热爱生活 —— 罗曼罗兰

原文地址:https://www.cnblogs.com/Mobro/p/9376487.html

时间: 2024-08-29 17:16:50

使用scss为css样式自动添加浏览器前缀的相关文章

【webpack4x】postcss-loader无法自动添加浏览器前缀问题

没有设置浏览器类型导致的无法生效 // 1. npm install postcss-loader autoprefixer --save // 2. 在项目根目录下新建 postcss.config.js // 注意: 如果没有配置在哪些浏览器上自动添加前缀,会无法添加成功 // postcss.config.js module.exports = { plugins: [ require('autoprefixer')({ "browsers": [ "defaults&

webpack4 css添加浏览器前缀 postcss-loader

自动添加浏览器前缀 ,我们这里使用postcss-loader 首先  cnpm install --save-dev postcss-loader autoprefixer 我这里用的cnpm ,npm也可以下载 接下来是配置 在网上查了相关文档发现需要新建一个 postcss.config.js 文件来对 postcss-loader 配置. 第一种配置: 新建与 webpack.config.js 同级的 postcss.config.js 文件 module.exports = { pl

css样式兼容不同浏览器问题解决办法

在网站设计的时候,应该注意css样式兼容不同浏览器问题,特别是对完全使用DIV CSS设计的网站,就应该更注意IE6 IE7 FF对CSS样式的兼容,不然,你的网乱可能出去不想出现的效果! 所有浏览器 通用 height: 100px; IE6 专用 _height: 100px; IE6 专用 *height: 100px; IE7 专用 *+height: 100px; IE7.FF 共用 height: 100px !important; 一.CSS HACK 1, !important

为js和css文件自动添加版本号

web应用必然要面对缓存问题,无论前台后台都会涉足缓存.特别是对于前端而言,缓存利用的是否得当直接关系到应用的性能. 通常情况下,我们会倾向于使用缓存,因为缓存一方面可以减少网络开销,一方面可以减轻服务器的压力. 但是有些时候缓存也会带来一些比较诡异的问题,呵呵.关于缓存的文章应该不在少数,不再讨论,本文的重点在于为js和css文件自动添加版本号. 这样做的原因是:首先对于js和css类型的静态文件设置了缓存机制,当文件被更新时,需要强迫浏览器下载修改后的新文件,也就是要更新缓存,而通过为js和

webpack通过postcss-loader添加浏览器前缀

在webpack中,我们可以很方便的使用autoprefixer来为css3属性添加不同的浏览器前缀. 首先,需要安装autoprefixer不用多说了,其次是安装postcss-loader(npm install --save-dev postcss-loader) 接下来在webpack.config.js文件里添加如下代码(红圈部分): 接下来,在webpack.config.js的同级目录下新建postcss.config.js文件,配置如下: module.exports = { p

sublime 自动添加兼容前缀插件autoprefixer

1.确保Node.js已经安装,未安装请 点击 这里>> 2.下载autoprefixer插件 https://github.com/sindresorhus/sublime-autoprefixer 3.打开sublime ,选择菜单 Preferences >  Browse Packages 将压缩包解压 4.设置快捷键,选择菜单Preferences > Key Bindings – User [ { "keys": ["ctrl+alt+sh

webpack配置css浏览器前缀

webpack打包时,css自动添加浏览器前缀.我们需要用到一个Loader:postcss-loader,和一个插件:autoprefixer 安装 npm i postcss-loader autoprefixer -D 方法一 1.在webpack.config.js文件中,找到module下的rules属性,在里面添加一个对象,完整代码如下: module:{ rules:[ { test:/\.scss$/, use:['style-loader','css-loader','sass

CSS浏览器前缀,HTML5新增标签

1.浏览器样式前缀 为了让CSS3样式兼容,需要加上 例如:-ms- 兼容IE浏览器-moz 兼容Firefox-webkit- 兼容chrome和safaridiv{-ms-transform:rotate(30deg);...........} 2.自动添加浏览器前缀 目前的状态是,有些CSS3属性需要加前缀,有些不需要加,有些只需加部分,可以用插件,安装autoprefixer 3.HTML5新增标签 (1)<header> 页面头部.页眉(2)<nav>页面导航(3)<

CSS3 浏览器前缀

浏览器样式前缀 为了让CSS3样式兼容,需要将某些样式加上浏览器前缀: -ms- 兼容IE浏览器-moz- 兼容firefox-o- 兼容opera-webkit- 兼容chrome 和 safari 比如: div { -ms-transform: rotate(30deg); -webkit-transform: rotate(30deg); -o-transform: rotate(30deg); -moz-transform: rotate(30deg); transform: rota