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

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

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

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

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

  1. webpack2使用ch7-loader解析css 自动添加浏览器前缀

    1 目录结构  安装的依赖 "autoprefixer": "^6.7.7", "css-loader": "^0.28.0&qu ...

  2. webpack2使用ch8-loader解析less less自动添加浏览器前缀

    1 目录结构  安装依赖 "less": "^2.7.2","less-loader": "^4.0.3", 2 web ...

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

    在网站设计的时候,应该注意css样式兼容不同浏览器问题,特别是对完全使用DIV CSS设计的网,就应该更注意IE6 IE7 FF对CSS样式的兼容,不然,你的网乱可能出去不想出现的效果! 所 有浏览器 ...

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

    web应用必然要面对缓存问题,无论前台后台都会涉足缓存.特别是对于前端而言,缓存利用的是否得当直接关系到应用的性能. 通常情况下,我们会倾向于使用缓存,因为缓存一方面可以减少网络开销,一方面可以减轻服 ...

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

    在webpack中,我们可以很方便的使用autoprefixer来为css3属性添加不同的浏览器前缀. 首先,需要安装autoprefixer不用多说了,其次是安装postcss-loader(npm ...

  6. css样式兼容各个浏览器时的部分总结

    [本文基本是在网络转发过来的,网站就忘记了,这文本都是保存在自己电脑本地的,还有些自己添加了些内容,这内容还会有不断的完善和更行的] 什么是浏览器兼容:当我们使用不同的浏览器(Firefox IE7 ...

  7. css自动添加浏览器兼容前缀 autoprefixer设置

    Autoprefixer设置: preferences>key Bindings-Users {"keys":["ctrl+alt+x"],"c ...

  8. js中css样式兼容各个浏览器写法

    在实际业务中往往需要在js中对dom添加一些样式,还需要对各个浏览器厂商的兼顾,看到一位大神写的一个方法很赞,做一个笔记 function prefixStyle(style){ var eleSty ...

  9. webpack打包css自动添加css3前缀

    为了浏览器的兼容性,有时候我们必须加入-webkit,-ms,-o,-moz这些前缀.目的就是让我们写的页面在每个浏览器中都可以顺利运行. 1.安装 cnpm i postcss-loader aut ...

随机推荐

  1. 怎样理解JAVA的“构造方法”和“主方法”

    在类中除了成员方法之外,还存在一种特殊类型的方法,那就是构造方法.主方法是类的入口点,它定义了程序从何处开始: 主方法提供对程序流向的控制,Java编译器通过主方法来执行程序.那么,下面一起来看一下关 ...

  2. 如何将PDF文件转Word,有什么方法

    PDF文件怎样转换成Word呢?在现在的日常办公中PDF文件和Word文件都是办公必不可少的两种文件格式了.那么当我们在工作中需要对这两种文件进行转换时,我们应该怎样实现呢?下面我们就一起来看一下吧. ...

  3. ES6中Set 和 Map用法

    JS中Set与Map用法 一.Set 1.基本用法 ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set 数据结构. ...

  4. 复习C++:VS2008中的宏干嘛用的

    VS2008中有宏,可也进行编辑和设置. 好处: 1.快速生成代码,帮助开发. 2.个人定制化功能,IDE更合适自己用. 3.提升编程效率.   缺点: 使用VB开发,一开始用起来费事.不过有官方参考 ...

  5. jquery批量提交表单值 和批量设置表单值

    $('#frmCustomerConfirmCar').find('[name]').each(function () { var type = $(this)[0].nodeName.toLower ...

  6. day4_局部变量和全局变量

    一.介绍: 定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域. 局部变量意思就是在局部生效的,出了这个变量的作用域,这个变量就失效了 全局变量的意思就是在整个程序里面都生效的,在程 ...

  7. Spring之IOC注入

    注入 spring依赖注入 set方法: <property name="属性名" values ="值">--ref="对象名" ...

  8. MongoDB 备份(mongodump)与恢复(mongorestore)

    MongoDB  备份(mongodump)与恢复(mongorestore) 备份:使用mongodump命令导出所有数据库到指定目录 参数说明: --host:MongoDB所在服务器IP. -- ...

  9. java框架之SpringCloud(7)-Config分布式配置中心

    前言 分布式系统面临的配置问题 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中标会出现大量的服务.由于每个服务都需要必要的配置信息才能运行,所以一套集中式的.动 ...

  10. 解决 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 问题

    https://blog.csdn.net/weixin_41196185/article/details/81114226 今天在启动vue项目的时候报了这样一个错误 观察到关键词是 FATAL E ...