目前,最为流行的浏览器共有五个:分别是ie,Edge浏览器(属于微软),火狐,谷歌(chrome)Safari和Opera五大浏览器。css
Trident内核:IE ,360,,猎豹,百度;html
Gecko内核:火狐----------->这个浏览器内核是开源的浏览器内核,插件很是多,-------------->缺点:打开速度慢(加载flash插件)<-----额外介绍----->。前端
Presto内核:Opera7及以上版本node
Webkit:遨游,苹果 ,symbian;Safari、Chromejquery
Bink:Chrome(28及日后版本)、Opera(15及日后版本)和Yandex浏览器,大部分国产浏览器最新版本都采用Blink;web
对浏览器兼容问题,通常分,HTML,Javascript兼容,CSS兼容。 其中html相关问题比较容易处理,无非是高版本浏览器用了低版本浏览器没法识别的元素,致使其不能解析,因此平时注意一点就是。正则表达式
*{margin:0;padding:0;}
{min-height:200px; height:auto !important; height:200px; overflow:visible;}
方法是:每写一小段代码(布局中的一行或者一块)咱们都要在不一样的浏览器中看是否兼容,固然熟练到必定的程度就没这么麻烦了。建议常常会碰到兼容性问题的新手使用。不少兼容性问题都是由于浏览器对标签的默认属性解析不一样形成的,只要咱们稍加设置都能轻松地解决这些兼容问题。若是咱们熟悉标签的默认属性的话,就能很好的理解为何会出现兼容问题以及怎么去解决这些兼容问题。
chrome
使用hacker 我能够把浏览器分为3类:ie6 ;ie7和遨游;其余(ie8 chrome ff safari opera等)浏览器
好比这样一个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。
app
由于优先级相同且相冲突的属性设置后一个会覆盖掉前一个,因此书写的次序是很重要的。
/* CSS属性级Hack */ color:red; /* 全部浏览器可识别*/ _color:red; /* 仅IE6 识别 */ *color:red; /* IE六、IE7 识别 */ +color:red; /* IE六、IE7 识别 */ *+color:red; /* IE六、IE7 识别 */ [color:red; /* IE六、IE7 识别 */ color:red\9; /* IE六、IE七、IE八、IE9 识别 */ color:red\0; /* IE八、IE9 识别*/ color:red\9\0; /* 仅IE9识别 */ color:red \0; /* 仅IE9识别 */ color:red!important; /* IE6 不识别!important 有危险*/ /* CSS选择符级Hack */ *html #demo { color:red;} /* 仅IE6 识别 */ *+html #demo { color:red;} /* 仅IE7 识别 */ body:nth-of-type(1) #demo { color:red;} /* IE9+、FF3.5+、Chrome、Safari、Opera 能够识别 */ head:first-child+body #demo { color:red; } /* IE7+、FF、Chrome、Safari、Opera 能够识别 */ :root #demo { color:red\9; } : /* 仅IE9识别 */
越少的浮动,就会越少的代码,会有更灵活的页面,会有扩展性更强的页面。这很少说,归结为到必定水平了,浮动会用的较少。另外,您也会避免使用浮动+margin的用法。因此,越后来越不易遇到这种bug。
注意是技巧,不是方法: 写好标准头 http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> http://www.w3.org/1999/xhtml”> 尽可能用padding,慎用margin,height尽可能补上100%,父级height有定值子级height不用100%,子级全为浮动时底部补个空clear:both的div宽尽可能用margin,慎用padding,width算准实际要的减去padding
display:block,inline两个元素 display:block; //能够为内嵌元素模拟为块元素 display:inline; //实现同一行排列的的效果 display:table; //for FF,模拟table的效果
display:block块元素,元素的特色是: 老是在新行上开始;高度,行高以及顶和底边距均可控制;宽度缺省是它的容器的100%,除非设定一个宽度
display:inline就是将元素显示为行内元素,元素的特色是:和其余元素都在一行上;高,行高及顶和底边距不可改变;宽度就是它的文字或图片的宽度,不可改变。span,a,label,input,img,strong和em是 inline 元素的例子
1)
<style type="text/css"> <!-- div { position:absolute; top:50%; left:50%; margin:-100px 0 0 -100px; width:200px; height:200px; border:1px solid red; } --> </style>
2)div里的内容,IE默认为居中,而FF默认为左对齐,能够尝试增长代码margin: 0 auto;
① 例如:<div id="floatA"><div id="floatB"><div id="NOTfloatC">
<divclass="floatB"><div class="NOTfloatC">
之间加上<div class="clear">
这个div必定要注意位置,并且必须与两个具备float属性的div同级,之间不能存在嵌套关系,不然会产生异常。而且将clear这种样式定义为为以下便可:.clear{clear:both;}②做为外部 wrapper 的 div 不要定死高度,为了让高度能自适应,要在wrapper里面加上overflow:hidden; 当包含float的box的时候,高度自适应在IE下无效,这时候应该触发IE的layout私有属性(万恶的IE啊!)用zoom:1;能够作到,这样就达到了兼容。
例如某一个wrapper以下定义:
.colwrapper{overflow:hidden; zoom:1; margin:5px auto;}
③对于排版,咱们用得最多的css描述可能就是float:left.有的时候咱们须要在n栏的float div后面作一个统一的背景,譬如:
<div id=”page”> <div id=”left”></div> <div id=”center”></div> <div id=”right”></div> </div>
好比咱们要将page的背景设置成蓝色,以达到全部三栏的背景颜色是蓝色的目的,可是咱们会发现随着left centerright的向下拉长,而page竟然保存高度不变,问题来了,缘由在于page不是float属性,而咱们的page因为要居中,不能设置成float,因此咱们应该这样解决:
<div id=”page”> <div id=”bg” style=”float:left;width:100%”> <div id=”left”></div> <div id=”center”></div> <div id=”right”></div> </div> </div>
再嵌入一个float left而宽度是100%的DIV解决之。
④万能float 闭合(很是重要!)
关于 clear float 的原理可参见 [How To ClearFloats Without Structural Markup],将如下代码加入Global CSS 中,给须要闭合的div加上class=”clearfix”便可,屡试不爽。
/* Clear Fix */ .clearfix:after { content:"."; display:block; height:0; clear:both;visibility:hidden; } .clearfix { display:inline-block; } /* Hide from IE Mac */ .clearfix {display:block;} /* End hide from IE Mac */ /* end of clearfix */
或者这样设置:.hackbox{display:table; //将对象做为块元素级的表格显示}
技巧六:div嵌套时 y轴上 padding和 marign的问题
Web页面在360等浏览器上,显示不正确。 可是在Firefox、chrome和IE8+以上的浏览器上,都是显示正常的。
问题的分析
1. 检查了一些Javascript框架,标准的jquery类库1.x系列,确认其工做正常,问题不是在于Javascript方面。
2. 排查掉HTML标签内容的显示 问题。
3. 怀疑是CSS在不一样浏览器下的兼容性问题,见过排查,没有发现问题。
4. 排查360浏览器,发现其在当前页面的显示中,默认使用了IE7的渲染引擎。同时,在IE7的环境下,重现了相似状况。
5. 本质上,这个显示问题是页面在IE7下面的兼容性显示问题。
经过实验,发现只有在IE7内核下面才存在兼容性显示问题
发现问题的产生是浏览器“兼容模式”惹的祸
关于360浏览器或搜狗浏览器的分析:
对于此类浏览器,有时候号称双核或者N核的高速浏览器,其本质上就是本地IE浏览器的壳子,外加Chrome抑或Firefox的内核,大部分状况下都是WebKit系列内核。
那么,此类浏览器依据什么信息,来判断页面的渲染模式呢?答案就是能够指令运行当前页面的浏览器使用何种渲染引擎的声明。
<meta http-equiv="X-UA-Compatible" content="IE=8">
这里,就是指令浏览器至少要使用IE8以上的渲染引擎来,渲染页面,从而规避掉IE7下的问题。
因而在header中加入如下代码,我认为真正起做用的是第二行代码,但为了保险起见,两行我都选用
<meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=8">
因而页面即便在兼容模式下也恢复正常显示。但还有一个问题,显然这样在使用原生的IE浏览器浏览时也会选用ie8内核,我还须要修改一下。
因而,将代码中的8改成11,<meta http-equiv="X-UA-Compatible" content="IE=11">
,问题解决。
关于Doctype.
<!DOCTYPE> 声明必须是 HTML 文档的第一行,位于 <html> 标签以前。
<!DOCTYPE> 声明不是 HTML 标签;它是指示 web 浏览器关于页面使用哪一个 HTML 版本进行编写的指令。
在 HTML 4.01 中,<!DOCTYPE> 声明引用 DTD,由于 HTML 4.01 基于 SGML。DTD 规定了标记语言的规则,这样浏览器才能正确地呈现内容。
分析: doctype所要解决的就是使用何种HTML的语法解析器和渲染器。好比特定HTML标签的使用,则依赖于HTML Doctype的使用。
nnerText 谷歌,火狐和IE8都支持
低版本 的火狐不支持innerText
textContent在IE8中的结果是undefined;
textContent在谷歌和火狐中支持;
这些内容是必须知道的,也是之后解决兼容性问题的引子或者思路,同时也是基础。
在解决浏览器兼容性的问题上面,首先,能够经过获取浏览器的版原本判断这个浏览器是否是支持这个属性,可是这种办法很是的麻烦。
具体作法是:我要在一系列的信息中找到这个浏览器版本里面的具体是什么样的,而后用正则表达式去匹配,而后肯定这个浏览器里面具体用的什么东西。这就是整个的内容,因此,至关的麻烦。
固然,获取浏览器版本的代码很简单,就一句话,一行代码,可是仅仅是为了判断这个浏览器是否是支持这个属性 ,是否是放在这里好像有点儿大材小用了。所以,就直接判断这个浏览器里面是否是支持这个属性就能够了。
为了解决这个不兼容的问题,咱们能够编辑如下代码来解决上述问题:
1 //任意元素均可以设置成文本内容----------所以把“任意”元素当成对象(element)传递到函数中 2 3 //element---->任意元素 4 //text--->任意文本内容 5 function setInnerText(element,text) { 6 if(typeof (element.textContent)=='undefined'){//是IE8浏览器 7 element.innerText=text; 8 }else{ 9 //浏览器支持textContent这个属性 10 element.textContent=text; 11 } 12 } 13 14 15 //获取任意元素中的文本内容 16 function getInnerText(element) { 17 if(typeof (element.textContent)=="undefined"){ 18 //若是浏览器不支持textContext这个属性则返回innerText的值 19 return element.innerText; 20 }else{ 21 //若是浏览器支持textContext属性,则直接返回该属性的值 22 return element.textContent; 23 } 24 }
上述代码就能够解决innnerText和textContent在各个浏览器之间不兼容的问题(上述代码目前只在谷歌,火狐,IE8版本上面测试,之后还会在其余的浏览器的不一样版本上面测试,测试结果还会不断的更新,尽请期待)。
上面介绍的内容只阐述部分属性在各个浏览器上面的差别,固然,还有其余的兼容问题存在,他们分别是:
(1)获取某个元素中的第一个子元素
(2)获取某个元素中的最后一个子元素
(3)获取某个元素的前一个兄弟元素
(4)获取某个元素的后一个兄弟元素
下面,我分别给出了相应的兼容性问题解决办法代码:
1 //获取某个元素中的第一个子元素 2 function getFirstElement(element) { 3 if(element.firstElementChild){ 4 //若是浏览器支持这个属性就直接返回第一个子元素 5 return element.firstElementChild; 6 }else{ 7 //若是浏览器不支持这个firstElementChild属性,先获取传入进来的父级元素中的第一个子节点 8 var node=element.firstChild;//先获取这个节点 9 while (node&&node.nodeType!=1){//判断节点存在而且不是标签 10 node=node.nextSibling;//继续找当前节点的下一个节点 11 } 12 return node; 13 } 14 } 20 //下面这连个属性在各个不一样的浏览器中显示的方式有所不一样 21 //my$("uu").firstChild 22 //my$("uu").firstElementChild 23 24 //获取某个元素中的最后一个子元素 25 function getLastElement(element) { 26 if(element.lastElementChild){ 27 return element.lastElementChild; 28 }else{ 29 //获取当前元素的最后一个子节点 30 var node=element.lastChild; 31 while (node&&node.nodeType!=1){ 32 node=node.previousSibling; 33 } 34 return node; 35 } 36 } 44 45 //获取某个元素的前一个兄弟元素 46 function getPreviousElement(element) { 47 if(element.previousElementSibling){ 48 return element.previousElementSibling 49 }else{ 50 var node=element.previousSibling; 51 while (node&&node.nodeType!=1){ 52 node=node.previousSibling; 53 } 54 return node; 55 } 56 } 57 58 59 60 //获取某个元素的后一个兄弟元素 61 function getNextElement(element) { 62 if(element.nextElementSibling){ 63 return element.nextElementSibling 64 }else{ 65 var node=element.nextSibling; 66 while (node&&node.nodeType!=1){ 67 node=node.nextSibling; 68 } 69 return node; 70 } 71 }