Warning:
This wiki has been archived and is now read-only.

CSS2/visufx

From HTML5 Chinese Interest Group Wiki
Jump to: navigation, search

視覺效果

内容概要

溢出與剪裁

一般來說,一個塊盒的內容的顯示侷限在盒的內容邊內,但是在某些情況下,盒可能會溢出,也就是盒的內容部份甚至完全跑到盒的外面,例如:

  • 無法斷行造成行盒比塊盒還寬。
  • 塊級盒比包含塊還寬。這可能發生在元素有一個會讓生成塊盒跑出包含塊界線的 'width' 屬性值的時候。
  • 元素的高度超過直接指定高度的包含塊(也就是,包含塊的高度由 'height' 而不是內容高度決定的時候)。
  • 子孫盒透過絕對定位部份跑到盒外。這種盒的祖先不總是用 'overflow' 屬性剪裁這種盒 ― 具體來說,在這種盒與它的包含塊之間的任何祖先不會因為溢出剪裁這種盒。
  • 子孫盒的負邊界讓該盒部份定位在盒外。
  • 'text-indent' 屬性讓行內盒懸掛在塊盒的左邊或右邊。

當溢出發生時,'overflow' 指定一個盒要不要用邊框邊剪裁,也指定有剪裁的時後要不要提供用捲動機制來讓使用者存取被剪掉的內容。

溢出 ― 'overflow' 屬性

'overflow'

取值: hidden | scroll | auto | inherit
初始: visible
適用於: 塊容器
繼承:
百分比: (不適用)
媒介: 視覺
計算值: 同指定值

當塊容器元素的內容溢出元素的盒的時候,這個屬性可以用來指定使用者代理會不會剪裁該內容。除了某些子嗣元素(包含塊是視口或是指定元素的祖先)與其內容與子嗣以外,這個屬性影響元素的所有內容。本屬性各取值的意義如下:

visible

這個值代表使用者代理不剪裁內容,也就是使用者代理在塊盒的外面渲染內容。

hidden

這個值代表使用者代理會剪裁內容,而且使用代理不應提供用來瀏覽剪裁範圍外面內容的捲動介面。

scroll

這個值代表使用者代理會剪裁內容,而且若使用者代理使用的是螢幕上可見的捲動機制(例如滾動條或是搖鏡板),不管內容有沒有被剪裁,使用者代理應該顯示該機制。這避免了動態環境下滾動條出現或是消失造成的問題。若網頁作者指定了這個值且目標媒介是 'print',使用者代理可以列印溢出的內容。

auto

'auto' 值的行為隨使用者代理而不同。使用者代理應該為溢位的盒提供捲動機制。

就算 'overflow' 設置為 'visible',原生作業系統可能用 UA 的文件視窗剪裁內容。

使用者代理必須將設在根元素的 'overflow' 值使用於視口上。若根元素是 HTML "HTML" 元素或 XHTML "html" 元素且根元素有一個子節點是 HTML "BODY" 或 XHTML "body",則若根元素上的取值是 'visible',使用者代理必須改用這一個這種子節點上 'overflow' 的值於視口上。使用者代理必須將視口上的 'value' 值以 'auto' 解讀。傳值給視口的元素 'overflow' 的使用值必須為 'visible'。

在使用者代理於元素盒的邊設置滾動條的情況下,使用者代理應該將滾動條插入至內邊框邊與外邊界邊的中間。使用者代理應該將滾動條占的空間從元素形成的包含塊中拿掉(從相應的邊減掉)。

在下面例子中,塊引用(<blockquote>)大於其包含塊(由 <div> 建立的)。原始碼如下:

<div> <blockquote> <p>I didn't like the play, but then I saw it under adverse conditions - the curtain was up.</p> <cite>- Groucho Marx</cite> </blockquote> </div>

以下樣式表控制產生的盒的大小與樣式:

div { width : 100px; height: 100px; border: thin solid red; } blockquote { width : 125px; height : 100px; margin-top: 50px; margin-left: 50px; border: thin dashed black } cite { display: block; text-align : right; border: none }

'overflow' 的初始值是 'visible',因此使用者代理不剪裁 <blockquote>,就像這樣:

overflow1.png

另一方面,將 <div>'overflow' 設成 'hidden' 會讓使用者代理用 <div> 剪裁 <blockquote>

overflow2.png
'scroll' 值會叫支援可見捲動機制的 UA 顯示該機制以讓使用者存取剪掉的內容。

最後,考慮有絕對定位元素跟已溢出的父元素的情形。

樣式表:

container { position: relative; border: solid; } scroller { overflow: scroll; height: 5em; margin: 5em; } satellite { position: absolute; top: 0; } body { height: 10em; }

文件片段:

<container> <scroller> <satellite/> <body/> </scroller> </container>

在這個例子中,因為 "statellite" 元素的包含塊在 "srollbar" 元素之外("scrollbar" 中溢出的內容會被剪掉但是可以透過捲動瀏覽),使用 "scroller" 元素的滾動條不會捲動 "satellite" 元素。

剪裁 ― 'clip' 屬性

剪裁範圍是指元素邊框盒可見的部份。在預設狀態下,使用者代理不剪裁元素,但是網頁作者可直接透過 'clip' 屬性設定剪裁範圍。

'clip'

