摘要:到底是何方神圣可以簡單看作是中的。和產(chǎn)生新的特性一樣,無法通過屬性直接設(shè)置,而是通過某些屬性間接開啟這一特性。不同的是某些屬性是以不可逆方式間接開啟為。因此所引發(fā)的問題,很大程度可以理解為在不應(yīng)該的或沒有預(yù)料到的地方產(chǎn)生新的導(dǎo)致的。
過去一直聽說舊版本IE下很多詭異bug均由一個(gè)神秘角色引起的,那就是hasLayout。趁著最近突然發(fā)神經(jīng)打算好好學(xué)習(xí)CSS,順便解答多年來的疑惑。
hasLayout可以簡單看作是IE5.5/6/7中的BFC(Block Formatting Context)。也就是一個(gè)元素要么自己對(duì)自身內(nèi)容進(jìn)行組織和尺寸計(jì)算(即可通過width/height來設(shè)置自身的寬高),要么由其containing block來組織和尺寸計(jì)算。而IFC(即沒有擁有布局)而言,則是元素?zé)o法對(duì)自身內(nèi)容進(jìn)行組織和尺寸計(jì)算,而是由自身內(nèi)容來決定其尺寸(即僅能通過line-height設(shè)置內(nèi)容行距,通過行距來支撐元素的高度;也無法通過width設(shè)置元素寬度,僅能由內(nèi)容來決定而已) 當(dāng)hasLayout為true時(shí)(就是所謂的"擁有布局"),相當(dāng)于元素產(chǎn)生新BFC,元素自己對(duì)自身內(nèi)容進(jìn)行組織和尺寸計(jì)算; 當(dāng)hasLayout為false時(shí)(就是所謂的"不擁有布局"),相當(dāng)于元素不產(chǎn)生新BFC,元素由其所屬的containing block進(jìn)行組織和尺寸計(jì)算。 和產(chǎn)生新BFC的特性一樣,hasLayout無法通過CSS屬性直接設(shè)置,而是通過某些CSS屬性間接開啟這一特性。不同的是某些CSS屬性是以不可逆方式間接開啟hasLayout為true。并且默認(rèn)產(chǎn)生新BFC的只有html元素,而默認(rèn)hasLayout為true的元素就不只有html元素了。 另外我們可以通過object.currentStyle.hasLayout屬性來判斷元素是否開啟了hasLayout特性。
到這里我們應(yīng)該了解到若要理解hasLayout則必須理解BFC,因此這里可參考CSS魔法堂:重新認(rèn)識(shí)Box Model、IFC、BFC和Collapsing margins
,
display: inline-block height: (除 auto 外任何值) width: (除 auto 外任何值) float: (left 或 right) position: absolute writing-mode: tb-rl zoom: (除 normal 外任意值)
IE7 還有一些額外的屬性(不完全列表)可以觸發(fā) hasLayout :
min-height: (任意值) min-width: (任意值) max-height: (除 none 外任意值) max-width: (除 none 外任意值) overflow: (除 visible 外任意值,僅用于塊級(jí)元素) overflow-x: (除 visible 外任意值,僅用于塊級(jí)元素) overflow-y: (除 visible 外任意值,僅用于塊級(jí)元素) position: fixed
IE6 以前的版本(也包括 IE6 及以后所有版本的混雜模式,其實(shí)這種混雜模式在渲染方面就相當(dāng)于 IE 5.5), 通過設(shè)置任何元素的 "width" 或 "height"(非auto)都可以觸發(fā) hasLayout ; 但在 IE6 和 IE7 的標(biāo)準(zhǔn)模式中的行內(nèi)元素上卻不行,設(shè)置 "display:inline-block" 才可以。其中通過display:inline-block或min-width:0或min-height:0將不可逆地啟用hasLayout特性。而在沒有其他屬性啟用hasLayout時(shí),可通過以下方式關(guān)閉hasLayout
max-width, max-height (設(shè)為 "none")(在IE7中) position (設(shè)為 "static") float (設(shè)為 "none") overflow (設(shè)為 "visible") (在IE7中) zoom (設(shè)為 "normal") writing-mode (從 "tb-rl" 設(shè)為 "lr-t")
而產(chǎn)生新BFC的CSS屬性
position:absolute/fixed float:left/right display:inline-block/table-cell/table-caption/flex/inline-flex overflow:(除visible外任意值)
可以看到導(dǎo)致產(chǎn)生新BFC的方式和觸發(fā)hasLayout==true的方式不完全重疊。因此hasLayout==true所引發(fā)的問題,很大程度可以理解為在不應(yīng)該的或沒有預(yù)料到的地方產(chǎn)生新的BFC導(dǎo)致的。
僅當(dāng)一個(gè)元素即在 IE 早期版本中觸發(fā)了 hasLayout,又在其他瀏覽器中創(chuàng)建了 block formatting context 時(shí),才能避免上述問題的發(fā)生。即同時(shí)啟用上述兩者以保證各瀏覽器的兼容,或者相反,兩者皆不啟用。
使元素即生成了 block formatting context,又觸發(fā)了 hasLayout對(duì)于觸發(fā) hasLayout 的元素,通過 CSS 設(shè)置,使它產(chǎn)生 block formatting context;
生成 block formatting context 但是沒有觸發(fā) hasLayout 的元素,通過設(shè)置 "zoom:1",使其觸發(fā) hasLayout。
使元素即沒有觸發(fā) hasLayout,又沒有創(chuàng)建 block formatting context。
雖然我現(xiàn)在已經(jīng)不用再適配IE5.5/6/7了,但理解hasLayout還是很有必要的。其實(shí)可以理解為從另一個(gè)角度學(xué)習(xí)BFC吧! 尊重原創(chuàng),轉(zhuǎn)載請(qǐng)注明來自:肥仔john^_^
談?wù)凚FC與ie特有屬性hasLayoutRM8002: 不能同時(shí)在 IE6 IE7 IE8(Q) 中觸發(fā) hasLayout 并在其他瀏覽器中創(chuàng)建 Block Formatting Context 的元素在各瀏覽器中的表現(xiàn)會(huì)有差異
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/115113.html
摘要:那不是,是我不懂而已。的用途之一西文是以空格來分隔單詞的,而漢字間則無需空格分隔,但為了統(tǒng)一西文東亞和的排版,于是抽象出一個(gè)名為的概念用于分隔詞義單元,則作為的值域,而定義域就是語言信息。 前言 每當(dāng)來個(gè)需要既要水平排版又要設(shè)置固定高寬時(shí),我就會(huì)想起display:inline-block,還有為了支持IE5.5/6/7的hack*display:inline;*zoom:1;。然后發(fā)...
摘要:不耽誤表單提交數(shù)據(jù)雖然我們無法看到的元素,但當(dāng)表單提交時(shí)依然會(huì)將隱藏的元素的值提交上去。讓元素在見面上不可視,但保留元素原來占有的位置。不過由于各瀏覽器實(shí)現(xiàn)效果均有出入,因此一般不會(huì)使用這個(gè)值。繼承父元素的值。 前言 ?還記得面試時(shí)被問起請(qǐng)說說display:none和visibility:hidden的區(qū)別嗎?是不是回答完display:none不占用原來的位置,而visibilit...
摘要:后來終于知道是某位大神將翻譯為文檔流而已。。。。。。另外單純?cè)O(shè)置效果與采用是一樣的魔法堂就這個(gè)樣,而浮動(dòng)定位也是基于。相對(duì)定位的最強(qiáng)武器就是個(gè)屬性了,好明顯它們默認(rèn)值均是。 前言 ?剛接觸CSS時(shí)經(jīng)常聽到看到一個(gè)詞文檔流,那到底什么是文檔流呢?然后會(huì)看到絕對(duì)定位和浮動(dòng)定位能脫離文檔流,從這句可以看到文檔流和絕對(duì)定位、浮動(dòng)定位是同一個(gè)范疇的概念,再后來在W3C標(biāo)準(zhǔn)文檔找到關(guān)于Absolu...
摘要:前言是否曾經(jīng)被業(yè)務(wù)提出能改改這個(gè)單選框的顏色吧讓它和主題顏色搭配一下吧,然后苦于原生不支持換顏色,最后被迫自己手?jǐn)]一個(gè)湊合使用。設(shè)置為的樣式行為特征單選框的行為特征,明顯就是選中與否,及選中狀態(tài)的改變事件,因此我們必須保持對(duì)外提供事件。 前言 ?是否曾經(jīng)被業(yè)務(wù)提出能改改這個(gè)單選框的顏色吧!讓它和主題顏色搭配一下吧!,然后苦于原生不支持換顏色,最后被迫自己手?jǐn)]一個(gè)湊合使用。若拋開inpu...
摘要:也就是說我們操作的幾何公式中的未知變量,而具體的畫圖操作則由渲染引擎處理,而不是我們苦苦哀求設(shè)計(jì)師幫忙。 前言 ?當(dāng)CSS3推出border-radius屬性時(shí)我們是那么欣喜若狂啊,一想到終于不用再添加額外元素來模擬圓角了,但發(fā)現(xiàn)border-radius還分水平半徑和垂直半徑,然后又發(fā)現(xiàn)border-top-left/right-radius的水平半徑之和大于元素寬度時(shí),實(shí)際值會(huì)按比...
閱讀 1314·2021-11-08 13:25
閱讀 1511·2021-10-13 09:40
閱讀 2825·2021-09-28 09:35
閱讀 796·2021-09-23 11:54
閱讀 1213·2021-09-02 15:11
閱讀 2488·2019-08-30 13:18
閱讀 1732·2019-08-30 12:51
閱讀 2747·2019-08-29 18:39