By
King
2015-03-24
更新日期:2016-05-29
文章目录
要想写出跨浏览器的CSS,必须知道浏览器解析CSS的两种模式:标准模式(strict/Standards mode)和怪异模式(quirks mode)。因为他决定了CSS盒子模型渲染模式的不同。
特别IE对盒模型的渲染在 strict/Standards Mode和Quirks Mode是有很大差别的,在strict/Standards Mode下对于盒模型的解释和其他的标准浏览器是一样,但在Quirks Mode模式下则有很大差别,而在不声明Doctype的情况下,IE默认又是Quirks Mode。所以为兼容性考虑,我们可能需要获取当前的文档渲染方式。
###一、如何判断浏览器当前模式1 window .top.document.compatMode
官方解释: BackCompat:标准兼容模式关闭。 CSS1Compat:标准兼容模式开启。
###二、知道浏览器模式后该怎么办
一开始我们就说过,浏览器模式直接影响了浏览器盒子模型的计算。所以我们通过确定浏览器模式去处理我们应该怎样获取计算盒子模型。
当document.compatMode等于BackCompat时,浏览器客户区宽度是document.body.clientWidth;
当document.compatMode等于CSS1Compat时,浏览器客户区宽度是document.documentElement.clientWidth。
浏览器客户区高度、滚动条高度、滚动条的Left、滚动条的Top等等都是上面的情况.
所以我们可以得出: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 if (document .compatMode == "BackCompat" ) {cWidth = document .body.clientWidth; cHeight = document .body.clientHeight; sWidth = document .body.scrollWidth; sHeight = document .body.scrollHeight; sLeft = document .body.scrollLeft; sTop = document .body.scrollTop; } else { cWidth = document .documentElement.clientWidth; cHeight = document .documentElement.clientHeight; sWidth = document .documentElement.scrollWidth; sHeight = document .documentElement.scrollHeight; sLeft = document .documentElement.scrollLeft == 0 ? document .body.scrollLeft : document .documentElement.scrollLeft; sTop = document .documentElement.scrollTop == 0 ? document .body.scrollTop : document .documentElement.scrollTop; }
###三、获取的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 var persistclose=0 var startX = 3 var startY = 150 var verticalpos="fromtop" function iecompattest ( ) {return (document .compatMode && document .compatMode!="BackCompat" )? document .documentElement : document .body;} function get_cookie (Name ) {var search = Name + "=" ;var returnvalue = "" ;if (document .cookie.length > 0 ) {offset = document .cookie.indexOf(search); if (offset != -1 ) {offset += search.length; end = document .cookie.indexOf(";" , offset); if (end == -1 ) end = document .cookie.length;returnvalue=unescape (document .cookie.substring(offset, end)); } } return returnvalue;} function hidebar(){ if (persistclose) document.cookie="remainclosed=1"; document.getElementById("M").style.display="none"; document.getElementById("show_M").style.display="block"; } function showbar(){ if(persistclose==0) document.cookie="remainclosed=0"; document.getElementById("M").style.display="block"; document.getElementById("show_M").style.display="none"; } --*/ function staticbar ( ) {barheight=document .getElementById("float_qq" ).offsetHeight var ns = (navigator.appName.indexOf("Netscape" ) != -1 ) || window .opera;var d = document ;function ml (id ) { var el=d.getElementById(id); if (!persistclose || persistclose && get_cookie("remainclosed" )=="" ) el.style.visibility="visible" if (d.layers)el.style=el; el.sP=function (x,y ) {this .style.left=x+"px" ;this .style.top=y+"px" ;}; el.x = startX; if (verticalpos=="fromtop" ) el.y = startY; else { el.y = ns ? pageYOffset + innerHeight : iecompattest().scrollTop + iecompattest().clientHeight; el.y -= startY; } return el; } window .stayTopLeft=function ( ) { if (verticalpos=="fromtop" ){ var pY = ns ? pageYOffset : iecompattest().scrollTop; ftlObj.y += (pY + startY - ftlObj.y)/8 ; } else { var pY = ns ? pageYOffset + innerHeight - barheight: iecompattest().scrollTop + iecompattest().clientHeight - barheight; ftlObj.y += (pY - startY - ftlObj.y)/8 ; } ftlObj.sP(ftlObj.x, ftlObj.y); setTimeout("stayTopLeft()" , 10 ); } ftlObj = ml("float_qq" ); stayTopLeft(); } if (window .addEventListener)window .addEventListener("load" , staticbar, false );else if (window .attachEvent)window .attachEvent("onload" , staticbar);else if (document .getElementById)window .onload=staticbar;