浏览器兼容性问题及解决方案(CSS部分)

可畏的前端
可畏的前端

浏览器兼容性问题是指因为不同的浏览器对同一段CSS代码或者JS代码解析不同导致页面显示效果不统一或者脚本执行错误的情况。一般情况下,我们希望用户无论使用什么浏览器来查看网页效果都应该是一样的。浏览器的兼容性问题是Web前端开发人员经常会碰到的和必须要解决的问题。

浏览器兼容的部分一般分为CSS部分和JS部分,JS部分请参考这里

相关的问题已近在前端界整理的很充分了,大致的问题可总结如下:

  • 浏览器的初始化样式不同导致兼容性的问题
  • 局部样式解析不同导致的bug

有些文章把样式使用技巧也放到兼容性的问题里面,这有失偏颇,关于常用样式使用技巧在另一边文章叙述,这里不重复。

1. 浏览器的初始化样式不同导致兼容性的问题

对于这个问题可以一上来就是用*{margin:0;padding:0;},不过这个代码的杀伤力有些大,如果用户自定义样式未加载进来,则整个页面的布局毫无结构可言。

所以这里出现两个浏览器默认样式重置库:Normalize.cssreset.css,上面的链接是项目的介绍。

关于这两个库的对比介绍也比较详细,简单的说:Normalize 的理念则是尽量保留浏览器的默认样式,不进行太多的重置;而Reset的目的,是将所有的浏览器的自带样式重置掉,这样更易于保持各浏览器渲染的一致性。

浏览器默认样式重置就像是贴墙纸前先上一遍腻子将墙抹之后再贴。Normalize.css或者Reset.css需要在所有样式引用前引用。就我个人而言,使用Normalize.css比较多一些。

2. 局部样式解析不同导致的bug

其实,这里主要是IE浏览器非IE浏览器之间的解析区别。如果使用了normalize或者reset后能处理大部分的问题,下面是剩余的部分:

2.1 透明度的兼容CSS设置

解决方式:

  • IE:filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60)。
  • 非IE:opacity:0.6。

2.2 默认的盒子解析模型

标准 w3c 盒子模型的范围包括 margin、border、padding、content,并且 content 部分不包含其他部分; IE盒子模型的范围也包括 margin、border、padding、content。

和标准 w3c 盒子模型不同的是:ie 盒子模型的 content 部分包含了 border 和 pading。

因此,问题主要表现在css中的width是否计算border和padding的问题,这个是默认的盒子解析模型不同导致的。

IE6:中包括border和padding(box-sizing: border-box;)
IE7和非IE:width宽度不包括border和padding(box-sizing: content-box;)

解决方式: 根据使用方式,写好box-sizing属性。

2.3 浮动问题

主要表现是子元素使用了浮动,而父元素没有撑开盒子,下面是解决的代码,加载父元素上就好。

解决技巧:

.clearfix:before,
.clearfix:after {
  content: " "; /* 1 */
  display: table; /* 2 */
}

.clearfix:after {
  clear: both;
}

2.4 高度不适应

高度不适应是当内层对象的高度发生变化时外层高度不能自动进行调节,特别是当内层对象使用margin 或padding时。

例如:

#box {background-color:#eee; } 
#box p {margin-top: 20px;margin-bottom: 20px; text-align:center; } 
<div id="box">
<p>p对象中的内容</p>
</div>

解决技巧:

  1. 在P对象上下各加2个空的div对象CSS代码{height:0px;overflow:hidden;}
  2. 或者为DIV加上border属性

2.5 滚动条颜色设置

IE无法设置滚动条颜色了, 解决办法是将body换成html

解决技巧:

html { 
    scrollbar-face-color:#f6f6f6; 
    scrollbar-highlight-color:#fff; 
    scrollbar-shadow-color:#eeeeee; 
    scrollbar-3dlight-color:#eeeeee; 
    scrollbar-arrow-color:#000; 
    scrollbar-track-color:#fff; 
    scrollbar-darkshadow-color:#fff; 
} 

2.6 超链接访问过后hover样式就不出现的问题

被点击访问过的超链接样式不在具有hover和active了,很多人应该都遇到过这个问题,解决技巧是改变CSS属性的排列顺序: L-V-H-A

解决技巧:

a:link {} 
a:visited {} 
a:hover {} 
a:active {} 

2.7 条件注释

在html中加入条件判断,选择激活哪些部分

解决技巧:

<link rel="stylesheet" type="text/css" href="css.css" />

<!--[if IE 7]>
<link rel="stylesheet" type="text/css" href="ie7.css" />
<![endif]-->

<!--[if lte IE 6]>
<link rel="stylesheet" type="text/css" href="ie.css" />
<![endif]-->

lte -- 小于等于
lt  -- 小于
gte --  大于等于
gt  --  大于
! --  不等于

2.8 background-attachment:fixed在ios下失效的hack

ios系统和某些移动端background-attachment:fixed不兼容性,没有任何效果,但可以hack一下就可以了,代码如下:

ps:想在哪个标签加背景,可以在它class后:before.

body:before {
  content: ' ';
  position: fixed;
  z-index: -1;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background: url(path/to/image) center 0 no-repeat;
  background-size: cover;
}

2.9 Calc使用

浏览器支持的不是很好,而且在使用的时候要加上厂商前缀,达到兼容性。另外,注意减号之间的空格。

width: calc(100% - 80px);

#formbox {
  width:  130px;
  /*加厂商前缀,操作符(+,-,*,/)两边要有空格)*/               
  width:  -moz-calc(100% / 6);   
  width:  -webkit-calc(100% / 6);   
  width:  calc(100% / 6);   
  border: 1px solid black;
  padding: 4px;
}

最后

除去以上的总结,还有很多是关于在IE6下的Hack,但是这个“老古董”在市面上的占有率已近相当低了,另外,按照由上到下的开发模式(优先兼容高级浏览器),IE8及以下的浏览器都可不用重点考虑。因此,关于样式兼容性的问题重点放到浏览器样式重置flex布局CSS 预处理器(SCSS/Less)CSS后处理器(Autoprefixer/Postcss/Cssnano)上就可以解决大部分问题。

此外,关于Hack的问题不需要全部记住,只需要记住大概的问题点,在做布局的时候尽量避免,遇到问题查问题。我认为这部分问题会随着技术或者浏览器的更迭而全部解决,因此不需要放太多精力。

参考连接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 197,737评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,103评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,710评论 0 326
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,909评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,794评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,557评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,939评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,572评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,852评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,871评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,692评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,490评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,939评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,114评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,409评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,971评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,176评论 2 339

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,715评论 1 92
  • 一、问题 (一)、如何调试 IE 浏览器 1、对于IE7及以下版本可采用IETester(不能测脚本,模拟出来的I...
    该帐号已被查封_才怪阅读 1,360评论 0 8
  • 1.如何调试 IE 浏览器 IE7以上(包括Edge)自带开发者工具。Edge: 安装虚拟机,安装各种不同版本的I...
    26d608950683阅读 1,598评论 0 5
  • 一、如何调试 IE 浏览器 IE7以上版本自带的开发者工具,IE6可以用border的方法;例:IE11的开发者工...
    __Qiao阅读 1,119评论 2 17
  • 神是祝福的神,每天神的祝福与恩典都不断,神的恩典与祝福多多,神是应当称颂的,他的慈爱永远长存,今天晨祷特别看到约瑟...
    恩宠爸爸阅读 536评论 0 0