不一樣的瀏覽器渲染過程實際上並不相同,可是依舊存在相一致的部分,大體過程以下所示:css
上訴過程是逐步完成的,爲了更好的用戶體驗,渲染引擎將會盡量早的將內容呈現到屏幕上,並不會等到全部的html都解析完成以後再去構建和佈局render樹,而是解析完一部分就渲染一部份內容。html
迴流(reflow):若是改變了影響元素佈局信息的CSS樣式,好比width、height、left、top等,該元素的位置信息就會發生變化,也可能會致使整個頁面其餘元素的位置信息都發生變化,因此渲染引擎須要從新執行layout過程,從新計算每一個元素的位置。reflow是在瀏覽器下一幀繪製的時候,進行從新佈局,若是修改了元素的佈局樣式後,立馬去獲取offsetTop、scrollTop等屬性,那麼渲染引擎就會強制進行從新佈局過程,以保證在JS中獲取到正確的offsetTop、scrollTop等屬性值。瀏覽器
重繪(repaint):改變某個元素的背景色、文字顏色、邊框顏色等等不影響它周圍或內部佈局的屬性時,屏幕的一部分須要重繪,可是元素的幾何尺寸不會變化。佈局
display:none的標籤不會被加入Render Tree,也不會觸發reflow,visibility:hidden的標籤會被加入到Render Tree,不會觸發reflow,只會觸發repaint。flex
HTML文檔中的每一個元素在渲染的時候都會被描述成一個矩形盒子,而盒模型正是用來表示每一個元素盒子所佔用空間大小的模型,CSS盒模型分爲W3C標準盒模型和IE盒模型,IE盒模型就是在IE6如下版本的怪異模式下的盒模型,IE6以及更高版本都遵循標準盒模型。在CSS中主要經過四個部分來描述,分別爲margin、border、padding、content。通常來講,IE盒模型的寬高計算方式爲:width/height = content + padding + border,W3C標準盒模型的寬高計算方式爲:width/height = content。動畫
W3C標準盒模型寬高的計算模式在對於非px爲單位的寬高時,會帶來很是大的計算困擾,以下:spa
.box { width:50%; border:1px solid #ccc; }
這個地方想要的確定是50%,可是實際的大小趣事50% + 2px,這多出的2px就很讓人無奈,因而爲了避免破壞這個50%的寬度,每每得再內嵌一層元素用來設置border,就成了下面這樣:code
.box { width:50%; } .box .box-inner { border:1px solid #ccc; }
這種解決方式顯然不太科學,至少致使了HTML結構的臃腫,而box-sizing屬性的出現就解決了這個問題,它就是用來改變元素寬高的計算方式。box-sizing屬性有兩個經常使用的取值content-box和border-box,若是值爲content-box(默認),則實際寬度爲上面所說的計算方式:實際寬高 = border + padding + width/height
。如爲border-box則是另外一種計算方式,其實際寬高就是設置的width/height。orm
瀏覽器選擇哪一個盒模型,主要是看瀏覽器處於標準模式仍是怪異模式,在<DOCTYPE DTD="">
標籤裏有DTD聲明,若是有DTD聲明,瀏覽器處於標準模式,沒有DTD聲明,瀏覽器處於怪異模式,處於怪異模式的瀏覽器按照自身的解析方式去解析,IE6會選擇IE盒模型,其餘現代瀏覽器都會採用W3C標準盒模型。IE6如下版本的瀏覽器沒有遵循W3C標準,不管頁面有沒有DTD聲明,它都是按照IE盒模型解析代碼。htm
margin:% | px
,margin的值若是爲%,其是根據父元素的寬度來計算的,包括margin-top和margin-bottom,其值也是相對於父元素的寬度。而且內聯元素的margin-top/bottom是不容許設置的。
.wrap:after { content:' ', display:block; height:0; clear:both; } .wrap { zoom:1; }
content是在父容器的後面添加一個空白字符,height:0是讓這個空白字符不顯示出來,display:block;clear:both是確保這個空白字符是非浮動的獨立區塊。zoom:1是IE6獨有的屬性,做用是激活父元素的hasLayout屬性,讓父元素擁有本身的佈局,其餘瀏覽器會直接忽略該屬性。
BFC即塊級格式化上下文,它屬於普通文檔流,具備BFC特性的元素能夠看做是隔離了的獨立容器,容器裏面的元素不會在佈局上影響到外面的元素,而且BFC具備普通容器所沒有的一些特性。通俗來講,能夠把BFC理解爲一個封閉的大箱子,箱子內部的元素不管如何翻江倒海都不會影響到外部。
只要元素知足下面任一條件便可觸發BFC特性:
一個DOM元素,在不考慮層疊上下文的狀況下,會按照層疊水平決定元素在Z軸上的顯示順序,通俗來說,不一樣的DOM元素組合在一塊兒發生層疊的時候,它們的顯示順序會遵循層疊水平的規則,而z-index是用來調整某個元素顯示順序。
若是兩個元素層疊水平相同的時候,這個時候就要遵循下面兩個準則:
1 後來居上原則
2 誰z-index大,誰在上原則
一個頁面中每每不止一個層疊上下文,在同一個層疊上下文中按照層疊水平的規則來堆疊元素,正常狀況下,一共有三種大的類型建立層疊上下文:
1 默認建立層疊上下文,HTML根元素屬於根層疊上下文元素
2 須要配合z-index觸發建立層疊上下文
3 不須要配合z-index觸發建立層疊上下文
1 含有position屬性的元素
2 flex項(父元素diaplay爲flex|inline-flex)注意是子元素,不是父元素建立層疊上下文
這兩種狀況下,須要設置具體的z-index值,不能設置z-index爲auto,這也就是z-index:auto和z-index:0的一點細微差異
這種狀況下,基本上都是由CSS3中新增的屬性來觸發的,常見的有: