標准模式與怪異模式
由於歷史的原因,各個瀏覽器在對頁面的渲染上存在差異,甚至同一瀏覽器在不同版本中,對頁面的渲染也不同。在W3C標准出台以前,瀏覽器在對頁面的渲染上沒有統一規范,產生了差異(Quirks mode或者稱為Compatibility Mode);由於W3C標准的推出,瀏覽器渲染頁面有了統一的標准(CSScompat或稱為Strict mode也有叫做Standars mode),這就是二者最簡單的區別。
W3C標准推出以后,瀏覽器都開始采納新標准,但存在一個問題就是如何保證舊的網頁還能繼續瀏覽,在標准出來以前,很多頁面都是根據舊的渲染方法編寫的,如果用的標准來渲染,將導致頁面顯示異常。為保持瀏覽器渲染的兼容性,使以前的頁面能夠正常瀏覽,瀏覽器都保留了舊的渲染方法(如:微軟的IE)。這樣瀏覽器渲染上就產生了Quircks mode和Standars mode,兩種渲染方法共存在一個瀏覽器上。
火狐一直工作在標准模式下,但IE(6,7,8)標准模式與怪異模式差別很大,主要體現在對盒子模型的解釋上,這個很重要,下面就重點說這個。
那么瀏覽器究竟該采用哪種模式渲染呢?這就引出的DTD,既是網頁的頭部聲明,瀏覽器會通過識別DTD而采用相對應的渲染模式:
1. 瀏覽器要使老舊的網頁正常工作,但這部分網頁是沒有doctype聲明的,所以瀏覽器對沒有doctype聲明的網頁采用quirks mode解析。
2. 對於擁有doctype聲明的網頁,什么瀏覽器采用何種模式解析,這里有一張詳細列表可參考:http://hsivonen.iki.fi/doctype/
3. 對於擁有doctype聲明的網頁,這里有幾條簡單的規則可用於判斷:對於那些瀏覽器不能識別的doctype聲明,瀏覽器采用strict mode解析
4. 在doctype聲明中,沒有使用DTD聲明或者使用HTML4以下(不包括HTML4)的DTD聲明時,基本所有的瀏覽器都是使用quirks mode呈現,其他的則使用strict mode解析。
5. 可以這么說,在現有有doctype聲明的網頁,絕大多數是采用strict mode進行解析的。
6. 在ie6中,如果在doctype聲明前有一個xml聲明(比如:),則采用quirks mode解析。這條規則在ie7中已經移除了。
如何設置為怪異模式:
方法一:在頁面項部加
我們用Eclipse的HTML模板新建的html頁面,自動就有上面東東
方法二:什么也不加。
這里有一張詳細列表可參考:http://hsivonen.iki.fi/doctype/
如何設置為標准模式:
加入以下任意一種:
HTML4提供了三種DOCTYPE可選擇:
XHTML1.0提供了三種DOCTYPE可選擇:
(1)過渡型(Transitional )
(2)嚴格型(Strict )
(3)框架型(Frameset )
這里有一張詳細列表可參考:http://hsivonen.iki.fi/doctype/
如何判定現在是標准模式還是怪異模式:
方法一:執行以下代碼
alert(window.top.document.compatMode) ; //BackCompat 表示怪異模式 //CSS1Compat 表示標准模式
方法二:jquery為我們提供的方法,如下:
alert($.boxModel)
alert($.support.boxModel)
IE6,7,8瀏覽器的標准模式還是怪異模式 盒子模型的 差異
(由於火狐的始終表現的很一致,不種我們操心。所以這里我們重點說IE瀏覽器)
-------------------------------------------------模態窗口----------------------------------------------------
我們想做一個DIV蒙層,中間放一個iframe,做一個像模態窗口的dialog工具
思路如下:
取出頁面 網頁可見區域 的寬與高, 進行蒙層,
通過CSS的固定定位屬性{position:fixed}來實現,可以讓HTML元素脫離文檔流固定在瀏覽器的某個位置,
這樣拖動滾動條時, 蒙層不會移動,一直在中心位置。
中心位置放一個iframe,用來顯示其它網頁,並可以提交表單。
可以用以下代碼計算 蒙層的寬與高:
Js代碼
//計算窗口的高寬和滾動條的位置 alert(window.top.document.compatMode) ;//區分怪異模式或標准模式 var cw = window.top.document.compatMode == "BackCompat" ?window.top.document.body.clientWidth:window.top.document.documentElement.clientWidth;//窗體高度 var ch = window.top.document.compatMode == "BackCompat" ?window.top.document.body.clientHeight:window.top.document.documentElement.clientHeight;//窗體寬度//必須考慮文本框處於頁面邊緣處,控件顯示不全的問題 var sw = Math.max(window.top.document.documentElement.scrollLeft, window.top.document.body.scrollLeft);//橫向滾動條位置 var sh = Math.max(window.top.document.documentElement.scrollTop, window.top.document.body.scrollTop);//縱向滾動條位置//考慮滾動的情況 alert("cw:"+cw+" ch:"+ch+" sw:"+sw+" sh"+sh);
----------------------------------------------參考 1-----------------------------------------------------
我們先來認識一下有哪些屬性可以使用:
scrollLeft:設置或獲取位於對象左邊界和窗口中目前可見內容的最左端之間的距離
scrollTop:設置或獲取位於對象最頂端和窗口中可見內容的最頂端之間的距離
scrollWidth:獲取對象的滾動寬度
scrollHeight: 獲取對象的滾動高度。
obj.offsetTop 指 obj 相對於版面或由 offsetParent 屬性指定的父坐標的計算上側位置,整型,單位像素。
obj.offsetLeft 指 obj 相對於版面或由 offsetParent 屬性指定的父坐標的計算左側位置,整型,單位像素。
obj.offsetWidth 指 obj 控件自身的絕對寬度,不包括因 overflow 而未顯示的部分,也就是其實際占據的寬度,整型,單位像素。
obj.offsetHeight 指 obj 控件自身的絕對高度,不包括因 overflow 而未顯示的部分,也就是其實際占據的高度,整型,單位像素
event.clientX 相對文檔的水平座標
event.clientY 相對文檔的垂直座標
event.offsetX 相對容器的水平坐標
event.offsetY 相對容器的垂直坐標
clientWidth 內容可視區域的寬度
clientHeight 內容可視區域的高度
clientTop 內容可視區域相對容器的垂直坐標
clientLeft 內容可視區域相對容器的水平坐標
參考圖片:
----------------------------------------------參考 2-----------------------------------------------------
Js代碼
var Width_1=document.body.scrollWidth; //body滾動條總寬 var Height_1=document.body.scrollHeight; //body滾動條總高 var Width_2=document.documentElement.scrollWidth; //documentElement滾動條總寬 var Height_2=document.documentElement.scrollHeight; //documentElement滾動條總寬 var Width_3=document.body.clientWidth; //body網頁可見區域寬,滾動條隱藏部分不算 var Height_3=document.body.clientHeight; //body網頁可見區域高,滾動條隱藏部分不算 var Width_4=document.documentElement.clientWidth; //documentElement網頁可見區域寬,滾動條隱藏部分不算 var Height_4=document.documentElement.clientHeight; //documentElement網頁可見區域高,滾動條隱藏部分不算 var Width_5=window.screen.availWidth; //屏幕可用工作區寬度(用處不大) var Height_5=window.screen.availHeight;//屏幕可用工作區高度 var scrollLeft_7=window.top.document.body.scrollLeft;//body水平滾動條位置 var scrollTop_7=window.top.document.body.scrollTop;//body垂直滾動條位置 var scrollLeft_8=window.top.document.documentElement.scrollLeft;//documentElement水平滾動條位置 var scrollTop_8=window.top.document.documentElement.scrollTop;//documentElement垂直滾動條位置 alert(" body滾動條總寬:"+Width_1+",body滾動條總高:"+Height_1+ ",\n documentElement滾動條總寬:"+Width_2+",documentElement滾動條總高:"+Height_2+ ",\n"+ "\n body網頁可見區域寬:"+Width_3+",body網頁可見區域高:"+Height_3+ ",\n documentElement網頁可見區域寬:"+ Width_4+",documentElement網頁可見區域高:"+Height_4+ ",\n"+ "\n 屏幕可用工作區寬度:"+Width_5+", 屏幕可用工作區高度:"+Height_5+ ",\n"+ "\n body水平滾動條位置:"+scrollLeft_7+",body垂直滾動條位置:"+scrollTop_7+ ",\n documentElement水平滾動條位置:"+scrollLeft_8+",documentElement垂直滾動條位置:"+scrollTop_8);
(需要提一下:CSS中的margin屬性,與clientWidth、offsetWidth、clientHeight、offsetHeight均無關)
下面是從w3school查到的,說的不是很詳細
根節點
有兩種特殊的文檔屬性可用來訪問根節點:
document.documentElement
document.body
第一個屬性可返回存在於 XML 以及 HTML 文檔中的文檔根節點。
第二個屬性是對 HTML 頁面的特殊擴展,提供了對標簽的直接訪問。
http://www.w3school.com.cn/htmldom/dom_nodes_access.asp
收集整理於互聯網
參考:
http://cavonchen.iteye.com/blog/738423
http://hsivonen.iki.fi/doctype/