zoukankan      html  css  js  c++  java
  • 详解CSS3属性前缀(转)

    原文地址

    CSS3的属性为什么要带前缀

    使用过CSS3属性的同学都知道,CSS3属性都需要带各浏览器的前缀,甚至到现在,依然还有很多属性需要带前缀。这是为什么呢?

    我的理解是,浏览器厂商以前就一直在实施CSS3,但它还未成为真正的标准。为此,当一些CSS3样式语法还存在波动时,它们提供针对浏览器的前缀。现在主要流行的浏览器内核主要有:

    • Trident内核:主要代表为IE浏览器
    • Gecko内核:主要代表为Firefox
    • Presto内核:主要代表为Opera
    • Webkit内核:产要代表为Chrome和Safari

    而这些不同内核的浏览器,CSS3属性(部分需要添加前缀的属性)对应需要添加不同的前缀,也将其称之为浏览器的私有前缀,添加上私有前缀之后的CSS3属性可以说是对应浏览器的私有属性:

    • Trident内核:前缀为-ms
    • Gecko内核:前缀为-moz
    • Presto内核:前缀为-o
    • Webkit内核:前缀为-webkit

    来看一个简单的示例,早期写一个圆角border-radius,需要这样写:  

    .box { -moz-border-radius: 5px; -webkit-border-radius: 5px; -o-border-radius: 5px; border-radius: 5px; }

    这样编写代码,无形之中给前端人员增加了不少工作量,于是开始有人在讨论这个问题“如何在编写CSS时不需要添加浏览器的私有前缀,又能让浏览器识别?”

    解决方案:

    一、-prefix-free

    为了解决手工书写前缀的问题,最早的一个解决方案是由Lea Verou提供的一个-prefix-free脚本。你只需要在你的.html文件中插入一个prefixfree.js文件(可以是文档任何地方),建议把这个脚本文件放在样式表之后。

    添加这个脚本之后,使用CSS3的属性时,只需书写标准样式即可。但是这种做法将所有压力交给了客户端来处理。如此一来页面解析压力就大了,性能会打一定的折扣,并且一旦脚本加载失败,那么就会出现浏览器无法正常渲染CSS3的样式风格。

    prefixfree脚本仅在IE9+、Opera10+、Firefox3.5+、Safari4+得到支持。

    二、编辑器插件

    除了prefixfree脚本之外,很多同学依赖于文本编辑器的插件来处理。这里来看看Sublime Text编辑器里是如何实现Autoprefixer功能的。

    要在编辑器中安装Autoprefixer插件,首先需要你的环境中已经安装好了Node.js。你可以在命令终端执行:

    node -v

    来检测是否已安装,如果没有安装,请先安装。在这里假设你已具备Node.js环境。

    现在开启你的Sublime Text编辑器,你可以同时按下command + Shift + p三个键,选择"Install Package"。然后搜索Autoprefixer

    现在你在你的Sublime Text中使用Autoprefixer功能。假设你在样式文件中输入:

    .box {
      transform: rotate(45deg);
      border-radius: 5px;
      box-shadow: 1px 1px 0 rgba(0,0,0,.25);
      transition: all .2s ease .1s;
    }

    这个时候你只需要同时按下Command + Shift + P三个键,选择“Autoprefix CSS”,并且回车,就能得到下面这样的代码:

    .box {
      -webkit-transform: rotate(45deg);
              transform: rotate(45deg);
      border-radius: 5px;
      box-shadow: 1px 1px 0 rgba(0,0,0,.25);
      transition: all .2s ease .1s;
    }

    注:不同的配置,执行的效果不一样。详细可以点击这里查阅。

    三、预处理器中的混合宏

    随着CSS预处理器越来越普及,部分同学开始采用预处理器中的混合宏来处理CSS3前缀的事项。比如说Compass,里面就是使用Sass的mixin为CSS3需要带前缀的属性定制了一些mixin。还有类似于Stylus中的nib等。预处理器中的混合宏确实可以解决很多问题,但也产生了新的问题,就是它所使用的语法是全新的,如果要使用就必须重新学习,另外这类工具的演进速度通常都会跟不上浏览器的发展速度,这样也会造成其产生的CSS有过时的问题,有时候为了解决一些问题,还需要自己去写mixins。比如:

    正如前面所说的,如果要跟上浏览器的演进,就需要不断的更新你的CSS3 mixins,不然就会造成你的代码不是最新的。其中Compass就存在这样的问题:

    @import "compass";
    
    .box {
      @include border-radius(5px);
    }

    编译出来的CSS:

    .box {
      -moz-border-radius: 5px;
      -webkit-border-radius: 5px;
      border-radius: 5px;
    }

    而现实却不尽人意,因为到写这篇文章为止,我们写圆角属性只需要:

    .box {
      border-radius: 5px;
    }

    各主流浏览器就能正常的解析。造成这个原因的时,Compass中的CSS3的mixin没有跟上步子去更新定义好的mixins。

    原文中还有讲到一种方法:Autoprefixer。用Autoprefixer需要配置Grunt或者Gulp,这俩我没玩过。懂Grunt或者Gulp的大神可以移步原文

  • 相关阅读:
    设计模式--22、状态模式
    设计模式--21、备忘录模式
    设计模式--20、迭代器模式
    关于分布式事务、两阶段提交协议、三阶提交协议
    分布式系统的一致性探讨
    分布式系统的BASE理论
    分布式系统的CAP理论
    Kafka集群环境搭建
    Elasticsearch插件head的安装(有坑)
    centos6 x64安装elasticsearch5.5.2启动报错
  • 原文地址:https://www.cnblogs.com/MirageFox/p/6781159.html
Copyright © 2011-2022 走看看