javascript的浏览器兼容-各种浏览器兼容的css写法

这里我们不会关注太多的细节,比如哪些css样式需要我们兼容等等,主要从四个方面讨论大的解决思路,即:浏览器CSS样式初始化、浏览器私有属性、CSShack句型和手动插件。

CSS 初始化

后端的男伙伴肯定遇到过默认样式带来的困惑,而每个浏览器的css默认样式都不一样,所以最简单有效的办法就是初始化(覆盖默认样式)。 相信很多同学也写过这样的代码。 在启动所有 CSS 之前,将 marin 和 padding 设置为 0。

*{
    margin: 0;
    padding: 0;
}

关于浏览器CSS样式初始化,如果你没有经验,尤其是初学者,你可能不知道初始化什么。 这里为您推荐一个库。 正常化。 几种样式设置如下:

html {
    line-height: 1.15; /* Correct the line height in all browsers */
    -webkit-text-size-adjust: 100%; /* Prevent adjustments of font size after orientation changes in iOS. */
}
body {
    margin: 0;
}
a {
    background-color: transparent; /* Remove the gray background on active links in IE 10. */
}
img {
    border-style: none; /*  Remove the border on images inside links in IE 10. */
}

CSS样式初始化已经解决了很大一部分浏览器默认样式带来的通用兼容性问题。 拿出来看看浏览器的私有属性。

浏览器私有属性

-webkit-、-moz-、-ms-等,这些是我们经常在某个CSS属性前添加的一些前缀,这些属性是浏览器的私有属性。

说起私有属性的出现也是由于制定HTML和CSS标准的组织W3C行动缓慢所致。

一般W3C组织的成员提出一个新的属性,比如border-radius,大家都觉得不错,但是W3C要经过一个非常复杂的程序来制定标准。 然而,浏览器供应商的营销计划很紧张。 如果某个属性足够成熟,浏览器就会添加支持。 为了防止将来 W3C 公布标准时发生更改javascript的浏览器兼容,添加了私有前缀,例如 -webkit-border-radius。 常用的前缀有:

一定要注意书写顺序,兼容的书写放在最上面javascript的浏览器兼容,标准的书写放在最后

-webkit-transform:rotate(-3deg); /*为Chrome/Safari*/
-moz-transform:rotate(-3deg); /*为Firefox*/
-ms-transform:rotate(-3deg); /*为IE*/
-o-transform:rotate(-3deg); /*为Opera*/
transform:rotate(-3deg); 

想想看,如果你为每个 CSS 属性编写一堆兼容性代码,无疑会毁掉你的生活。 我们会讲如何通过手动插件来处理。

CSS黑客

不仅仅是上面默认的样式覆盖和私有属性添加,有时候我们还需要针对不同的浏览器甚至不同的版本来编译特定的CSS样式。 这个过程称为CSShack!

CSShack的写法大致可以归纳为以下几类:条件级hack、属性级hack、选择器级hack。

Conditional hack:主要针对IE浏览器的一些特殊设置

关键词

if前面的条件共包含6种选择方式:是否、大于、大于等于、小于、小于等于、非指定版本

是否:指定是否使用IE或某个版本的IE。关键字:空

小于:选择小于指定版本的 IE 版本。 关键字:gt(大于)

小于或等于:选择小于或等于指定版本的 IE 版本。 关键字:gte(greaterthanorequal)

大于:选择大于指定版本的IE版本。 关键字: lt(小于)

大于或等于:选择大于或等于指定版本的IE版本。 关键字:LTE(小于)

非指定版本:选择除指定版本之外的所有IE版本。 关键词: !

版本

IE浏览器版本,如6、7、8等,但IE10及以上版本已经取消了条件注释功能,使用时请注意。


属性 hack:在 CSS 样式属性名称之前添加一些只有特定浏览器才能识别的 hack 前缀。

selector{?property:value?;}

_:选择IE6及以下版本。也可以使用连接线(破折号)(-)。 为了防止用破折号与各个属性混淆,使用逗号(_)更为合适

*:选择IE7及以下版本。例如:(+)、(#)都可以,但业界对(*)的认知度较高

9:选择IE6+

:选择IE8+、Opera15以下浏览器

注意顺序:低版本的兼容写在最后

.test {
  color: #0909; /* For IE8+ */
  *color: #f00;  /* For IE7 and earlier */
  _color: #ff0;  /* For IE6 and earlier */
}

选择器级hack:对于一些页面性能不一致或者需要特殊处理的浏览器,在CSS选择器之前添加一些只能被特定浏览器识别的前缀进行hack。

 selector{ sRules }

*html *前缀只对IE6生效
*+html *+前缀只对IE7生效
@media screen9{...}只对IE6/7生效
@media screen {body { background: red; }}只对IE8有效
@media screen,screen9{body { background: blue; }}只对IE6/7/8有效
@media screen {body { background: green; }} 只对IE8/9/10有效
@media screen and (min-width:0) {body { background: gray; }} 只对IE9/10有效
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {body { background: orange; }} 只对IE10有效

* html .test { color: #090; }       /* For IE6 and earlier */
* + html .test { color: #ff0; }     /* For IE7 */

说到这里,不得不说后端开发太难了~~

努力解决这个兼容性问题不会给我们带来什么技术上的重大提升,无非就是给各个浏览器厂商补漏洞而已。 随着时间的推移和技术的更新,我们现在应该思考如何用最少的努力来解决CSS兼容性问题。 那么,手动插件就可以出来了,我们终于可以从复杂的兼容性处理中解脱出来了。

手动插件

Autoprefixer是一个手动管理浏览器前缀的插件,它可以解析CSS文件并将浏览器前缀添加到CSS内容中。

在资源创建工具(如webpack)中添加Autoprefixe后,你就可以完全忘记上面的事情,只需要按照最新的W3C规范正常编写CSS即可,剩下的工作交给插件即可。 另外,如果项目需要支持旧版浏览器,可以更改浏览器参数设置。

//我们编写的代码
div {
  transform: rotate(30deg);
}
//自动补全的代码,具体补全哪些由要兼容的浏览器版本决定,可以自行设置div {
  -ms-transform: rotate(30deg);       
  -webkit-transform: rotate(30deg);    
  -o-transform: rotate(30deg);    
  -moz-transform: rotate(30deg);      
  transform: rotate(30deg);
}