為物件指定 hasLayout
property
說明: ie 專有用法 (ie only )。部分 ie 專有的特性 (property ) ,如 filters and transitions
,有作用的必要條件就是指定 hasLayout
性質。 hasLayout
性質本來是微軟為了補救 ie 內部不完善所自創的,並非 w3c 標準,所以有時用起來覺得相當無厘頭。但神奇地, ie 7 以前舊版衍生的網頁不正常呈現問題 (ie bugs ),大多數竟可由指定 hasLayout
來解決。
適合:有 html 及 css 語法撰寫基礎者。
難度:
更新:2008-02-18
適用:ie 7 ~ ie 5.5
hasLayout
"property " 和 css property 雖然英文名稱一樣,但實際上不太相同。 hasLayout
本身並非 css 特性的一種,所以沒辦法直接定義物件的 css 特性 hasLayout
的值 (value ),而是間接以其它的 css 特性指定在物件上,使該物件符合 hasLayout
,所以我比較傾向稱它是 hasLayout
「性質」。
符合以下任一種 css 特性及值的定義方式,物件即是 hasLayout
(有編置 ) :
ie 7 增加了幾個新的指定方式:
認識 hasLayout
的 css 規則
上述規則有的看起來有點含糊,有的好像又很陌生,那要怎麼正確定義物件 hasLayout
呢?
height
或 width
特性只需要指定一個「具體值」 hasLayout
就有效了,如 width:80%;
,甚至 height:0;
也可以喲。 min-height, max-height, min-width, max-width
等特性也可以如法炮製,如 max-width:100em;
或是 min-height:0;
。需要注意的是依據 css 規則,這類特性在行內層級 (inline-level ) 元素不會有作用。
float
特性通常有 float:left;
或 float:right;
二種值都可以達成 hasLayout
。
position:absolute;
及 position:fixed;
算是同類型的定義,二者都能使 hasLayout
有效,只是 "fixed
" ie 6 沒支援。
zoom
特性看名稱就知道是縮放大小,像 height
之類一樣,只要有「具體值」 hasLayout
就有效了,而且行內層級元素 也能作用,如 zoom:0.9;
。撰文時這個特性僅為 ie 專用 (ie only ) ,非 w3c 標準,所以非 ie 瀏覽器 (firefox , opera , safari , …) 沒有支援也就不會有任何影響。
指定 overflow
特性通常有 overflow:auto;
, overflow:hidden;
或 overflow:scroll;
三種值,雖然 ie 6 有支援,不過目前只有 ie 7 會讓 hasLayout
有效。而 overflow-x
及 overflow-y
為 css 3 的規則,撰文時僅 ie 及 firefox 支援。
writing-mode
特性也是 css 3 的規則,比較少會用這個特性指定 hasLayout
,撰文時也僅 ie 支援。
物件原則上預設都是不具 hasLayout
性質,所以我們才需要特別指定 hasLayout
,但是有部分元素在 ie 預先就已內定永遠為 hasLayout
,明細可參閱 Microsoft 官方文件 。
卸除 hasLayout
性質
當然,可以反向定義物件 hasLayout
性質為無效,不過部分元素已內定 hasLayout
就沒辦法使其失效的。會用到卸除 hasLayout
的時機,都是針對已指定過 hasLayout
的物件,卻可能因某些目的而必須轉回無 hasLayout
。所以,通常只要將原先定義 css 特性,再重新定義回「預設值」,就會讓物件的 hasLayout
性質無效了。
css 特性及值再定義成以下任一種方式,即可使 hasLayout
無效 (卸除) :
height: auto;
width: auto;
max-height: none;
max-width: none;
float: none;
position: static;
(預設值)
overflow: visible;
overflow-x: visible;
overflow-y: visible;
zoom: normal;
writing-mode: lr-tb;
(預設值)
舉例子看看就明瞭了:
xhtml
<div id="main">
<p>漁舟逐水愛山春,兩岸桃花夾去津。坐看紅樹不知遠,行盡青溪不見人。</p>
<p>山口潛行始隈隩,山開曠望旋平陸。遙看一處攢雲樹,近入千家散花竹。</p>
<p class="extract">節錄自:王維的桃源行</p>
</div>
css
(例一)
#main p {float:left;}
#main .extract {float:none;}
css
(例二)
#main p {zoom:125%;}
#main .extract {zoom:normal;}
兩例的 css 都類似情形,前一條定義先讓全部三段 p
成為 hasLayout
,後一條再讓最後一段的 hasLayout
無效。需要了解的是,卸除 hasLayout
的規則是定義在 hasLayout
規則之後的另一組指標 (selectors ) 裡,而且是取代先前「相同的」特性,前面用 float
指定,後面就要用 float
來卸除,這本來就是依循 css 的規則,只是再提醒一下而已。
無法卸除 hasLayout
的定義
以 display:inline-block;
指定 hasLayout
後,就沒辦法卸除,無論再定義回 display:inline;
或 display:block;
, hasLayout
依然維持有效,所以上述卸除規則沒有這項,這點必須注意。
由於 min-height
與 min-width
的預設值是 0,所以縱使再定義為 min-height:0;
(具體值),也無法卸除 hasLayout
。但是 ie 卻接受 min-height:auto;
或 min-width:auto;
來卸除 hasLayout
,特別須注意的是 auto
值並非 w3c 標準,所以沒有把它列在上述卸除規則。
參考資源
思考 - Box Model 與 css 版面視覺設計
Box 在版面編排上可以說是無所不在,就算「內容」 (content) 是單單一個字都具有 box,佔有一小塊矩形區域;當然,也能由 css 個別指定不同的
padding
,border
,margin
。如果padding
,border
,margin
的距離都是「零」,那麼當然, padding box, border box, margin box 的大小就會與 content box 所擁有的寬高一樣。許許多多字的 Box 就如同「堆積木」,一個個相鄰著由上而下堆疊起來 (書寫方向為由左向右、由上至下時),將內容有規則地分布在版面上,而這個規則就是設計者以 css 定義的呈現方式。
行內層級 (inline-level) 與區塊層級 (block-level) 呈現模式不同
許多的「字」結合起來可以產生「段落」,段落則再形成更大的矩形 box ,將文字圍繞起來。
xhtml
<p>
看到竹子想到王陽明。看到桃花想到桃花源記。看到蓮花想到周敦頤。<em>看到荷花想到何仙姑。看到玫瑰想到愛神。看到菊花想到陶淵明。</em>看到百合想到香水。~節錄自 monica 「聯想的遊戲」
</p>
元素
p
代表段落,一般以區塊層級 (block-level) 方式呈現,會是一個「獨立」的矩形 box ,可特別稱為 block boxes (圖中綠線) 。而p
所包含的「內容」 (content) 可想像成,由「三節」行內層級 (inline-level) 或文字層級 (text-level) 的文字組成,三個行內層級元素 (inline-level emements) 當然都有自己的 box ,可特別稱為 inline boxes ,以一個個「自動緊接」的方式呈現,與 block boxes 圍成「一區」的矩形不盡相同。1 與 3 只是文字,屬於文字層級 (text-level) 元素,雖然有「自然產生」的 inline boxes ,不過由於沒有賦予特定的元素名稱,也可稱為「不具名 (anonymous) 元素」,所以無法經由 css selectors 為其指定
padding
,border
,margin
等;而 2 因為已被指定成em
元素 (行內層級元素) ,就可以由設計者定義。行內層級元素無法容納在一行內時, inline boxes 就會拆斷成二行或是數行,範例中的 em 元素就可能拆成二行或是三行的矩形框 (圖中藍線),不再是標準的一塊矩形而已了。 inline boxes 的「左邊」在該元素第一行起始的左方,「右邊」在最末行結尾的右方,所以如果指定「左或右」的
padding
,border
,margin
時,只會在第一行和最末行作用,不會在各分行的「拆斷處」產生;指定「上或下」會在各行產生 (當然,依據margin
規則,定義「上或下」不會作用在「不可替換」行內元素 (non-replaced inline elements)) 。抽象的 line box 因 inline boxes 而產生
line box 像是抽屜,也像骨架一般,將行內元素分成一層一層「收納」,如前例 (圖中紅線),一層放不下就會轉到下一層。通常會看到行與行之間其實會有些許的空隙,不只是「字」的高度而已,這就是 line box 這個抽屜的高度,並不是 inline box 的高度。所以,實際上 inline boxes 是存在於一行一行抽象的 line box 裡,而 line box 一行行疊成區塊層級元素 (如前例的
p
) 。 line box 由上向下,一行緊鄰著一行,而且永遠不會相互重疊。line box 與前面所講的 box 不同, line box 是因行內元素所產生的抽象空間,只是區塊層級元素 (block-level elements) 的 box model 一部分而已,不是真實的元素,所以也不可能為其指定 box 的各項數值 (如
width
,height
,padding
,border
,margin
等) 。 line box 的寬度根據其容納區 (containing block) 所決定,而高度則由 cssline-height
或vertical-align
的定義來決定。多重的 block boxes 像洋葱一層包著一層
實際上,每一個區塊層級元素 (block-level elements) ,必然會由另一個區塊層級元素包圍,根元素除外 (root element, html 文件指的就是
html
元素) ,所以,許多個 block boxes 一層一層包圍起來時就好似洋葱的構造。xhtml
<blockquote>
<h1>聯想的遊戲</h1>
<p>看到三國演義想到七俠五義。看到紅樓夢想到牡丹亭。看到山海經想到鏡花緣。看到芭蕉扇想到鐵扇公主。看到豬八戒想到沙悟淨。看到孫悟空想到如來佛。看到史記想到司馬遷。看到船想到孔明借箭。看到滿山秋色想到最愛的詩人王維。看到赤子純真一般的畫想到豐子愷。看到李叔同想到大護法夏丏尊。~節錄自 monica 「聯想的遊戲」</p>
</blockquote>
很明顯地,
h1
,p
,blockquote
都是區塊層級元素。h1
與p
的「內容」 (content) 僅包含著行內層級的元素,就像前面一樣,兩者各自擁有矩形的 block box ,也都可以各自指定padding
,border
,margin
(圖中紅線) 。而blockquote
從外包圍著h1
與p
,h1
與p
成了blockquote
的「內容」 (content) ;blockquote
形成另一個 block box (圖中綠線) ,當然也可以指定 box 的各項數值。