取值: <shape> | auto | inherit
初始: auto
適用於: 絕對定位元素
繼承:
百分比: (不適用)
媒介: 視覺
計算值: 若指定值為 'auto',則計算值為 'auto',否則計算值是一個有四個取值的長方形,其中各個值如果原先指定植是 'auto' 則計算值為 'auto',否則為計算長度。

'clip' 屬性僅適用於絕對定位元素。本屬性各取值的意義如下:

auto

使用者代理不剪裁元素。

<shape>

在 CSS 2.1 中,唯一合法的 <shape> 值是:rect(<top>, <right>, <bottom>, <left>),其中 <top><bottom> 指定從頂邊框邊開始算的偏移,<right><left> 指定從左邊框邊開始算的偏移。網頁作者應該用逗號分隔各偏移值。使用者代理必須支援用逗號區隔各偏移值,但是因為本規範前一個版本在這個地方有含糊之處,使用者代理也可支援不用逗號區隔(但是不混著用)偏移值。

網頁作者可把 <length> 值或 'auto' 當作 <top><right><bottom><left> 用。本規範允許負的長度。'auto' 值代表剪裁範圍對應的邊會是元素生成的邊框盒的邊(也就是,'auto' 值在 <top><left> 的地方與 '0' 相等,在 <bottom> 的地方與高度的使用值加垂直邊距與邊框寬度的總和相同,在 <right> 的地方與寬度的使用值加水平邊距與邊框寬度的總和相同,使得四個 'auto' 值會讓剪裁範圍變成與元素的邊框盒相同)。

在將座標四捨五入成像素座標時,使用者代理應該注意在 <left> 與 <right> 有相同取值(或是 <top> 與 <bottom> 有相同取值)的情況下沒有任何可見像素,反過來說使用者代理應該注意在這些值是 'auto' 的時候,元素的邊框盒沒有隱藏的像素。

使用者代理用一個元素的剪裁範圍剪去元素任何在剪裁區域外面的部份(例:內容、子節點、背景、邊框、文字裝飾、外框、可見捲動機制)。被減去的內容不會造成溢位。

元素的祖先也可能剪裁自己的內容(例:透過自己的 'clip' 屬性或自己不是 'visible' 的 'overflow' 值)― 瀏覽器會渲染交集。

若剪裁範圍超出 UA 文件視窗的邊界,原生作業系統可能用視窗剪裁內容。

假設兩個 P 都是 50 x 55 px,以下兩個規則:

p#one { clip: rect(5px, 40px, 45px, 5px); } p#two { clip: rect(5px, 55px, 45px, 5px); }

會各自產生在下面闡釋中虛線圍起來的長方形剪裁區域:

clip.png
注:在 CSS2.1 中所有剪裁區域都是長方形。我們預期 CSS 未來的發展會允許非長方形的剪裁區域。規範未來更新也可能重新引入從各邊而不是一個點偏移的語法。

可見性 ― 'visibility' 屬性

'visibility'

取值: hidden | collapse | inherit
初始: visible
適用於: 所有元素
繼承:
百分比: (不適用)
媒介: 視覺
計算值: 同指定值

'visiblity' 屬性可以用來指定使用者代理是否渲染元素產生的盒。不可見的盒仍然會影響布局(不然可以設 'display' 為 'none' 讓元素不產生盒)。本屬性各取值的意義如下:

visible

元素產生的盒是可見的。

hidden

元素產生的盒不可見(完全透明,使用者代理不繪製),但是仍影響布局。另外,元素有 'visibility: visible' 的子嗣元素會是可見的。

collapse

詳情請看表格章節裡關於動態行列效果的小節。若這個取值用在不是行、行群組、列、列群組元素上,'collpase' 與 'hidden' 的意義相同。

網頁作者可配合腳本使用本屬性來製作動態效果。

在下面範例中,如果按下其中一個按鈕,使用者代理會呼叫一個自定義的腳本函數,讓對應的盒出現並讓另外一個消失。由於這些盒有相同的大小與位置,看起來會有一個盒替換成另外一個的效果。(腳本代碼使用的是一個假想的腳本語言,有可能也有可能不在任何一個 CSS UA 上有任何效果。) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <HTML> <HEAD><TITLE>Dynamic visibility example</TITLE> <META http-equiv="Content-Script-Type" content="application/x-hypothetical-scripting-language"> <STYLE type="text/css"> <!-- #container1 { position: absolute; top: 2in; left: 2in; width: 2in } #container2 { position: absolute; top: 2in; left: 2in; width: 2in; visibility: hidden; } --> </STYLE> </HEAD> <BODY> <P>Choose a suspect:</P> <DIV id="container1"> <IMG alt="Al Capone" width="100" height="100" src="suspect1.png"> <P>Name: Al Capone</P> <P>Residence: Chicago</P> </DIV> <DIV id="container2"> <IMG alt="Lucky Luciano" width="100" height="100" src="suspect2.png"> <P>Name: Lucky Luciano</P> <P>Residence: New York</P> </DIV> <FORM method="post" action="http://www.suspect.org/process-bums"> <P> <INPUT name="Capone" type="button" value="Capone" onclick='show("container1");hide("container2")'> <INPUT name="Luciano" type="button" value="Luciano" onclick='show("container2");hide("container1")'> </FORM> </BODY> </HTML>