談談煩人的hasLayout和BFC

2021-07-10 15:00:04 字數 2306 閱讀 3528

在你的瀏覽器上編寫乙個小demo

left

right

.parent

.left-child

.right-child

好了,你會發現黑色的parent並沒有顯示出來。

浮動元素的父容器並沒有被撐開,都是因為bfc和haslayout

有一點要說明,ie6/7中是沒有bfc的,而haslayout卻是ie5/6/7中特有的,我們要解決像上面這樣的問題就要分別去觸發haslayout和bfc。

haslayout是ie5/6/7下特有的乙個屬性 , 也是無數ie6測試下bug的根源。

haslayout 是windows internet explorer渲染引擎的乙個內部組成部分。在internet explorer中,乙個元素要麼自己對自身的內容進行計算大小和組織,要麼依賴於父元素來計算尺寸和組織內容。為了調節這兩個不同的概念,渲染引擎採用了 haslayout 的屬性,屬性值可以為true或false。當乙個元素的 haslayout 屬性值為true時,我們說這個元素有乙個布局(layout)

當乙個元素有乙個布局時,它負責對自己和可能的子孫元素進行尺寸計算和定位。簡單來說,這意味著這個元素需要花更多的代價來維護自身和裡面的內容,而不是依賴於祖先元素來完成這些工作。因此,一些元素缺省會有乙個布局。當我們說乙個元素「擁有layout」或「得到layout」,或者說乙個元素「has layout」 的時候,我們的意思是指它的微軟專有屬性 haslayout 被設為了 true 。乙個「layout元素」可以是乙個預設就擁有 layout 的元素或者是乙個通過設定某些 css 屬性得到 layout 的元素。如果某個html元素擁有 haslayout 屬性,那麼這個元素的 haslayout 的值一定只有 true,haslayout 為唯讀屬性 一旦被觸發,就不可逆轉。通過 ie developer ******* 可以檢視 ie 下 html 元素是否擁有haslayout,在 ie developer ******* 下,擁有 haslayout 的元素,通常顯示為「haslayout = -1」。

比如說,我就剛在ie6下遇到子元素塊為浮動,父元素的寬高卻沒用被撐開。解決辦法就是觸發父元素的haslayout。

.parent 

.child

還有比如我遇到的position:absolute定位出問題,也需要觸發父元素的haslayout 。

可以理解為,在正常瀏覽器下absolute的子元素依賴relative的父元素計算和組織,那麼在ie6下我們需要出發該父元素的layout。

.parent  

.child

下列元素應該是預設具有 layout 的

設定haslayout為true

並沒有直接設定,可以通過這些屬性觸發haslayout為true

display: inline-block

height: (任何值除了auto)

float: (left 或 right)

position: absolute

width: (任何值除了auto)

writing-mode: tb-rl

zoom: (除 normal 外任意值)

internet explorer 7 還有一些額外的屬性(不完全列表):

min-height: (任意值)

max-height: (除 none 外任意值)

min-width: (任意值)

max-width: (除 none 外任意值)

overflow: (除 visible 外任意值)

overflow-x: (除 visible 外任意值)

overflow-y: (除 visible 外任意值)

position: fixed

嗯 .. bfc是不支援ie6/7的。

bfc指的是脫離正常文件流的元素,有浮動元素絕對定位元素overflow不為visiable的塊級元素等.. 具體列一下有 :

看下這裡的demo,寫得很好~

更加直觀地了解haslayout和bfc

深入理解bfc和margin collapse

float浮動 和 hasLayout 研究心得

float 浮動有三個用處 一是使得自身脫離文件流,使得父容器不會受其高度影響 解決方案 二是使得後面的非浮動元素的文字 順流環繞 浮動元素 ie6下可能會引發的問題 三是浮動元素的尺寸,如果未指定將按自身內部元素大小來適應 而不是像塊元素一樣預設的充滿整行 通常理解下 ie6觸發haslayout...

css屬性觸發和清除haslayout

position absolute float left right display inline block width except auto height except auto zoom except normal overflow hidden scroll auto overflow x...

去掉煩人的try catch和if else

不要在業務 中進行捕獲異常,即 dao service controller 層的所以異常都全部丟擲到上層.這樣不會導致業務 中的一堆try catch會混亂業務 import com.asiainfo.group.tmallcore.util.webresult import org.spring...