【面试总结系列】在开发 PC 端项目时,需要考虑哪些主流设备浏览器兼容性的问题?

一、问题描述

在开发 PC 端项目时,需要考虑哪些兼容性的问题?

二、答案详解

首先,为什么会出现浏览器兼容问题?
  1. 各大厂商出于自身利益考虑而设置的种种技术壁垒,都让CSS应用起来比想象得要麻烦;
  2. 由于各大主流浏览器由不同的厂家开发,所用的核心架构和代码也很难重和,这就为各种莫名其妙的Bug(代码错误)提供了温床。
介绍一下目前最流行的五大浏览器以及五大内核
  • 浏览器:
    • IE 浏览器
    • Firefox(火狐)浏览器
    • Chrome(谷歌)浏览器
    • Safari 浏览器
    • Opera 浏览器
  • 内核:
    • Trident:代表作:IE ,360,猎豹,百度
      • 元老级内核之一,由微软开发,并于1997年10月首次在ie 4.0中使用,凭借其windows垄断优势,Trident市场占有率一直很高。然而垄断并非,没有竞争就没有进步,长期以往,Trident内核一度停滞不前,更新缓慢,甚至一度与W3C标准脱节。2011年,从ie 9开始,Trident开始支持HTML5和CSS 3,因此我们也经常会看到有些网站在浏览时会提示用户(在Internet Explorer 9.0+以上浏览效果最佳)。前端程序员做浏览器兼容一般也不再会考虑ie 8之前的浏览器了。
    • Gecko:FireFox 可开源的
      • 元老级内核之一,由Netscape公司Mozilla组织开发。1998年,Netscape在于IE浏览器竞争失利之后,成立了非正式组织Mozilla,由其开发新一代内核,后命名为“Gecko”。FireFox也是这班人开发出来了,因此这也就是Mozilla一直使用的内核。
      • Gecko 的特点是代码完全公开,因此其开发程度很高,全世界的程序员都可以为其编写代码,增加功能。
    • WebKit:苹果Safari,Chrome旧版本,360,搜狗
      • 这是苹果公司开发的内核,也是其旗下产品Ssfari浏览器使用的内核。Webkit引擎包含了WebCode排版引擎和JavaScriptCode解析引擎,分别是从KDE的KHTML和KJS衍生而来,它们都是自由软件,在GPL条约下授权,同时支持BSD系统开发。
      • Chrome、360极速浏览器以及搜狗高速浏览器也使用Webkit作为内核(在脚本理解方面,Chorome使用自己研发的V8引擎)。
    • Blink:谷歌,Opera
      • 这是由Google和Opera Software开发的浏览器排版引擎,Google计算将这个渲染引擎作为Chromium计划的一部分,并且在2013年4月公布了这一消息。这一渲染引擎是开源引擎Webkit中WebCore组件的一个分支,并且在Chrome(28及往后版本)、Opera(15及往后版本)浏览器中使用
    • Presto:Opera前内核 已经废弃

下面正式开始我们的内容。

浏览器兼容问题一:不同浏览器的标签默认的内边距和外边距不同
  • 问题症状:随便写几个标签,不加样式控制的情况下,各自的 marginpadding 差异较大。
  • 碰到频率:100%
  • 解决方案:CSS 里设置全局样式
    *{
    	margin:0; 
    	padding:0;
    }
    
  • 备注:这个是最常见的也是最易解决的一个浏览器兼容性问题,几乎所有的CSS文件开头都会用通配符*来设置各个标签的内外边距是0。
浏览器兼容问题二:块属性标签float后,又有横行的margin情况下,在IE6显示margin比设置的大
  • 问题症状:常见症状是IE6中后面的一块被顶到下一行
  • 碰到频率:90%(稍微复杂点的页面都会碰到,float布局最常见的浏览器兼容问题)
  • 解决方案:在 float 的标签样式控制中加入 display:inline; 将其转化为行内属性
  • 备注:我们最常用的就是 div+CSS 布局了,而 div 就是一个典型的块属性标签,横向布局的时候我们通常都是用 div float 实现的,横向的间距设置如果用 margin 实现,这就是一个必然会碰到的兼容性问题。
浏览器兼容问题三:设置较小高度标签(一般小于10px),在IE6,IE7,遨游中高度超出自己设置高度
  • 问题症状:IE6、7和遨游里这个标签的高度不受控制,超出自己设置的高度
  • 碰到频率:60%
  • 解决方案:给超出高度的标签设置 overflow:hidden; 或者设置行高 line-height 小于你设置的高度。
  • 备注:这种情况一般出现在我们设置小圆角背景的标签里。出现这个问题的原因是IE8之前的浏览器都会给标签一个最小默认的行高的高度。即使你的标签是空的,这个标签的高度还是会达到默认的行高。
浏览器兼容问题四:行内属性标签,设置display:block后采用float布局,又有横行的margin的情况,IE6间距bug
  • 问题症状:IE6里的间距比超过设置的间距
  • 碰到频率:20%
  • 解决方案:在 display:block; 后面加入 display:inline; display:table;
    display:block,inline两个元素
    display:block;  // 可以为内嵌元素模拟为块元素
    display:inline; // 实现同一行排列的的效果
    display:table;  // Firefox 模拟table的效果
    
  • 备注:行内属性标签,为了设置宽高,我们需要设置 display:block; (除了input 标签比较特殊)。在用 float 布局并有横向的 margin 后,在IE6下,他就具有了块属性 float 后的横向 margin 的bug。不过因为它本身就是行内属性标签,所以我们再加上 display:inline 的话,它的高宽就不可设了。这时候我们还需要在 display:inline 后面加入 display:talbe
浏览器兼容问题五:图片默认有间距
  • 问题症状:几个 img 标签放在一起的时候,有些浏览器会有默认的间距,加了问题一中提到的通配符也不起作用。
  • 碰到频率:20%
  • 解决方案:使用 float 属性为 img 布局
  • 备注:因为 img 标签是行内属性标签,所以只要不超出容器宽度,img 标签都会排在一行里,但是部分浏览器的 img 标签之间会有个间距。去掉这个间距使用 float 是正道。(有的使用使用负margin,也能解决该问题,但负margin本身就是容易引起浏览器兼容问题的用法,所以我们一般不使用该方法)
浏览器兼容问题六:标签最低高度设置min-height不兼容
  • 问题症状:因为 min-height 本身就是一个不兼容的 CSS 属性,所以设置min-height 时不能很好的被各个浏览器兼容
  • 碰到频率:5%
  • 解决方案:如果我们要设置一个标签的最小高度200px,需要进行的设置为:
    .box {
    	min-height:200px; 
    	height:auto !important; 
    	height:200px; 
    	overflow:visible;
    }
    
  • 备注:在B/S系统前端开发时,有很多情况下我们有这种需求。当内容小于一个值(如300px)时。容器的高度为300px;当内容高度大于这个值时,容器高度被撑高,而不是出现滚动条。这时候我们就会面临这个兼容性问题。
浏览器兼容问题七:透明度的兼容CSS设置
  • 解决方案:代码如下,兼容所有浏览器
    .transparent_class {
          background:rgba(255, 0, 0, 0.5);  /* IE 8 不兼容 */
          filter:alpha(opacity=50);         /*IE滤镜,透明度50%*/
          -moz-opacity:0.5;                 /*支持旧版本的 Mozilla 浏览器*/
          -khtml-opacity: 0.5;              /*支持旧版本的Safari(1.*)*/
          opacity: 0.5;                     /*支持大多数浏览器,Firefox、Safari、Opera 等*/
    } 
    

三、如何做兼容?

每写一小段代码(布局中的一行或者一块)我们都要在不同的浏览器中看是否兼容,当然熟练到一定的程度就没这么麻烦了。建议经常会碰到兼容性问题的新手使用。

很多兼容性问题都是因为浏览器对标签的默认属性解析不同造成的,只要我们稍加设置都能轻松地解决这些兼容问题。如果我们熟悉标签的默认属性的话,就能很好的理解为什么会出现兼容问题以及怎么去解决这些兼容问题。

四、兼容技巧?

CSS Hack

CSS Hack 的目的:就是使你的CSS代码兼容不同的浏览器。当然,我们也可以反过来利用 CSS Hack 为不同版本的浏览器定制编写不同的CSS效果。

CSS Hack 的原理:由于不同的浏览器对CSS的支持和解析结果不一样,还由于CSS中的优先级关系,我们就可以根据这个来针对不同的浏览器来写不同的CSS。

使用 hacker 我们可以把浏览器分为3类:IE6、IE7和遨游、其他(IE8 Chrome Firefox Safari Opera等)

  • IE6 认识的 hacker 是下划线_ 和星号 *
  • IE7 和 遨游 认识的 hacker 是星号 *

比如这样一个CSS设置:

height:300px;
*height:200px;
_height:100px; 

IE6浏览器 在读到 height:300px;的时候会认为高是300px;继续往下读,他也认识 *heihgt, 所以当IE6读到 *height:200px; 的时候会覆盖掉前一条的相冲突设置,认为高度是200px。继续往下读,IE6还认识 _height,所以他又会覆盖掉200px高的设置,把高度设置为100px;

IE7 和 遨游 也是一样的从高度300px的设置往下读。当它们读到*height200px 的时候就停下了,因为它们不认识 _height。所以它们会把高度解析为200px。

剩下的其他浏览器只认识第一个 height:300px; 所以他们会把高度解析为300px。

因为优先级相同且相冲突的属性设置后一个会覆盖掉前一个,所以书写的次序是很重要的。

五、总结

PC端的项目兼容问题主要集中 ie6 和 ie7,而他们的市场份额已经非常低了,而且选择兼容他们会让我们代码变多,维护成本升高,不能使用 CSS2.1 或者 CSS3 的高级命令等等。所以最好不要兼容 ie6,7,而如果要兼容 ie8,那么在使用 css3 的时候一定要小心,因为 ie8 也是不兼容 css3 和 html5 的,所以建议在使用 css3 的时候要避免使用影响布局的 css3 属性。

你可能感兴趣的:(前端面试,问题解决,前端,内核,css,html,javascript)