看不到效果?
如果您看不到正確的呈現?(強烈建議以下)
  1. 請更新您的瀏覽器版本。
  2. 如果您是使用 ie 9 以上版本仍舊看不到應有的呈現:
    • [功能表列] > [工具] > [相容性檢視設定],取消勾選 [包含來自 Microsoft 的更新網站清單] 。這將會影響您瀏覽其他編排不正確的網站,如果您不想這樣,只是想這次暫時看到,請使用下一項方式。
    • [功能表列] > [工具] > [F12 開發者工具] (或直接按 F12) ,在開啟的下方視窗 [瀏覽器模式] 選 [Internet Explorer 9] , [文件模式] 選 [Internet Explorer 9 標準] ;再按 F12 就可以關掉下方視窗。這個方式可能每次進站都需要再麻煩指定一次。

css transform 能旋轉、傾斜、縮放變形 box

  • 說明:運用 css level 3 (css 3) 的 2D transform 特性 (css properties) ,直接就可以旋轉、歪斜、放大、縮小、移動元素 (elements) 的 box 。包括整個元素所有的內容也都隨之變形,不再侷限只能在僵硬的矩形框,對網頁排版及設計上會有很大的彈性和突破,而且對網頁正常的編排不會有相互排擠問題,一格黏接一格耗時費工的殘腦時代終將走入歷史。
  • 適合:有 htmlcss 語法基礎概念者。
  • 難度:等級2
  • 更新:2011-07-13
  • 支援: firefox, safari, google chrome, opera, ie9 (至撰文時,皆仍為廠商專屬擴充特性,須加上辨識詞) 。
標準語法
transform: transform-function;
說明
  • 特性值不像一般的數值,而是以像數學函數的方式表示;因為數據需要經過較複雜的公式運算出四邊形四角的位置。依照各種不同的變形效果,有數種變形函數,稍後說明。
  • 預設值 none ;表示沒有套上任何變形。
  • 如果變形函數中使用百分比 (%) 做為移動的數據,以元素本身的 box 尺寸為百分比計算基準。注意,這和 css box 以容納區 (containing block) 尺寸為計算基準不同。
  • 同一元素可套用多個變形函數,函數間以半形空格間隔,瀏覽器會依序套用。
  • 預設變形的參考點在 box 中心,旋轉、傾斜、縮放、移動等都以參考點為基準。透過 transform-origin 特性 (稍後說明) ,可指定不同的位置點;例如我們想以元素的左上角為旋轉中心軸,或是中心軸改在元素的外面也可以。
  • 適用元素: block-level and inline-level elements
  • 適用媒體: visual
  • 不被繼承。
變形函數 transform-function (transformation functions)

函數括號內的角度 θ 參數必須有單位,可以是 deg (角度 ° ) 、 rad (弧度) 、 grad (梯度) ,大小寫都可接受; m, a, b, c, d, e, f 參數為數字,不需要單位; o 參數為合法的尺寸值 (length) 或 % (百分比) 。

rotate(θ)
指定元素以參考點為中心軸 2D 旋轉 θ 度。
skewX(θ)
指定元素以參考點為中心軸沿著橫向傾斜 θ 度。
skewY(θ)
指定元素以參考點為中心軸沿著縱向傾斜 θ 度。
skew(θxy)
指定元素以參考點為中心軸沿著橫向傾斜 θx 度、 縱向傾斜 θy 度,等於是結合 skewX(θx), skewY(θy) 。參數如果只指定 1 個,省略的第 2 個參數,會視為 0 ,也就是只有沿橫向傾斜。
scaleX(m)
指定元素由參考點橫向縮放 m 倍。
scaleY(m)
指定元素由參考點縱向縮放 m 倍。
scale(mx,my)
指定元素由參考點 2D 橫向縮放 mx 倍、縱向縮放 my 倍,等於是結合 scaleX(mx), scaleY(my) 。參數如果只指定 1 個,省略的第 2 個參數,會等於第 1 個,也就是橫向、縱向以相同比例縮放。
translateX(o)
指定元素由參考點橫向移動 o 距離。
translateY(o)
指定元素由參考點縱向移動 o 距離。
translate(ox,oy)
指定元素由參考點 2D 橫向移動 ox 距離、縱向移動 oy 距離,等於是結合 translateX(ox), translateY(oy) 。參數如果只指定 1 個,省略的第 2 個參數,會視為 0 ,也就是只有橫向移動。
matrix(a,b,c,d,e,f)
指定元素由參考點依據數學變形矩陣 (transformation matrix) 的 6 個參數值產生 2D 變形。矩陣的目的主要在運算出四邊形四角的座標,屬於數學問題,這裡就不作太多討論了。事實上,前述的各項變形函數都是簡化這個矩陣而拆解出來的,稍後範例會看到對照。有一些線上工具可以比較容易幫我們產生這些參數值。
語法實例
transform:rotate(3deg);
transform:skewX(20deg);
transform:scaleY(1.8);
transform:translateX(60px);
transform:translate(180px) rotate(-5deg) scale(0.8);
transform:matrix(0,1.611,1.611,0.278,5,5);

後面會有更多例子討論。

transform-origin 特性 (property) 指出變形的參考點座標 (中心軸)

標準語法
transform-origin: x y;
說明
  • 共有 2 個特性值,每個值之間以至少一個半形空格間隔。
  • 2 個值可以是尺寸值 (length) 或 % (百分比) 或方位關鍵字 (keywords) ; % 以元素本身的 box 尺寸為百分比計算基準。
  • 使用尺寸值或 % ,依序表示參考點橫座標 (x) 、縱座標 (y) 。 padding-box 的左上角座標為 (0,0) 。
  • 預設值為 50% 50% ;就是在 box 中心點。
  • 使用方位關鍵字 (center, top, right, bottom, left) ,依據字意即可表示方向和位置,所以 2 個值沒有順序問題。
  • 如果省略第 2 個值,會視為 center (50%) 。
  • 適用元素:block-level and inline-level elements
  • 適用媒體: visual
  • 不被繼承。
語法實例
transform-origin:100px 20px;
transform-origin:right;

廠商專屬擴充特性 (vendor-specific extensions)

各家瀏覽器廠商都有自創的 css 特性 (多半指非 w3c 標準規範) ,可提供更多額外的功用。廠商經常為了搶先支援 w3c 未正式發佈的規範,也會先以擴充特性來處理。

廠商專屬擴充特性的語法: - (減號) 接上廠商辨識詞 (vendor identifier) ,再接 - (減號) 作為類似前置詞,然後再接特性。- (減號) 換成 _ (底線) 也可以,目前大多習慣用 - 。

以下列出幾個較常見的瀏覽器供應廠商:

  • -moz-特性:適用 firefoxMozilla Gecko 系列。
  • -webkit-特性:適用 safari, google chrome 等系列。
  • -o-特性:適用 opera 系列。
  • -ms-特性:適用 iemicrosoft 系列。

例如在 ie 用到的濾鏡特性 -ms-filter 就是 。本篇所討論的 transform 特性,撰文時也都暫時為各家擴充特性。

思考 - css 變形效果 (css transform) 突破網頁排版障礙

css transform 變形效果支援的 html 元素,舉凡圖片 (img) 、視訊影片 (video) 、多媒體物件 (object) 都可以旋轉、傾斜,這讓設計者輕輕鬆鬆就能做出令人驚歎的視覺效果。

元素經過變形後,瀏覽器會以插補像素 (interpolation) 運算後重新繪製呈現,以降低出現鋸齒或模糊的現象,這是值得讚許的技術,因為不再需要花不必要的工夫去處理變形後圖形失真或文字模糊的問題。各家瀏覽器插補運算方式當然不盡相同,所以看起來會有些許差異。

撰文時, transform 特性都還是各家的專屬擴充特性,所以在特性前都需要加上廠商辨識詞,稍後範例的語法以較淡色呈現這部分。

每個範例的 css 都有指定相同的背景顏色、相同的 border 。另外加了紅色瞄準標記,只是為了表示變形參考點位置,所以語法內沒有列出。
background:rgba(90%,95%,100%,0.85);
border:1px solid silver;
display:inline-block;
padding:0.5em 0.75em;

以下範例的每項主題都有加了對應的 css 效果,沒看到應該有的效果?

旋轉效果 transform:rotate(θ)

旋轉的變形矩陣語法 transform:matrix(cosθ,sinθ,-sinθ,cosθ,0,0)

以元素 box 中心點為旋轉軸,順時針旋轉 3° 。 (游標移入可比較原來的樣子)

元素的所有內容,包括文字、圖片也都旋轉,而且不會影響其它版面編排。

-moz-transform:rotate(3deg);
-webkit-transform:rotate(3deg);
-o-transform:rotate(3deg);
-ms-transform:rotate(3deg);
transform:rotate(3deg);
以元素 box 右下角為旋轉軸,逆時針旋轉 3° (負數角度) 。 (游標移入可比較原來的樣子)

transform-origin 特性指定右下角為旋轉的基準點。

-moz-transform-origin:right bottom;
-moz-transform:rotate(-3deg);
-webkit-transform-origin:right bottom;
-webkit-transform:rotate(-3deg);
-o-transform-origin:right bottom;
-o-transform:rotate(-3deg);
-ms-transform-origin:right bottom;
-ms-transform:rotate(-3deg);
transform-origin:right bottom;
transform:rotate(-3deg);
翻轉效果,倒過來看…還有什麼不可能?

旋轉 180° 、或是範例的 π 弧度 (轉半圈) ,就會翻倒了。 (游標移入中心可比較原來的樣子)

-moz-transform:rotate(3.14159rad);
-webkit-transform:rotate(3.14159rad);
-o-transform:rotate(3.14159rad);
-ms-transform:rotate(3.14159rad);
transform:rotate(3.14159rad);

傾斜效果 transform:skewX(θ), transform:skewY(θ), transform:skew(θxy)

傾斜的變形矩陣語法 transform:matrix(1,tanθy,tanθx,1,0,0)

以元素 box 下緣中間為基準,沿著橫向 (橫軸) 平行方式傾斜 20° 。 (游標移入可比較原來的樣子)

transform-origin 特性指定下緣中間為傾斜的基準點,只用特性值 bottom ,另一方向視為 center

-moz-transform-origin:bottom;
-moz-transform:skewX(20deg);
-webkit-transform-origin:bottom;
-webkit-transform:skewX(20deg);
-o-transform-origin:bottom;
-o-transform:skewX(20deg);
-ms-transform-origin:bottom;
-ms-transform:skewX(20deg);
transform-origin:bottom;
transform:skewX(20deg);
以元素 box 左側中間為基準,沿著縱向 (縱軸) 以平行方式傾斜 5° 。 (游標移入可比較原來的樣子)

transform-origin 特性指定左緣中間為傾斜的基準點,只用特性值 left ,另一方向視為 center

-moz-transform-origin:left;
-moz-transform:skewY(5deg);
-webkit-transform-origin:left;
-webkit-transform:skewY(5deg);
-o-transform-origin:left;
-o-transform:skewY(5deg);
-ms-transform-origin:left;
-ms-transform:skewY(5deg);
transform-origin:left;
transform:skewY(5deg);
沿橫向傾斜 -25°,也沿縱向傾斜 5° 。 (游標移入可比較原來的樣子)

skew() 指定 2 個參數依序表示沿著橫軸及縱軸傾斜,等於是結合 skewX(), skewY() 。如果只指定 1 個,省略的第 2 個參數,會視為 0 ;沒有另外指定縱向傾斜,skew(20deg)skewX(20deg) 會是一樣的。

-moz-transform:skew(-25deg,5deg);
-webkit-transform:skew(-25deg,5deg);
-o-transform:skew(-25deg,5deg);
-ms-transform:skew(-25deg,5deg);
transform:skew(-25deg,5deg);

縮放效果 transform:scaleX(m), transform:scaleY(m), transform:scale(mx,my)

縮放的變形矩陣語法: transform:matrix(mx,0,0,my,0,0)

以元素 box 左側中間為基準,橫向 (僅寬) 放大 1.2 倍。 (游標移入可比較原來的樣子)

transform-origin 特性指定左側中間為放大的基準點,只用特性值 0 ,垂直方向視為 center

-moz-transform-origin:0;
-moz-transform:scaleX(1.2);
-webkit-transform-origin:0;
-webkit-transform:scaleX(1.2);
-o-transform-origin:0;
-o-transform:scaleX(1.2);
-ms-transform-origin:0;
-ms-transform:scaleX(1.2);
transform-origin:0;
transform:scaleX(1.2);
以元素 box 中心為基準,縱向 (僅高) 放大 1.8 倍。 (游標移入可比較原來的樣子)

以中心為基準,縱向橫向縮放都會向上下或左右兩個方向內縮或擴大。

-moz-transform:scaleY(1.8);
-webkit-transform:scaleY(1.8);
-o-transform:scaleY(1.8);
-ms-transform:scaleY(1.8);
transform:scaleY(1.8);
以元素 box 左側中間為基準,橫向縮小 0.8 倍、縱向放大 1.8 倍。 (游標移入可比較原來的樣子)

scale() 指定 2 個參數依序表示橫向、縱向縮放,等於是結合 scaleX(), scaleY() 。以 transform-origin 特性指定左側中間為縮放的基準點,只用特性值 0 ,垂直方向視為 center

-moz-transform-origin:0;
-moz-transform:scale(0.8,1.8);
-webkit-transform-origin:0;
-webkit-transform:scale(0.8,1.8);
-o-transform-origin:0;
-o-transform:scale(0.8,1.8);
-ms-transform-origin:0;
-ms-transform:scale(0.8,1.8);
transform-origin:0;
transform:scale(0.8,1.8);
以元素 box 中心為基準,橫向縱向等比例縮小 0.8 倍。 (游標移入可比較原來的樣子)

簡單地只指定 1 個參數表示橫向、縱向縮放同一比例,也就是等同 scale(0.8,0.8) 的意思。

-moz-transform:scale(0.8);
-webkit-transform:scale(0.8);
-o-transform:scale(0.8);
-ms-transform:scale(0.8);
transform:scale(0.8);
鏡射效果,就像倒影或照鏡子效果。

負數的縱向縮放參數產生上下顛倒的效果,負數的橫向縮放參數產生左右顛倒的效果,就像倒影或照鏡子效果。 (游標移入桃紅色符號中央可比較原來的樣子)

-moz-transform:scaleY(-1.8);
-webkit-transform:scaleY(-1.8);
-o-transform:scaleY(-1.8);
-ms-transform:scaleY(-1.8);
transform:scaleY(-1.8);

移動效果 transform:translateX(o), transform:translateY(o), transform:translate(ox,oy)

移動的變形矩陣語法: transform:matrix(1,0,0,1,ox,oy)

以元素 box 中心點為基準,向右橫向移動 60 像素。 (游標移入可比較原來的樣子)

橫向移動,正值向右、負值向左。這樣的效果和以往運用 position:relative; 指定位移 (offset) 的方法簡直沒什麼兩樣,但是這個移動方式除了語法單純易懂外,還可結合其它變形,更具發揮設計的便利。

-moz-transform:translateX(60px);
-webkit-transform:translateX(60px);
-o-transform:translateX(60px);
-ms-transform:translateX(60px);
transform:translateX(60px);
以元素 box 中心點為基準,向右橫向移動本身寬度 50% 的距離。 (游標移入可比較原來的樣子)

以百分比為單位,橫向移動以元素本身的寬度計算,縱向移動則以的高度計算;這和 css box 以容納區 (containing block) 尺寸為百分比計算的基準不同。

-moz-transform:translateX(50%);
-webkit-transform:translateX(50%);
-o-transform:translateX(50%);
-ms-transform:translateX(50%);
transform:translateX(50%);
以元素 box 中心點為基準,向下縱向移動 0.75em。 (游標移入可比較原來的樣子)

縱向移動,正值向下、負值向上。

-moz-transform:translateY(0.75em);
-webkit-transform:translateY(0.75em);
-o-transform:translateY(0.75em);
-ms-transform:translateY(0.75em);
transform:translateY(0.75em);
以元素 box 中心點為基準,向左 40 像素、向下 8 像素,整個朝左下方向移動。 (游標移入可比較原來的樣子)

translate() 指定 2 個參數依序表示橫向、縱向移動距離,等於是結合 translateX(), translateY()。如果只指定 1 個,省略的第 2 個參數,會視為 0 ;沒有另外指定縱向移動,translate(50px)translateX(50px)會是一樣的。

-moz-transform:translate(-40px,8px);
-webkit-transform:translate(-40px,8px);
-o-transform:translate(-40px,8px);
-ms-transform:translate(-40px,8px);
transform:translate(-40px,8px);

同時綜合多種不同變形效果。

以元素 box 中心點為基準,橫移 180 像素、旋轉 -5° 、縮小 0.8 。 (游標移入可比較原來的樣子)

同時在一個元素加入 3 種變形效果,以半形空格間隔,會依序運算套用。

-moz-transform:translate(180px) rotate(-5deg) scale(0.8);
-webkit-transform:translate(180px) rotate(-5deg) scale(0.8);
-o-transform:translate(180px) rotate(-5deg) scale(0.8);
-ms-transform:translate(180px) rotate(-5deg) scale(0.8);
transform:translate(180px) rotate(-5deg) scale(0.8);
以元素 box 中心點為基準,旋轉 -5° 、縮小 0.8 、橫移 180 像素。 (游標移入可比較原來的樣子)

與前例套用相同 3 種變形效果,但是由於順序不同,仔細觀察其實是不同結果。橫移是在最後發生,所以實際上是延著旋轉後的角度 -5° 橫移 (不是水平方向) 。

-moz-transform:rotate(-5deg) scale(0.8) translate(180px);
-webkit-transform:rotate(-5deg) scale(0.8) translate(180px);
-o-transform:rotate(-5deg) scale(0.8) translate(180px);
-ms-transform:rotate(-5deg) scale(0.8) translate(180px);
transform:rotate(-5deg) scale(0.8) translate(180px);

matrix 複雜的變形矩陣,稍舊版 ie 也能玩 matrix

如果需要使用 matrix 產生更複雜的變形,矩陣的數值實在很難以一般方式計算。真好!感謝 Zoltan 寫好了可以幫我們產生 6 個參數的線上工具程式 Matrix Construction Set ,不過要有支援 html 5 Drag and Drop 的瀏覽器才能使用;也感謝 WEB 前端開發 (CSS88.com) 做了線上工具程式可輸入 6 個參數立即看到測試結果。讀者自己玩玩看囉!

ie8 及較舊版,可使用 ie 專屬擴充特性 Matrix filter (ie9 起已不再支援) ,原理與 transform:matrix(a,b,c,d,e,f) 是一樣的,語法大致上會是這樣:

filter:progid:DXImageTransform.Microsoft.Matrix(…);

對照參數 M11a, M21b, M12c, M22d, Dxe, Dyf ,詳細可參閱 microsoft Matrix filter

表格竟然也能旋轉。

transform 規定只能作用在 block-level and inline-level 的元素,不過各家瀏覽器居然連表格類 (tabular) 也都有用。

  • 表格 (如 table) :所有瀏覽器有效。指定 border-collapse:collapse; 特性 (儲存格間沒空隙) , firefox 原有 border 會消失。
  • 表格儲存格 (如 th, td) :僅 opera 無效。
  • 表格列 (如 tr) firefox, safari, google chrome 有效。
  • 表格儲存格、表格列:在外層 table 元素指定了 border-collapse:collapse; 特性 (儲存格間沒空隙) ,各家瀏覽器產生有趣的呈現,讀者可以自行試試。
  • 擬元素 (Pseudo-elements) : ::before, ::after google chrome, safari 無效; ::first-letter, ::first-line 都不支援。
參考資源
散佈、展示請參閱 Creative Commons 授權條文,禁止重混,引述請增加原文連結。
, , , , , , , , , ,

Posted by 不惑仔 at 痞客邦 PIXNET 留言(3) 引用(0) 人氣()

css box-shadow 產生陰影效果或光暈效果的特性

  • 說明:元素 (elements) 的 box 呈現陰影或光暈的效果。可指定陰影的位移距離、顏色、模糊程度、擴散程度,也支援內陰影,甚至多層次堆疊的陰影。運用這個 css level 3 (css 3) 的特性 (css property) ,讓我們可以很輕鬆就能呈現迷人的視覺效果,而不需要煩瑣地一張一張製作圖片。更具意義的是,產生的陰影不會對版面編排造成影響。
  • 適合:有 htmlcss 語法基礎概念者。
  • 難度:等級1
  • 更新:2011-06-16
  • 支援: firefox, google chrome, opera, ie9 (至撰文時) 。
標準語法
box-shadow: x y blur spread color inset;
說明
  • 共有 6 個特性值,每個值之間以至少一個半形空格間隔。預設值為 none (只有一個字) 。
  • 前面 4 個都是尺寸值 (length,不接受 %) ,依序表示水平位移距離 (x) 、垂直位移距離 (y) 、模糊強度 (blur) 、擴散強度 (spread) ,不可被其它的值插進其間。
  • 產生陰影,前 2 個位移值 (x y) 為必要值,必須指定;其餘的值可不定義。
  • 模糊 (blur) 及擴散 (spread) 強度預設值 (沒有定義時) 一般為 0 。模糊不能為負值。
  • 第 5 個可指定陰影顏色 (color) , css 合法的顏色值表示法都可以,顏色值放在位移值前面也可以。沒有定義會使用 (或繼承) color 特性指定的顏色值。
  • 第 6 個可指定為內陰影 (inset) ,改放在第 1 個位置也可以。沒有定義就是一般在外的陰影。
  • 所有組合起來的值,可增加為多組,以 , (逗號) 分隔,依序表示由前至後堆疊的多層陰影。
  • 適用元素:全部。
  • 適用媒體: visual
  • 不被繼承。
語法實例
box-shadow:4px 4px 3px rgba(20%,20%,40%,0.5);
box-shadow:2px 2px 1px rgba(20%,20%,40%,0.5) inset;
box-shadow:2px 2px 2px rgba(20%,20%,40%,0.6),4px 4px 6px rgba(20%,20%,40%,0.4),6px 6px 12px rgba(20%,20%,40%,0.4);

接下來會有更多例子討論。

思考 - css box-shadow 輕鬆呈現質感好、多變化的陰影效果或光暈效果。

外陰影 (或外光暈) 會依據 border-box 來計算尺寸及位移,而內陰影 (或內光暈) 則依據 padding-box 來計算。

稍後會看到範例的語法,都有增加了前兩段廠商專屬擴充特性,提供給部分瀏覽器未正式支援標準語法之前的較舊版本使用,加不加這段應視網站的適用領域,並不影響較新版瀏覽器,語法中以較淡色呈現。

  • 前面有 -moz- 的:適用 firefox 等較舊版 Gecko 系列。
  • 前面有 -webkit- 的:適用 safari, google chrome 等較舊版 webkit 系列。
每個範例的 css 都有指定相同的背景顏色、相同的 border
background:#def;
border:1px solid silver;
display:inline-block;
padding:0.5em 0.75em;

以下範例的每項主題都有加了對應的 css 效果,沒看到應該有的效果?

至少需要 2 個尺寸值,先後表示陰影的「水平」 (x) 「垂直」 (y) 位移距離, 0 值表示沒有位移 (就是 box 的位置) 。
-moz-box-shadow:4px 4px rgba(20%,20%,40%,0.5);
-webkit-box-shadow:4px 4px rgba(20%,20%,40%,0.5);
box-shadow:4px 4px rgba(20%,20%,40%,0.5);
增加第 3 個尺寸值表示陰影的模糊強度 (blur) ,當然增加模糊度也會造成陰影更透明。
-moz-box-shadow:4px 4px 3px rgba(20%,20%,40%,0.5);
-webkit-box-shadow:4px 4px 3px rgba(20%,20%,40%,0.5);
box-shadow:4px 4px 3px rgba(20%,20%,40%,0.5);
使用負數位移值,呈現不同方向的陰影。
-moz-box-shadow:-4px -4px 3px rgba(20%,20%,40%,0.5);
-webkit-box-shadow:-4px -4px 3px rgba(20%,20%,40%,0.5);
box-shadow:-4px -4px 3px rgba(20%,20%,40%,0.5);
加第 4 個尺寸值,表示陰影的擴散強度 (spread) ,也可以強化像光暈的效果。
-moz-box-shadow:4px 4px 12px 4px rgba(20%,20%,40%,0.5);
-webkit-box-shadow:4px 4px 12px 4px rgba(20%,20%,40%,0.5);
box-shadow:4px 4px 12px 4px rgba(20%,20%,40%,0.5);
使用負數 spread 值,像似縮減陰影周圍。
-moz-box-shadow:4px 4px 12px -2px rgba(20%,20%,40%,0.5);
-webkit-box-shadow:4px 4px 12px -2px rgba(20%,20%,40%,0.5);
box-shadow:4px 4px 12px -2px rgba(20%,20%,40%,0.5);
在最前或最尾加 inset 變成內陰影,可呈現凹入的視覺。
-moz-box-shadow:inset 3px 3px 3px rgba(20%,20%,40%,0.5);
-webkit-box-shadow:inset 3px 3px 3px rgba(20%,20%,40%,0.5);
box-shadow:inset 3px 3px 3px rgba(20%,20%,40%,0.5);
內陰影加 spread 值,加強凹入的真實感。
-moz-box-shadow:1px 1px 3px 2px rgba(20%,20%,40%,0.5) inset;
-webkit-box-shadow:1px 1px 3px 2px rgba(20%,20%,40%,0.5) inset;
box-shadow:1px 1px 3px 2px rgba(20%,20%,40%,0.5) inset;
更逼真、更有深度感的陰影。

多層次陰影:一組以上數值,產生由前至後層疊的陰影,以 , (逗號) 分隔。當然陰影的透明顏色是會堆疊顏色的。

-moz-box-shadow:2px 2px 2px rgba(20%,20%,40%,0.6),4px 4px 6px rgba(20%,20%,40%,0.4),6px 6px 12px rgba(20%,20%,40%,0.4);
-webkit-box-shadow:2px 2px 2px rgba(20%,20%,40%,0.6),4px 4px 6px rgba(20%,20%,40%,0.4),6px 6px 12px rgba(20%,20%,40%,0.4);
box-shadow:2px 2px 2px rgba(20%,20%,40%,0.6),4px 4px 6px rgba(20%,20%,40%,0.4),6px 6px 12px rgba(20%,20%,40%,0.4);

有透明區域的圖片 (img 元素) 定義 box-shadow ,當然會在整個 img 元素的 box (包括透明區域) 產生陰影。這個例子除了圖片加陰影,它的外層元素也指定了 inset 陰影,呈現更立體的視覺,語法內沒有寫出,請自行試試嘍。

-moz-box-shadow:2px 2px 2px rgba(20%,20%,40%,0.6),4px 4px 6px rgba(20%,20%,40%,0.4),6px 6px 12px rgba(20%,20%,40%,0.4);
-webkit-box-shadow:2px 2px 2px rgba(20%,20%,40%,0.6),4px 4px 6px rgba(20%,20%,40%,0.4),6px 6px 12px rgba(20%,20%,40%,0.4);
box-shadow:2px 2px 2px rgba(20%,20%,40%,0.6),4px 4px 6px rgba(20%,20%,40%,0.4),6px 6px 12px rgba(20%,20%,40%,0.4);
不同顏色交錯相疊的背影。

不同顏色的陰影,指定交錯的位移,也能呈現特別的視覺。陰影跨越到下方的元素也不會移動排版。

-moz-box-shadow:8px 24px 2px rgba(100%,0%,0%,0.4),16px -4px 2px rgba(0%,100%,0%,0.4),24px 12px 2px rgba(0%,0%,100%,0.4);
-webkit-box-shadow:8px 24px 2px rgba(100%,0%,0%,0.4),16px -4px 2px rgba(0%,100%,0%,0.4),24px 12px 2px rgba(0%,0%,100%,0.4);
box-shadow:8px 24px 2px rgba(100%,0%,0%,0.4),16px -4px 2px rgba(0%,100%,0%,0.4),24px 12px 2px rgba(0%,0%,100%,0.4);
內、外都加陰影,同一個元素就可以搞定。
-moz-box-shadow:6px 6px 6px rgba(20%,20%,40%,0.5),inset 1px 1px 4px 2px rgba(20%,20%,40%,0.5);
-webkit-box-shadow:6px 6px 6px rgba(20%,20%,40%,0.5),inset 1px 1px 4px 2px rgba(20%,20%,40%,0.5);
box-shadow:6px 6px 6px rgba(20%,20%,40%,0.5),inset 1px 1px 4px 2px rgba(20%,20%,40%,0.5);

box-shadow 運用在像 :hover, :focus 之類具有使用者互動的指標 (selectors) ,也會有更多趣味的效果呈現,可以自行多嚐試嘍!

表格或表單控制元件在部分瀏覽器異常呈現

截至撰文時, safari 5 尚未支援 box-shadow 標準語法,必須使用前面提到的 -webkit- 語法。

雖說 box-shadow 可適用在全部元素,不過部分較特別的元素,如表格類、表單控制元件 (controls) ,在瀏覽器上會有不太正常的處理現象。撰文時,特別測試了一些提出來討論。

表格類
  • 表格儲存格 (如 th, td) :如果在外層 table 元素指定了 border-collapse:collapse; 特性 (儲存格間沒空隙) ,在 ie 陰影沒效。
  • 表格列 (如 tr) google chrome, oprea 陰影沒效;在 ie 陰影呈現在儲存格上。
表單控制元件 (controls)
瀏覽器有預設背景色的控制元件 (如 button, input) ,在 ie, google chrome 須指定新的背景色,或背景透明才會有效。
google chrome 需指定 box-shadowcolor 值才會有效。
參考資源
散佈、展示請參閱 Creative Commons 授權條文,禁止重混,引述請增加原文連結。
, , , , , , ,

Posted by 不惑仔 at 痞客邦 PIXNET 留言(0) 引用(0) 人氣()

css attribute selectors (css 屬性指標)

  • 說明:attribute selector 是善用元素 (elements) 既有的屬性 (attributes) 來指出元素,可有效降低不斷為元素命名 idclass 的麻煩。用在程式動態產生的 html ,又不能預先指定 idclass 的元素,也會很有助益;或是也可以找出屬性值 (attribute value) 有局部相同的元素。部分為 css level 3 (css 3) 新的規範。 jQuery attribute selectors 物件 (object) 相對應的語法也附帶列出。
  • 適合:有 htmlcss 語法基礎概念者。
  • 難度:等級2
  • 更新:2011-11-26
  • 支援: firefox, safari, google chrome, opera, ie8, ie7-未支援 css3 (至撰文時)。
  1. selector[att]
    指出具有 att 屬性的元素。
    語法實例
    html 片段
    <dfn lang="en">selector</dfn>
    <label for="mail">email</label>
    css selectors
    dfn[lang]
    label[for]
    jQuery 物件語法
    jQuery('[att]')$('[att]')
    例: $('label[for]')
  2. selector[att=val]
    指出具有 att 屬性且屬性值與 val 完全相符的元素。
    語法實例
    html 片段
    <input type="text"/>
    <button type="reset">清除</button>
    <a href="http://www.w3.org/" rel="external">W3C</a>
    css selectors
    input[type="text"]
    button[type="reset"]
    a[rel="external"]
    jQuery 物件語法
    jQuery('[att=val]')$('[att=val]')
    例: $('input[type="text"]')
  3. selector[att^=val] (此項為 css 3)
    指出具有 att 屬性且屬性值字首 (由開端起算的字串) 與 val 完全相符的元素。 val 為空白時,不會指出任何元素。
    語法實例
    html 片段
    <body class="ch41">…<body class="ch42">…<body class="ch43">…
    <object type="image/png" data="photo.png">…<object type="image/jpg" data="photo.jpg">…
    <a href="http://www.w3.org/">…<a href="http://www.w3.org/Style/CSS/">…<a href="http://www.w3.org/html/">…
    css selectors
    body[class^="ch4"]
    object[type^="image/"]
    a[href^="http://www.w3.org"]
    jQuery 物件語法
    jQuery('[att^=val]')$('[att^=val]')
    例: $('body[class^="ch4"]')
  4. selector[att$=val] (此項為 css 3)
    指出具有 att 屬性且屬性值字尾 (由末端回算的字串) 與 val 完全相符的元素。 val 為空白時,不會指出任何元素。
    語法實例
    html 片段
    <div class="st" id="st1-2">…<div class="st" id="st2-2">…<div class="st" id="st3-2">…
    <img src="images/photo.png"/>…<img src="../images/photo.png"/>…
    css selectors
    *.st[id$="-2"]
    img[src$="photo.png"]
    jQuery 物件語法
    jQuery('[att$=val]')$('[att$=val]')
    例: $('img[src$="photo.png"]')
  5. selector[att*=val] (此項為 css 3)
    指出具有 att 屬性且屬性值至少有一段字與 val 完全相符的元素。 val 為空白時,不會指出任何元素。
    語法實例
    html 片段
    <a href="http://tw.info.yahoo.com/SecurityCenter/">…<a href="http://tw.campaign.money.yahoo.com/atm/">…
    css selectors
    a[href*=".yahoo.com"]
    jQuery 物件語法
    jQuery('[att*=val]')$('[att*=val]')
    例: $('a[href*=".yahoo.com"]')
  6. selector[att|=val]
    指出具有 att 屬性且屬性值與 val 完全相符的元素,或是由開端至 - (減號) 前字元完全相符的元素。
    語法實例
    html 片段
    <div class="article2">…<div class="article2-1">…<div class="article2-2">…
    <a href="http://www.w3.org/" hreflang="en-us">…<a href="http://www.britishmuseum.org/" hreflang="en-uk">…
    css selectors
    div[class|="article2"]
    a[hreflang|="en"]
    jQuery 物件語法
    jQuery('[att|=val]')$('[att|=val]')
    例: $('div[class|="article2"]')
  7. selector[att~=val]
    指出具有 att 屬性且屬性值有一個字以上以空格分隔,其中一個字與 val 完全相符的元素。 val 為空白時,不會指出任何元素。
    語法實例
    html 片段
    <h2 title="Fashion Taipei">…<h2 title="Culture Taipei">…<h2 title="New Taipei City">…
    <a href="../ch1.htm" rel="first start begin">第一頁</a>
    css selectors
    h2[title~="Taipei"]
    a[rel~="start"]
    jQuery 物件語法
    jQuery('[att~=val]')$('[att~=val]')
    例: $('h2[title~="Taipei"]')

較詳細瀏覽器支援問題及 bugs 討論,可參訪 sitepoint (英文)

思考 - 養成良好的語言撰寫習慣

屬性值的引號 (quotes) 應括出來,尤其在 jQuery attribute selector

jQuery
$('img[src$=".png"]')
常常有人會為了少打幾個字而省略引號,
$('img[src$=.png]')

本來語法是被寬鬆地允許,但在 jQuery 1.6 以後做了更嚴謹、更快速的處理,「屬性值」如果包含特別的符號,如例中的 . (句號) ,不加引號就會出現語法錯誤。

縱使以變數做為屬性值,也一樣會錯誤,如:
var f='.png';
$('img[src$='+f+']')
標準的寫法應是,
var f='.png';
$('img[src$="'+f+'"]')

有不少以前的 plugin 都已經出現這種錯誤,光除錯就必須再花很多時間,所以養成良好的書寫習慣是重要的,省東省西不見得省時間。

參考資源
散佈、展示請參閱 Creative Commons 授權條文,禁止重混,引述請增加原文連結。
, , , , , , ,

Posted by 不惑仔 at 痞客邦 PIXNET 留言(0) 引用(0) 人氣()

樹狀選單加入樹狀線條的設計

  • 說明:設計具有樹狀線條的資料夾選單或樹狀選單 (folder menu or tree menu)。本篇的討論僅適用一層子選單,更多層子選單的設計方式,以後再討論。
  • 適合:有設計網頁及撰寫 css 語法經驗者。
  • 難度:等級5
  • 更新:2008-10-13

以下將會討論如何巧妙運用 css 基本特性 (property) 來完成這個實例。

先了解 xhtml 這部分內容的安排。
<div class="TreeMenu">
 <div class="section">
  <h1>古文今讀</h1>
  <ul>
   <li><a href="#">上古神話</a></li>
   <li><a href="#">詩經</a></li>
   <li><a href="#">楚辭</a></li>
   <li><a href="#">諸子散文</a></li>
   <li><a href="#">漢賦選輯</a></li>
   <li><a href="#">樂府</a></li>
   <li><a href="#">駢文</a></li>
   <li><a href="#">唐詩</a></li>
   <li><a href="#">宋詞</a></li>
   <li><a href="#">元曲</a></li>
   <li><a href="#">章回小說</a></li>
  </ul>
 </div>
 <!--.section-->
 <div class="section">
  <h1>現代文藝</h1>
  <ul>
   <li><a href="#">小說</a></li>
   <li><a href="#">散文</a></li>
   <li><a href="#">性靈小品</a></li>
   <li><a href="#">新詩</a></li>
   <li><a href="#">翻譯小說</a></li>
  </ul>
 </div>
 <!--.section-->
</div>
<!--.TreeMenu-->

本篇範例的完整 css 設計內容

思考 - css 設計的構思與佈局

我們儘量以探討方式介紹,引導如何構思及擴展 css 設計,希望能激發更多設計想法為主,避免陷入步驟式或教條式的悲慘學習模式。

開始:定義一些基本的 css 設計

最外圍的 .TreeMenu 指定寬度 (width) 、背景顏色 (background)、邊線 (border) , 而 h1 指定字體大小 (font) , a 去掉底線, ul, h1 去除周圍距離 (padding, margin) 等等。

css
h1, ul {
 margin: 0;
 padding: 0;
}
.TreeMenu {
 width: 10em;
 background: rgb(92%,86%,100%);
 border: 1px solid rgb(60%,60%,80%);
}
.TreeMenu .section h1 {
 font-size: 100%;
 font-weight: normal;
}
.TreeMenu .section ul {
 list-style: none;
}
.TreeMenu .section li a {
 text-decoration: none;
}

line-height (行高) 是設計的主要概念

視覺性的瀏覽器通常會預先賦予每行「大於一個字」的行高 (line-height) ,為了避免不同瀏覽器間產生的差異,以及後面設計 css 時有所依據,先將整個選單內 line-height 定義為「字高度」的倍數,例中為 1.1 倍,看起來行距應該會較原來更緊一點。由於 line-height 特性 (property) 有繼承性 (inheritance) ,所以只需要定義一次在 .TreeMenu.section 就可以;這裡也順便為分類標題 h1 加背景色修飾一下。

接續前面,增加 一點 css 定義 (紅字)
.TreeMenu .section {
 line-height: 1.1;
}
.TreeMenu .section h1 {
 font-size: 100%;
 font-weight: normal;
 background: rgb(85%,70%,90%);
}

我們只以倍數定義行高,也沒有指定字體的尺寸 (font-size),如此是為了使全部的設計,單純地以字高 (em) 的倍數來計算,不用去管字體到底幾個像素 (pixel) 大,或者一行有多少像素高。想指定 font-size 當然可以,不過行高最好還是以倍數的方式指定,設計時才不至於太難計算;這只是建議囉,全部都用像素為單位也沒問題,計算清楚,小腦袋瓜別爆掉就好。

產生樹狀的垂直線條

ul 左側加上線條,當做樹狀結構的垂直線,並且左邊空出一點距離,讓子選項內容 li 看起來向內縮排。這個距離應該是要對應分類標題 h1 來設計,我們指定了向內縮半個字 (0.5em),所以線看起來像是由標題第一個字中間向下延伸;標題最前面如果變成小圖示 (icons) ,那就以圖示寬度的一半去定義縮排距離也可以。這裡應該以 margin 來指定內縮距離,因為我們必須讓垂直線緊貼著 li 。線條寬度沒有使用 em 定義,是因為 1px 寬幾乎沒什麼影響,但是如果需要設計較粗的線,單位最好一致。

在前面已指定的 ul 增加 css 定義 (紅字)
.TreeMenu .section ul {
 list-style: none;
 margin-left: 0.5em;
 border-left: 1px dotted;
}

我們沒有特別指定線條 border 的顏色,將會與該區域字的顏色相同,如果想另外定義顏色,可以像這樣,

border-left: 1px dotted rgb(255,0,0);

線條要改成實線也可以, dotted → solid ,當然其它形式的線條也可有更多變化。

產生樹狀的水平連接線條

在子選項 li 下方加上線條,當做樹狀結構子選項的橫連接線。這裡也讓 li 的內容 a 向內縮排,不過,不同於前面,我們必須保持每個 li 下方的線與左側 ul 的線緊緊相接,所以在 li 指定 padding ,僅讓內容 a 向內縮,但 li 本身沒有縮排。

接續前面,增加 licss 定義
.TreeMenu .section li {
 padding-left: 0.5em;
 border-bottom: 1px dotted;
}

border 也沒有特別指定顏色,這樣可以對應前面 ulborder 顏色,如果想另外定義顏色,方法同前。

css position:relative;a 向下位移 (offset)

css position:relative; 主要的特點就是,元素可以由本身的 Box 位移,並且保留其它元素原來的排版。利用這個特點,只要讓 a 向下位移半行,而 li 會維持原來的位置及下方的橫線, a 的中間就會剛好壓在 li 的線上。前面已經指定 line-height:1.1; (1.1倍的字高),所以半行就是 0.55em ,太棒了,只有 a 向下移,所有 a 以外的東西都不會動。

在前面已指定的 a 增加 css 定義 (紅字)
.TreeMenu .section li a {
 text-decoration: none;
 position: relative;
 top: 0.55em;
}

由於水平線條只有 1px 厚度,對整個位置並無影響,可以不需考量;但是如果指定了較粗的線條,就需要顧慮到線條的厚度會佔掉空間,向下位移的距離應該多加半個線的厚度,這也是為什麼前面有提醒要注意單位一致的原因,如果線的單位是 px ,而行高em,那還真有點難算。

背景顏色蓋掉重疊的線

明顯地,現在面臨兩個問題:一、字的背面不應該有線。二、因為 a 的向下位移,造成與下一個分類重疊。第二個問題稍後再討論。第一個問題比較容易處理,我們為 a 指定背景色就可以蓋住 li 的橫線了,由於 a 本身為行內層級元素 (inline-level elements) ,所以背景色只會在有字的區域呈現。如果 a 不想有背景顏色,只要指定與 .TreeMenu 相同的背景色, a 看起來就像沒有背景色的樣子。

在前面已指定的 a 增加 css 定義 (紅字)
.TreeMenu .section li a {
 text-decoration: none;
 position: relative;
 top: 0.55em;
 background: rgb(80%,85%,100%);
}

如果想讓字之後的整條線都蓋掉,只要把 a 轉換成區塊層級 (block-level) 呈現即可。

繼續為 a 增加 css 定義 (紅字)
.TreeMenu .section li a {
 text-decoration: none;
 position: relative;
 top: 0.55em;
 background: rgb(80%,85%,100%);
 display: block;
}

此時會看到子選項內容 a 之間有 1px 的間隔,這是因為 a 的實際高度本來就比 li1px 高 (lia 多了線條的高度)。

增加距離避免重疊,就算完成了。

只要在分類間加一點距離,重疊的問題就解決了,為 .section 下方加上 padding 應是較恰當的方式。為了分類裡面的上下距離看起來一樣 ([上古神話]上方與[章回小說]下方) ,我們指定了 padding-bottom:1.1em; ,與行高相等的距離。

在前面已指定的 .section 增加 css 定義 (紅字)
.TreeMenu .section {
 line-height: 1.1;
 padding-bottom: 1.1em;
}

換成在 ul 下方增加距離也可以,不過,只能以 margin 來定義,因為 padding 會使左側的線跟著向下延長,就不會與最後一個 li 的橫線緊接了。

目前應該已經算是完成囉,只剩下修飾更好而已。

hasLayout 處理 ie bugs

ie 7 或 ie 6 ,在 ula 可能會發生高度失準或背景圖片移位的問題,解決這類的 bugs 常用的方式是 hasLayout property 。由於目前在 ie 8 都還正常,為了清楚區隔,我們最好運用 css hacks 技巧。

視問題的區域,自行斟酌增加 css 定義
*+html .TreeMenu .section ul {
 zoom:1;
} /*hack ie7*/
* html .TreeMenu .section ul {
 zoom:1;
} /*hack ie6*/
*+html .TreeMenu .section ul a {
 zoom:1;
} /*hack ie7*/
* html .TreeMenu .section ul a {
 zoom:1;
} /*hack ie6*/
如果 a 還是有高度或不正常間隙問題
*+html .TreeMenu .section ul a {
 zoom:1;
 vertical-align:top;
} /*hack ie7*/
* html .TreeMenu .section ul a {
 zoom:1;
 vertical-align:top;
} /*hack ie6*/

在子選項前加小圖示,並且做最後修飾

以小圖示作為 a 的背景,並且指定左邊 padding 距離,讓 a 的內容文字向內縮排,才不會與小圖示重疊。例中的小球圖示 (ic008.png) 寬度 10px ,我們指定它的位置在 a 的最左側並且上下居中,這樣會讓小球剛好緊接在 li 的線後,然後左側 padding 距離為 15px ,讓字不要與圖看起來太緊鄰。另外,把 a 的背景顏色指定成與 .TreeMenu 相同。

我們也在 a 及標題 h1 上下加了一點 padding 距離,讓字看起來不會與邊緣太緊鄰。不過, a 上下各增加了 0.25em ,表示整行的高度也增加了,所以,向下位移的 top 定義也需要對等增加 0.25em 的距離 (0.55 + 0.25 = 0.8em) ;而 .section 下方的 padding 距離也應該增加為 1.6em (1.1em + 0.25em + 0.25em) 。

範例完整的 css 設計
h1, ul {
 margin: 0;
 padding: 0;
}
.TreeMenu {
 width: 10em;
 background: rgb(92%,86%,100%);
 border: 1px solid rgb(60%,60%,80%);
}
.TreeMenu .section {
 line-height: 1.1;
 padding-bottom:1.6em;
}
.TreeMenu .section h1 {
 font-size: 100%;
 font-weight: normal;
 background: rgb(85%,70%,90%);
 padding-top: 0.25em;
 padding-bottom: 0.25em;
}
.TreeMenu .section ul {
 list-style: none;
 margin-left: 0.5em;
 border-left: 1px dotted;
}
*+html .TreeMenu .section ul {
 zoom:1;
 padding-bottom:1px;
 margin-bottom:-1px;
} /*hack ie 7*/
* html .TreeMenu .section ul {
 zoom:1;
 padding-bottom:1px;
 margin-bottom:-1px;
} /*hack ie 6*/
.TreeMenu .section li {
 padding-left: 0.5em;
 border-bottom: 1px dotted;
}
.TreeMenu .section li a {
 text-decoration: none;
 position: relative;
 top: 0.8em;
 background: rgb(92%,86%,100%) url(ic008.png) no-repeat left center;
 display: block;
 padding: 0.25em 4px 0.25em 15px;
 margin-bottom: -1px;
}
*+html .TreeMenu .section ul a {
 zoom:1;
 vertical-align:top;
} /*hack ie 7*/
* html .TreeMenu .section ul a {
 zoom:1;
 vertical-align:top;
} /*hack ie 6*/

前面提到由於 li 的下方線條使 a 之間會有 1px 間距,只需要在 ali 指定 margin-bottom:-1px; (綠字),就會使 li 之間有 1px 重疊, a 之間就沒有間距了,不過, ie 7, ie 6 最後一個 li 的線會看不見,修正方式也加在 hacks 裡了 (綠字) ,有興趣可以自行試試。

散佈、展示請參閱 Creative Commons 授權條文,禁止重混,引述請增加原文連結。
, , , ,

Posted by 不惑仔 at 痞客邦 PIXNET 留言(4) 引用(0) 人氣()

具有半透明值 (alpha 色版) 的 css 3 顏色單位

  • 說明: rgbahslacss level 3 (css 3) 起,新一代表示色彩的單位 (color units),最大的進展就是增加了「a」這個可以定義顏色不透明度 (opacity) 的 alpha 值;顏色的指定,當然包括了背景色 (background) 、邊線色 (border) 、前景色或文字色 (color) 等,這讓以往網頁設計需要繁瑣過程的半透明效果變得簡單輕鬆多了。本篇也附帶討論尚未支援的瀏覽器,可做到類似效果的幾種設計概念。
  • 適合:有 htmlcss 語法基礎概念者。
  • 難度:等級2
  • 更新:2011-06-12
  • 支援: firefox, safari, google chrome, opera 10, ie9 (至更新時) 。

有二種表示方式:

  • rgba(red 值, green 值, blue 值, alpha 值)
    red, green, blue
    可以是 0 ~ 255 的整數值,與一般 8 位元顏色的十進位值相同,惟這類表示法不接受十六進位值 (如 ff, 8c) ;也可以是 0% ~ 100% 的百分比值。所以例如, rgb(128,128,128) = rgb(50%,50%,50%) = #808080
    alpha 值 (alphavalue)
    0.0 ~ 1.0 允許小數一位的數值, 0 →完全透明, 1 →完全不透明, 0.7 → 70% 不透明。 w3c 沒有明確地表示是否允許小數一位以上的數值,不過 firefox 小數二位的數值也可以呈現,真是令人讚賞。
    語法實例:

    rgba(255, 0, 0, 0.6) → 不透明度 60% 紅色

    rgba(0%, 0%, 100%, 0.4) → 不透明度 40% 藍色

  • hsla(hue 值, saturation 值, lightness 值, alpha 值)
    hue 值 (色相值)
    以整數「角度」值表示,但是不加「°」角度符號。 0 或 360 →紅色, 60 →黃色, 120 →綠色, 240 →藍色,就好像彩虹色繞成一個圓。如同數學角度,負值或超過 360 是允許的,不過這樣用好像是有點自找麻煩。
    saturation 值 (飽和度值)
    0% ~ 100% 的百分比值, 0% →灰色調, 100% →最大飽和度。所以 0% 時,不論 hue 值是多少,都會以灰階單色呈現。
    lightness 值 (亮度值)
    0% ~ 100% 的百分比值, 0% →最暗 (暗黑), 100% →最亮 (亮白), 50% →正常亮度。 50% 以上漸漸增加白色, 50% 以下漸漸增加黑色。
    alpha 值 (alphavalue)
    0.0 ~ 1.0 允許小數一位的數值。
    語法實例:

    hsla(0, 100%, 50%, 0.3) → 不透明度 30% 紅色

    hsla(120, 100%, 20%, 0.4) → 不透明度 40% 暗綠色

    hsla(240, 0%, 50%, 0.6) → 不透明度 60% 中亮灰色

transparent 值 - 完全透明的關鍵字 (keyword) 值

alpha 值 = 1 時,完全不透明,實際上就等同沒有半透明 alpha 值的定義一樣,例如 rgba(255,0,0,1) = rgb(255,0,0) = #ff0000

alpha 值 = 0 時,完全透明,也就等同 css 2 的關鍵字 (keyword) 值 transparent ,例如 hsla(0,100%,50%,0) = transparent ,不管是什麼顏色,其實都是透明看不見。所以,這也就意味前景色 (color) 特性 (property) 也接受 transparent 值了,如 color:transparent;color:rgba(0,0,0,0); ,而這在 css level 2 是不允許的。

思考 - 背景半透明效果輕鬆設計: css color module level 3

顏色單位 (color units) 在 css 設計裡,主要運用在指定背景色 (background) 、邊線色 (border) 、前景色或文字色 (color) ,而多了可以直接定義顏色不透明度 (opacity) 的模式,設計背景半透明效果可說是輕而易舉。

半透明背景色 (background-color) 效果

直接看範例一 xhtml
<div id="st1" class="st">
 <div class="inner">
  <h1>也讓時間等一等</h1>
  <p>積極很好。人,肯積極,多半心裡有目標。…
   …以下略,實際內容見範例內…
  </p>
 </div>
</div>
共同基本的 css 定義
html, body, h1, h2, h3 {
 margin: 0px;
 padding: 0px;
}
h1 {
 font-size: 100%;
 font-weight: normal;
}
p{
 margin-top: 1em;
 margin-bottom: 1em;
}
h1,p{
 padding: 1em 1.25em;
}
.st {
 color: white; /*文字白色*/
 /*div.st加背景圖片並定義與圖片同尺寸*/
 background: url(圖片檔案位址) no-repeat center;
 height: 534px;
 width: 800px;
 overflow: auto; /*內容超過高度時產生捲軸*/
 margin: 1.2em auto 0;
 text-align: justify;
 border:1px solid rgb(60%,60%,60%);
 border-right:none;
}
css 定義半透明背景色 (background)
#st1 .inner {
 padding: 1em 4%;
}
/*標題 h1, 段落 p 加半透明背景色*/
#st1 h1 {
 background: rgba(30%,0%,0%,0.6);
}
#st1 p {
 background: rgba(0%,10%,20%,0.6);
}

實際呈現可參閱 [範例一] ←沒看到應該有的效果?

多層半透明色重疊效果 - 背景加上邊線色 (border-color)

共同的 css 定義與範例一相同。

範例二 xhtml
<div id="st2" class="st">
 <div class="inner">
  <h1>也讓時間等一等</h1>
  <p>積極很好。人,肯積極,多半心裡有目標。…
     …以下略,實際內容見範例內…
  </p>
 </div>
</div>
css 增加定義半透明邊線色 (border)
#st2 .inner {
 padding-bottom: 0.25em;
}
/*半透明背景色與例一雷同*/
#st2 h1 {
 background: rgba(40%,0%,0%,0.6);
 border-top: 2em solid;
 border-right: 260px solid;
 border-bottom: 0.5em solid;
 border-color: rgba(100%,100%,100%,0.2); /*20%白色*/
} /*三邊加上不同寬度的 border*/
#st2 p {
 background: rgba(0%,10%,20%,0.6);
 border-top: 12px solid rgba(100%,100%,100%,0.4);
 border-right: 12px solid rgba(55%,55%,65%,0.4);
 border-bottom: 12px solid rgba(30%,30%,40%,0.4);
 border-left: 12px solid rgba(80%,80%,90%,0.4);
} /*四邊加上40%不同顏色的 border*/

實際呈現可參閱 [範例二] ←沒看到應該有的效果?

需要了解的是, css 指定元素的背景色或背景圖片 (background) 會顯示在 border edge 區域以內,也就是說, border 色與 background 色是重疊的,當 border 顏色定義成半透明時,就會與其後方背景顏色產生混合。在範例二中, h1 加了 20% 半透明白色 border ,但實際呈現的是疊合了暗紅的半透明背景色,因而,在最後面的背景圖片被不同的半透明顏色覆蓋,而產生不同的層次感,並且因為寬度不同的 border 而使設計更具活潑感;而 p 則在四邊運用不同的顏色與背景色混合,讓背景圖片產生較立體的半透明視覺效果。

這樣的雙層半透明網頁設計效果,只在一個元素 (element) 上定義樣式 (styles) 就可輕易完成,沒有 css level 3 時根本困難重重。

文字半透明 (color) 效果

顏色單位 (color units) 當然可以用在 css color 特性 (property) , color 通常用來指定文字的顏色,所以也就可以讓文字變成半透明了。

共同的 css 定義與範例一相同。

範例三 xhtml
<div id="st3" class="st">
 <div class="inner">
  <h1>也讓時間等一等</h1>
  <p>積極很好。人,肯積極,多半心裡有目標。…
     …以下略,實際內容見範例內…
  </p>
 </div>
</div>
css 把標題首字變半透明色 (color)
#st3 h1::first-letter {
 /* h1 第一個字變粗大且半透明呈現*/
 font: 900 900% "標楷體",simhei,"細明體";
 vertical-align: -8%;
 color: rgba(85%,100%,100%,0.5); /*50%亮藍*/
}
/*半透明背景及邊線,與前例雷同*/
#st3 h1 {
 background: rgba(40%,0%,0%,0.4);
 border-bottom: 20px solid rgba(50%,20%,30%,0.4);
 border-left: 60px solid rgba(50%,20%,30%,0.4);
 padding: 1em 1.25em 0 0;
}
#st3 p {
 background: rgba(0%,10%,20%,0.6);
 border-top: 12px solid rgba(100%,100%,100%,0.4);
 border-right: 12px solid rgba(55%,55%,65%,0.4);
 border-bottom: 12px solid rgba(30%,30%,40%,0.4);
 border-left: 12px solid rgba(80%,80%,90%,0.4);
}

實際呈現可參閱 [範例三] ←沒看到應該有的效果?

當然,半透明文字的顏色也會與背景色疊合成另一個半透明色,再讓最後面的背景圖片穿透上來。

css 3 hsla 讓定義色彩及明暗度更直覺

色相飽和度亮度 (Hue, Saturation, Lightness - HSL) 指定顏色,也是 css 3 開始有的顏色單位,與色彩模型中的 HSB 有些類似,或許還有很多人不太習慣,不過許多情況它還挺方便用的。

共同的 css 定義與範例一相同。

範例四 xhtml
<div id="st4" class="st">
 <div class="inner">
  <h1>也讓時間等一等</h1>
  <p>積極很好。人,肯積極,多半心裡有目標。…
     …以下略,實際內容見範例內…
  </p>
 </div>
</div>
css 改變半透明色的飽和度及亮度
#st4 .inner {
 padding: 1em 4%;
}
#st4 h1 {
 background: hsla(120,60%,20%,0.6);
 border-top: 1.5em solid hsla(120,40%,12%,0.3);
 border-right: 80px solid hsla(120,40%,50%,0.3);
} /*背景及邊線都是綠色調*/
#st4 p {
 background: hsla(0,70%,30%,0.7);
 border-right: 80px solid hsla(0,70%,80%,0.2);
} /*背景及邊線都是紅色調*/

實際呈現可參閱 [範例四] ←沒看到應該有的效果?

很多時候需要以同一種色調 (Hue or Tone),呈現出不同明暗度的感覺,讓視覺上更有層次及立體感,範例中使用 hsla 定義顏色會是個好方法。眼尖的人應該已經看出,h1 或是 p 中指定的色相值 (Hue) 都是一樣的,也就是說用了同一種色調,而只是單純地在背景色 (background) 或是 border 定義不同的亮度值 (Lightness),就可以產生更有深度的視覺效果;而如果希望降低或增加顏色的鮮艷度,如範例中只需要指定較低或較高的飽和度值 (Saturation) 就可以了, h1 就只是稍微改變了飽和度。使用 hsl 定義顏色,確實可以讓我們省卻不斷地挑選 rgb 顏色的麻煩,因為只要決定一個顏色,剩下就由亮度飽和度來調整就可以了。

未支援 rgba, hsla 的瀏覽器也想半透明效果

未支援具有半透明 alpha色彩單位 (color units) 的瀏覽器,如果使用 rgba, hsla 指定色彩,只會略過該項定義,但不會因此而影響樣式表 (style sheets) 裡其它的定義。因此,我們可以另外替未支援的瀏覽器定義一組色彩,以範例一背景定義為例:

css 增加定義給未支援瀏覽器
#st1 h1 {
 background: rgb(30%,0%,0%); /*未支援瀏覽器指定不透明色*/
 background: rgba(30%,0%,0%,0.6);
}
#st1 p {
 background: rgb(0%,10%,20%); /*未支援瀏覽器指定不透明色*/
 background: rgba(0%,10%,20%,0.6);
}

未支援的瀏覽器只會執行第一項不透明顏色的定義,第二項會略過不產生任何影響;對於有支援半透明色彩的瀏覽器,雖然兩項定義都有效,但當然是以最後一項為執行的依據;所以,注意兩項順序顛倒就不會有半透明效果囉。這種作法,至少未支援的瀏覽器不至於結果差距太多。

png 格式半透明圖片作為背景

未支援的瀏覽器如果也想要有類似前述半透明效果的背景顏色,只要先製作一個很小的 png 格式的半透明圖片,例如 10×10 px 不透明度 (opacity) 70% 的黑色圖片 [圖例下載→ ] ,然後定義成背景圖片 (background-image)。以範例一的 p 為例:

css 改成定義背景為半透明 png 圖片
#st1 p {
 background: url(bg_bk70.png); /*未支援瀏覽器指定半透明背景圖片*/
 background: rgba(0,0,0,0.7); /*70%黑色*/
}

第一項除了 ie 6 沒辦法「正確」呈現外,其實較新型瀏覽器 (包括 ie 7) 都會有半透明黑色背景,唯一有點不方便的是,如果定義不同顏色的半透明背景,每次都必須製作不同的半透明 png 圖片。實際上,只需要第一項就可以在各家瀏覽器達到半透明背景的效果了。加上第二項將會更好,因為也可以讓有支援 alpha 值的瀏覽器直接運用更便利的 css 半透明顏色定義方式,對未來更有幫助,第二項的定義會將背景圖片 (background-image) 變成預設值 none (無)。

css 3 的 opacity 不透明度特性,像這樣 opacity:0.7; ,如果想要運用在此處,其實不是很恰當,因為 opacity 的定義會使整個元素 (element) 都變成半透明,包括內容裡的文字,如此可能影響閱讀,目前卻有很多人使用這種方法,有點匪夷所思,有興趣可以參閱久久前的某一個討論,裡面也有提到麻煩的 opacity 處理方式及以下將會提到的 ie filter 中的 alpha opacity

filter 中的 alpha(opacity) 不透明度指定給 ie 6

ie 6 就需要用到 ie 專用 (ie only) 的 css filter 語法中 alpha 的不透明度 opacity ,不過這個方法也是整個元素 (element) 都會半透明呈現,而且元素必須指定 hasLayout property ;也由於是特定給 ie 6 的設計,所以最好運用 css hacks 技巧:

css 接著前例,定義半透明給 ie 6
* html #st1 p {
 background: rgb(0,0,0); /*背景黑色,也讓先前指定的背景圖片回復沒有*/
 zoom: 1; /*hasLayout*/
 filter: progid:DXImageTransform.Microsoft.Alpha(opacity=70); /*70%不透明度*/
}

這是 ie 專用 (ie only) 語法, 所以其實 ie 7 也可以用。麻煩的問題是裡面文字內容也半透明了,雖然有一奇特方法, css 定義其內層元素 (element) 為 position: relative; 就可讓裡面內容回復成不透明。但是像範例中的 p ,內層沒有可定義的元素 (element) 也就沒輒了,其實部落格設計也會遇到沒辦法自己增加元素的問題。另外,像範例中有捲軸產生捲動內容,但是在 ie 如果內層定義成 position: relative; ,該元素 (element) 就像是「固定」在原位,不會隨捲軸捲動了。所以,指定 ie 這個特性時,只能多注意一點囉。

ie 6 也使用半透明 png 圖片作背景

另一種 ie 專用 (ie only) 的 css filter 語法中 AlphaImageLoader ,可以讓 ie 6 「較正確」呈現半透明 png 圖片,不過圖片會「插在」背景 (background) 及內容 (content) 之間,所以如果原先有指定背景,會變成像似兩個重疊的背景:

css 改成「插入」半透明 png 圖片當背景
* html #st1 p {
 background: none; /*先前指定的背景圖片改回沒有*/
 zoom: 1; /*hasLayout*/
 filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="bg_bk70.png",sizingMethod="scale");
 /*插入圖片並縮放至與元素同尺寸*/
}

圖片會由所在元素的 border box 左上角開始插入。語法中 filter 內的 src="bg_bk70.png" (綠字) ,明顯地,雙引號內就是指出圖片檔的位址。而 sizingMethod="scale" 可以有三種選擇:

  • sizingMethod="image" :不論所在元素的 Box 大小,圖片一律以圖片本身尺寸完整顯示。如果 Box 尺寸大於圖片, Box 超過圖片的區域會被「裁掉」不顯示;如果 Box 尺寸小於圖片, Box 會保持尺寸,不會增大,而圖片則會「突出」 Box 範圍。這個定義是預設值,所以沒有 sizingMethod 這段時,仍會套用此定義。
  • sizingMethod="scale" :圖片會自動依據元素的 border box 尺寸縮放,所以圖片呈現可能會寬高不等比例變形。
  • sizingMethod="crop" :圖片會保持圖片本身尺寸,但是圖片超出 Box 範圍的部分,不會顯示,類似 css 定義背景圖片的呈現方式。

看起來似乎達到想要的半透明背景效果,也不會讓內容文字也變半透明。這樣的作法只是為了讓原本不能正確呈現的 ie 也能有我們想要的效果,嚴格說起來應算是 ie 的旁門左道,並非 w3c 標準規範。怪的是 ie 仍有不可預期的問題,使用時要先有心理準備就是了,像是內容如果包括需要滑鼠感應的元素 (如按鈕、輸入項之類) ,會變成無法執行,又得以 css 指定這類元素 position:relative; 才會作用。

參考資源
散佈、展示請參閱 Creative Commons 授權條文,禁止重混,引述請增加原文連結。
, , , , , , , , ,

Posted by 不惑仔 at 痞客邦 PIXNET 留言(2) 引用(0) 人氣()

Box Model (框框模型) 是什麼?

  • 說明:css box model 描述出文件中,元素 (elements) 所形成的最基本矩形區域 (boxes) 及專有名詞;此為呈現視覺性 (visual) 版面的重要基礎。
  • 適合:有 htmlcss 語法基礎概念者。
  • 難度:等級2
  • 更新:2008-05-27

只要有東西在版面上描繪 (可以把版面想成一張空白的紙) ,就一定會佔有版面上某些空間,縱使是一個字,也至少就佔了一個字的矩形區域,而這樣的區域被定義為「」 (boxes) 。

文件內某「一個」元素的「框」 (box) 可由四個層疊的 (nested) 區域所組成:該元素所包含的「內容」 (不論是單純的文字,或是其它元素) 形成最內層的區域,就是 content area (內容區) ,依序向外一層一層圍繞為 padding area, border area, margin area (補距區 - 邊線區 - 邊距區) 。

區與區之間可分別由 css 指定 padding, border, margin 特性 (property) 來改變相互的距離,而每種特性定義都有上下左右四向,可由版面設計者指定各不相同的距離 (說成是厚度、寬度也可以) ,當然也可以沒有距離,運用這樣的概念進而改變版面上整組 box 的尺寸及呈現。

由內向外四個區都各自有「四邊」形成緊鄰的框,標準的名稱依序為:

content edge or inner edge (內緣-圖中綠線)
具有寬 (width) 及高 (height) 的 content area 四邊,與 padding area 交界處;四邊圍成的區域稱為 content box
padding edge (補距外緣-圖中紅線)
padding area 四邊,與 border area 交界處;四邊圍成的區域稱為 padding box
border edge (邊線外緣-圖中藍線)
border area 四邊,與 margin area 交界處;四邊圍成的區域稱為 border box
margin edge or outer edge (框外緣-圖中深灰線)
margin area 四邊,也是整個框 (box) 的最外緣;四邊圍成的區域稱為 margin box

margin box 來說,永遠呈現透明 (因此能看到其背後的內容);在元素上定義背景 (background) 呈現在 border box, padding box, 及 content box 的區域內。而 content box 的「內容」當然是呈現在背景的前面。

思考 - Box Modelcss 版面視覺設計

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. 看到竹子想到王陽明。看到桃花想到桃花源記。看到蓮花想到周敦頤。
  2. <em>看到荷花想到何仙姑。看到玫瑰想到愛神。看到菊花想到陶淵明。</em>
  3. 看到百合想到香水。~節錄自 monica 「聯想的遊戲」

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 boxinline 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) 所決定,而高度則由 css line-heightvertical-align 的定義來決定。

多重的 block boxes 像洋葱一層包著一層

實際上,每一個區塊層級元素 (block-level elements) ,必然會由另一個區塊層級元素包圍,根元素除外 (root element, html 文件指的就是 html 元素) ,所以,許多個 block boxes 一層一層包圍起來時就好似洋葱的構造。

例如 xhtml
<blockquote>
<h1>聯想的遊戲</h1>
<p>看到三國演義想到七俠五義。看到紅樓夢想到牡丹亭。看到山海經想到鏡花緣。看到芭蕉扇想到鐵扇公主。看到豬八戒想到沙悟淨。看到孫悟空想到如來佛。看到史記想到司馬遷。看到船想到孔明借箭。看到滿山秋色想到最愛的詩人王維。看到赤子純真一般的畫想到豐子愷。看到李叔同想到大護法夏丏尊。~節錄自 monica 「聯想的遊戲」</p>
</blockquote>

很明顯地, h1, p, blockquote 都是區塊層級元素h1p 的「內容」 (content) 僅包含著行內層級的元素,就像前面一樣,兩者各自擁有矩形的 block box ,也都可以各自指定 padding, border, margin (圖中紅線) 。而 blockquote 從外包圍著 h1ph1p 成了 blockquote 的「內容」 (content) ; blockquote 形成另一個 block box (圖中綠線) ,當然也可以指定 box 的各項數值。

參考資源
散佈、展示請參閱 Creative Commons 授權條文,禁止重混,引述請增加原文連結。
, , , , , , ,

Posted by 不惑仔 at 痞客邦 PIXNET 留言(2) 引用(0) 人氣()

為物件指定 hasLayout property

  • 說明: ie 專有用法 (ie only)。部分 ie 專有的特性 (property) ,如 filters and transitions ,有作用的必要條件就是指定 hasLayout 性質。 hasLayout 性質本來是微軟為了補救 ie 內部不完善所自創的,並非 w3c 標準,所以有時用起來覺得相當無厘頭。但神奇地, ie7 以前舊版衍生的網頁不正常呈現問題 (ie bugs),大多數竟可由指定 hasLayout 來解決。
  • 適合:有 htmlcss 語法撰寫基礎者。
  • 難度:等級4
  • 更新:2008-02-18
  • 適用:ie7 ~ ie5.5

hasLayout "property" 和 css property 雖然英文名稱一樣,但實際上不太相同。 hasLayout 本身並非 css 特性的一種,所以沒辦法直接定義物件的 css 特性 hasLayout 的值 (value),而是間接以其它的 css 特性指定在物件上,使該物件符合 hasLayout ,所以我比較傾向稱它是 hasLayout 「性質」。

符合以下任一種 css 特性及值的定義方式,物件即是 hasLayout (有編置) :
ie 7 增加了幾個新的指定方式:

認識 hasLayoutcss 規則

上述規則有的看起來有點含糊,有的好像又很陌生,那要怎麼正確定義物件 hasLayout 呢?

heightwidth 特性只需要指定一個「具體值」 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-xoverflow-ycss3 的規則,撰文時僅 iefirefox 支援。

writing-mode 特性也是 css3 的規則,比較少會用這個特性指定 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-heightmin-width 的預設值是 0,所以縱使再定義為 min-height:0; (具體值),也無法卸除 hasLayout 。但是 ie 卻接受 min-height:auto;min-width:auto; 來卸除 hasLayout ,特別須注意的是 auto 值並非 w3c 標準,所以沒有把它列在上述卸除規則。

思考 - hasLayoutcss hacks 拯救 ie bugs

本篇一開始就提到,為物件指定 hasLayout 性質就可以修復很多 ie 令人噴飯的 css bugs (hasLayout 大部分可修復背景不正常及 position 特性位移等問題) ,有幾種目前公認穩定又好的方式,但是有時必須搭配 CSS hacks ,才可以在不同瀏覽器正常地呈現,而如果需要通過 W3C validation ,用到非 w3c 標準語法時就需要運用 Conditional Comments 把語法隔離起來。

xhtml
<div id="main" class="hasLayout">
 <h2>早梅 張謂</h2>
 <p>一樹寒梅白玉條,迥臨村路傍溪橋。不知近水花先發,疑是經冬雪未銷。</p>
</div>
css
.hasLayout {min-height:0;} /* ie 7 hasLayout 生效 */
* html .hasLayout {height:0;} /* hack ie 6 hasLayout 生效 */

上面 css 語法例子符合 w3c 標準,是很穩定的好方法,只是語法感覺有點冗長。 min-height:0; 本來就是預設值,加了此項其實是多餘的,所以對任何瀏覽器不會有影響,也就不需要用到 hacks ;而 min-height:0;ie 7 可驅使 hasLayout 生效,難纏的 ie bugs 也就隨之解決了。但是, height:0; 在不同瀏覽器上呈現有很大差異,所以就必須採取 css hacks 的技巧。 ie 7 與 ie 6 的 bugs 未必會在同一個物件同樣發生,所以,上述語法並沒有要求一定兩項條件都要同時存在,比較常出現 bugs 會是在 ie 6 ,可以視狀況加入其中一項或兩項囉。另外需要提醒的是,依據規則此方法在「文字層級」物件沒有作用。

承上 xhtml 例,再看另一種 css hasLayout 作法。

css
#main {zoom:1;}

zoom 指定 hasLayout 算是精簡的好方法, ie 5.5 以後版本就有支援。 zoom:1; 維持物件原來大小不作任何改變,但可驅使 hasLayout 有效,而且不論區塊層級或行內元素都有作用;非 ie 瀏覽器尚未支援 zoom 特性,所以完全不受影響,也就不需要用到 hacks 。唯一的小問題只是 zoom 並未納入 w3c 標準。

再看不同的例子。

xhtml
<div id="nav">
<ul>
 <li><a href="#">王維-陽關曲</a></li>
 <li><a href="#">張謂-早梅</a></li>
 <li><a href="#">杜甫-客至</a></li>
</ul>
</div>
css
#nav li a {display:inline-block;} /* hasLayout 生效 */
#nav li a {display:block;}

此例在版面設計常會遇到,因設計需要必須將行內元素 a 轉換成區塊層級呈現 (改變物件的 display 特性) ,很明顯地,加了 display:inline-block; 這項其實是多餘的,因為元素 a 還是會依照其後定義的 dislpay:block; 呈現,所以任何瀏覽器的呈現也不會有差異;而 display:inline-block; 驅使 hasLayout 生效, ie bugs 也就隨之解決了。這個方式 ie 5.5 以後版本就有支援,完全符合 w3c 標準,精簡且不需要用到 css hacks ,適當地運用也是一個很好的技巧。

最後叮嚀,不要想偷懶企圖使用像 * {zoom:1;} 的方式一次指定所有物件,發生問題的時候恐怕沒人救得了你;指定 hasLayout 性質的方式算是不少了,學習在不同情況下,針對有問題的物件變換最恰當的語法來修復 ie bugs ,才是網頁設計者應有的態度。

參考資源
散佈、展示請參閱 Creative Commons 授權條文,禁止重混,引述請增加原文連結。
, , , , ,

Posted by 不惑仔 at 痞客邦 PIXNET 留言(1) 引用(0) 人氣()

Pseudo-elements ::before, ::after 範例

  • 說明:以特別的 CSS selectors (指標) 語法,指向 html 元素 (elements, 如 p, h1, div 等) 裡沒有實際元素名稱或原來不存在的內容,並且使其被視為一個新的元素,稱之為擬元素 (pseudo-elements) 。在原有 selectors 加上 ::before::after擬元素表示法,如 #main::before ,將會指向該元素的內容最前或最後,並可在該處加入新的字元,而且新加的字元被視為新的元素,也可以賦予各種設計風格 (styles)。
  • 適合:有 htmlcss 語法基礎概念者。
  • 難度:等級2
  • 更新:2009-06-11
  • 支援: firefox, opera, safari, google chrome, ie8 。(至更新時)
xhtml
<strong class="amount">700</strong>
css
.amount::before {content:"$ ";}
.amount::after {content:" 萬元";}
原來只有 700 ,但加了 css 以後呈現會是
$ 700 萬元

思考 - ::before, ::after Pseudo-element Selectors 使用原則

::CSS3 擬元素的標準表示法,主要是為了與 :擬類別 (Pseudo-classes) 作區分,有別於原來 css2 兩者同樣使用 : 表示,目前較先進瀏覽器 (firefox, opera, safari, …) 均有支援。

::before 搭配 contnet 特性 (property) 雙引號內所指示的字元,可在 selectors 指定的元素最前加入該字串 (包括空格,如上例的 "$ "), css 因而將此字串視為一個元素,所以可以賦予該字串各種設計風格; ::after 一樣用法,不同的只是加在最後。可以把上例想像成加了兩個實際的元素,如:

xhtml
<strong class="amount"><span>$ </span>700<span> 萬元</span></strong>

另加一下 css 看看變化,

css
.amount {color:red;}

這樣會是整個 $ 700 萬元 都變成紅字,因為 ::before, ::after 所加入的字串擬元素,仍屬於 .amount 元素的內容,所以依據繼承性擬元素 $, 萬元 也都是紅字了。稍微改變一下 css 看看:

css
.amount::before {content:"$ "; color:blue;}
.amount::after {content:" 萬元"; color:blue;}

這樣只有擬元素變成藍字,結果會像 $ 700 萬元,先前定義的紅字還是存在。 ::before, ::after 沒有限制兩個同時都要指定,也可以只指定一個前或一個後。

需要注意的是,以 ::before, ::after 配合 content 所產生的擬元素字串,會視為行內層級元素 (inline emements),也就是文字層級 (text-level) 。

至於 content 特性還有更有用的字串加入方式,由於撰文時大多瀏覽器支援不甚完全,以後再作討論,有興趣可先參考 W3C The content Property 說明。

參考資源
散佈、展示請參閱 Creative Commons 授權條文,禁止重混,引述請增加原文連結。
, , , , ,

Posted by 不惑仔 at 痞客邦 PIXNET 留言(1) 引用(0) 人氣()

Conditional Comments [if IE] : ie 專用 (ie only) 條件式 html 註解的語法

  • 說明: ie 專用語法 (ie only) 。運用 html 註解形式 <!-- -->,在註解間加入特殊的語法,可使 ie 將該註解內容反視為有效語法,甚至可自動區分不同版本 ie 來解讀。而非 ie 瀏覽器 (firefox, opera, safari, google chrome …) 一律視其為註解,所以同時也有了區隔不同瀏覽器的功能,有點像是 html hacksie5 就已開始支援。
  • 適合:有設計網頁及撰寫 html 語法經驗者。
  • 難度:等級3
  • 更新:2008-11-23
<!--[if IE]>內容<![endif]-->
內容只有 ie 會顯現。
<!--[if IE 6]>內容<![endif]-->
內容只有 ie6 會顯現。
<!--[if lt IE 7]>內容<![endif]-->
內容只在比 ie7 更舊的版本會顯現。 [參考說明]
<!--[if gte IE 8]>內容<![endif]-->
內容只有 ie8 及其較新版本會顯現。 [參考說明]
<!--[if !IE]>-->內容<!--<![endif]-->
內容除 ie 以外都會顯現。 [參考說明]
<!--[if !(IE 6)]>內容<![endif]-->
內容除 ie6 以外的 ie 都會顯現。 [參考說明]
<!--[if (gte IE 6)&(lt IE 8)]>內容<![endif]-->
內容只從 ie6 以後及 ie8 之前版本會顯現。 [參考說明]
<!--[if (IE 7)|(IE 6)]>內容<![endif]-->
內容只有 ie7 及 ie6 會顯現。 [參考說明]
<!--[if gte IE 7]><!-->內容<!--<![endif]-->
內容在 ie7 及其較新版本,以及 ie 以外都會顯現。 [參考說明]

藍色部分 <!----> 為標準 html 註解的起始或結尾;除此之外,紅色部分即為 ie 能辨識的特殊語法。所以,只有 ie 會依據紅字所表示的條件來判斷呈現與否,而其它瀏覽器依標準一律當成是註解。

語法中空格不能任意省去,尤其注意 IE 之後,版本編號前的空格。除 IE 必須大寫,其餘英文字母都是小寫。註解的結尾語法都是 <![endif]-->

思考 - 條件式註解的應用

運用不同條件可在不同版本呈現的原理,我們可以做出提供使用者,類似瀏覽器版本線上偵測的範例 :

xhtml 語法
<!--[if IE]>
 <p>您正在使用的瀏覽器為 ie 。</p>
<![endif]-->
<!--[if IE 6]>
 <p>您正在使用的瀏覽器為 ie6 。</p>
<![endif]-->
<!--[if IE 7]>
 <p>您正在使用的瀏覽器為 ie7 。</p>
<![endif]-->
<!--[if lt IE 7]>
 <p>您正在使用的瀏覽器為比 ie7 較舊的版本。</p>
<![endif]-->
<!--[if gte IE 8]>
 <p>您正在使用的瀏覽器為 ie8 或比 ie8 更新的版本。</p>
<![endif]-->
<!--[if !IE]>-->
 <p>您正在使用的瀏覽器不是 ie 。</p>
<!--<![endif]-->
<!--[if !(IE 6)]>
 <p>您正在使用的瀏覽器為 ie ,但不是 ie6 。</p>
<![endif]-->
<!--[if (gte IE 5.5)&(lt IE 7)]>
 <p>您正在使用的瀏覽器為 ie5.5 或 ie6 。</p>
<![endif]-->
<!--[if (IE 7)|(IE 6)]>
 <p>您正在使用的瀏覽器為 ie7 或 ie6 。</p>
<![endif]-->
<!--[if gte IE 7]><!-->
 <p>您正在使用的瀏覽器為 ie7 或比 ie7 更新的版本,或不是使用 ie 。</p>
<!--<![endif]-->
上面的語法實際呈現如下,請使用不同瀏覽器測試。

您正在使用的瀏覽器不是 ie

您正在使用的瀏覽器為 ie7 或比 ie7 更新的版本,或不是使用 ie

ie Conditional Comments 幾乎可以包圍任何 html 內容,包括整個元素 (elements) 或單獨的標籤 (tags) ;這屬於 html 語法,只適用在 html 語法內,出現在其它如 css 語法裡或 javascript 程式裡是會錯誤的。有時候我們因某些狀況不得不使用 ie 自創專有的語法,又必須符合 w3c 標準語法規範,或是需要避開 ie 的錯誤,又為了避免與其它瀏覽器發生衝突,條件式註解就成了有用的技巧。

條件註解當作 css hacks

僅供 ie6 及其較舊版套用的樣式清單檔
<!--[if lte IE 6]>
 <link href="style_ie6.css" rel="stylesheet" type="text/css" />
<![endif]-->

條件註解javascript 在指定的瀏覽器執行

僅供 ie 執行的 javascript 程式檔
<!--[if IE]>
 <script src="script_ie.js" type="text/javascript"></script>
<![endif]-->

註解裡的運算子 (operators) : lt, lte, gt, gte

語法中除了 if, IE 比較容易體會含意外,其餘看似難懂的符號,列出來解釋一下就容易了。

  • lt : lower than ,比某一版本更舊的版本,如 [if lt IE 7]
  • lte : lower than or equal to ,某一版本及其更舊的版本,如 [if lte IE 6]
  • gt : greater than ,比某一版本更新的版本,如 [if gt IE 6]
  • gte : greater than or equal to ,某一版本及其更新的版本,如 [if gte IE 8]
  • ! : 「非」、「排除」、「反向」的意思,可加在版本、運算子、或子運算式 ( ) 前,如 [if !IE] ,指定 ie 以外有效。
  • ( ) : 可將基本的條件加入子運算式 (subexpression) 處理更複雜的條件,如 [if !(IE 6)] ,指定除 ie6 以外的 ie 有效。。
  • & : 符合由 & 連接的全部子運算式的條件,如 [if (gt IE 5.0)&(lt IE 7)] ,指定 ie5 之後, ie7 之前有效。
  • | : 符合由 | 連接的任一個子運算式的條件,如 [if (IE 5.5)|(IE 6)] ,指定 ie5.5 或是 ie6 有效。

所以, [if lte IE 6][if lt IE 7] 同樣指的都是 ie6 及其更舊版本,而 [if gt IE 6][if gte IE 7] 同指 ie7 及其較新版本。

實際上,常用的運算子應該只有前面五項,所以沒有特別需求的話,不需要浪費太多時間鑽研每一項的用法囉!

稍作變化才能正確用在 ie 以外瀏覽器

在前面語法中,關於 ie 以外瀏覽器顯現的作法,加了一點東西,這是將 ie 專用註解語法 (紅色部分) ,再加註解標記,變成前後兩部分 html 標準註解 (注意藍色部分) ,才可以讓內容不再是註解;而 ie 仍舊以原來特殊語法判斷,不會理會另外加的符號,如此既能區分瀏覽器,又不會違反 w3c 標準語法。另外需要注意的是,如果同時也要讓某些 ie 顯現 (如最後一項) ,就必須動點手腳,如 [if gte IE 7]><!--> 中多加了 <! (綠色) ,只是為了避免 ie 會把接下去的 --> 顯示出來。

類似運用註解的方法在許多應用軟體也常見到,例如 Adobe Dreamweaver 裡的範本 (templates) 標籤、圖庫 (library) 標籤,也都是運用註解標註的方式讓特定的應用軟體來辨識,所以瀏覽器只會把它們當成註解而已,多留意看看就會發現其中的奧妙了。

參考資源
散佈、展示請參閱 Creative Commons 授權條文,禁止重混,引述請增加原文連結。
, , , , , , , , ,

Posted by 不惑仔 at 痞客邦 PIXNET 留言(1) 引用(1) 人氣()

css selectors 的語法及對應有效的瀏覽器 (css hacks)

  • 說明:利用不同瀏覽器對 CSS selectors (指標) 支援程度的不同,使得 css 設計效果,可針對不同瀏覽器分別製作,一般稱這類處理方式為 css hacks (css 區隔設計) 或 css filters
  • 適合:有設計網頁及撰寫 css 語法經驗者。
  • 難度:等級5
  • 更新:2011-04-04
ie7
*+html selector {css 設計內容}
ie7, ie6 ~ ie5.5
*+html selector {css 設計內容}
* html selector {css 設計內容}
selector, {css 設計內容} (此詭異方法非 w3c 標準,卻很方便)
ie6 ~ ie5.5
* html selector {css 設計內容}
firefox, opera, safari, google chrome …等新式瀏覽器及 ie7 (含)以後版本
html>body selector {css 設計內容}
或可簡化為 *>selector {css 設計內容} 
firefox, opera, safari, google chrome …等新式瀏覽器及 ie8 (含)以後版本
html>/**/body selector {css 設計內容}
firefox, opera, safari, google chrome, ie9 …等新式瀏覽器 (ie 以外) [參考說明]
html:root selector {css 設計內容}
ie8 [參考說明]
html>/**/body selector {css 設計內容}
html:root selector {css 設計內容} (以此項覆蓋前項的定義,保留前項給 ie8)
firefox (Gecko series), google chrome2, safari4 [參考說明]
selector:not([att*=""]) {css 設計內容}
safari, google chrome [參考說明]
selector:not(:root:link) {css 設計內容}
Opera
html:root selector {css 設計內容}
html:not(:link) selector {css 設計內容} (此項 Opera 無效)
Opera 9.5 (不含) 以前版本
html:first-child selector {css 設計內容}

註:新式瀏覽器如未加註版本,以近期較新版為準。

思考 - css hackscss selectors

selector {css 設計內容} 這一部分和平常的 css 寫法完全一樣,而多加了一些有點陌生的符號 (紅色部分) ,變成「很另類」的 selectors ,就可以使設計內容在不同瀏覽器有效。可別小看這種 selectors 的寫法,它仍舊符合 w3c 規範的語法。注意語法中有空格的地方不能隨意省去,因為意義會是不同的。

css hack ie6

* html selector {css 設計內容}

正常 html 文件的最外層元素就是 html 這個「唯一的」元素 (elements) ,而 * html 的「*」指向 html 更外層的元素,當然是不存在的;但是 ie 6 會誤認為有效,所以就可以利用此法設計只會在 ie 6 呈現的 css

css hack ie7

*+html selector {css 設計內容}

正常 html 文件的最外層元素就是 html 這個「唯一的」元素,而 *+html 的「*+」指向 html 同層 (adjacent sibling combinator) 的元素,當然不存在;但是 ie 7 會誤認為有效,所以就可以利用此法設計只會在 ie 7 呈現的 css

css hack ie8

html>/**/body selector {css 設計內容}
html:root selector {css 設計內容}

第一項在 ie8 及其它新式瀏覽器有效,而第二項只在非 ie 的新式瀏覽器有效,所以只要在第二項定義 css 覆蓋掉第一項,就等同單獨為 ie8 指定。如,

html>/**/body #main {color:blue;}
html:root #main {color:inherit;}

ie8 字的顏色會以 blue 呈現,而其它瀏覽器則保留原來樣式。

又如,

#main {background:yellow;}
html>/**/body #main {background:orange;}
html:root #main {background:yellow;}

ie8 背景色會以 orange 呈現,而其它瀏覽器則為 yellow

css hack firefox, opera, safari, google chrome …等新式瀏覽器

html>body selector {css 設計內容}

html>body 在語法上可以說是多餘的,因為 html 文件的最外兩層就是 htmlbody 這兩個唯一的元素,所以加不加這段,結果其實是一樣的;但是由於 ie 6 沒有支援有 「>」 符號 (child combinators) ,就可以利用此方式為 ie 6 以外的瀏覽器定義 css 設計。運用同樣的道理,大部分時候,可以將它簡化寫成 *>selector ,只是使用時要注意 selector 所指向的元素的階層關係,如果覺得搞不清楚,最好還是使用前者語法比較保險。

html>/**/body selector {css 設計內容}

html>/**/bodyhtml>body 其實是同樣意義,因為符號 /**/ 只是 css 定義裡的註解語法,瀏覽器應當忽略它不會影響原有的內容,但是 ie 7 卻會因為這個位置加了註解符號而變成無效。

css hack non-ie (非 ie)

html:root selector {css 設計內容}

通常運用 ie 未支援的 css selectors 語法,就可以為 ie 以外的瀏覽器 (non-ie browsers) 設計。

:root pseudo-classie 8 仍未支援 (ie 9 已支援) ,所以語法中 html:root 就可以簡單地將 ie 排除在外了。 ie 還有其它尚未支援的 selectors 也都可以派上用場,像是運用 :not() negation pseudo-class ,可以寫成如 html:not(:first-child) selector 或是 html:not(:empty) selector ,也都可以將 ie 排除。 ie 的支援程度總會較其它新式瀏覽器慢半拍,依循這個邏輯,就可以很輕易與 ie 區隔設計了。

css hack firefox (Gecko 核心的瀏覽器), google chrome2, safari4

selector:not([att*=""]) {css 設計內容}

這個…真有點複雜,先對照例子看看。

xhtml
<div class="content">
 <p>花徑不曾緣客掃,蓬門今始為君開。</p>
</div>
css
.content:not([class*=""]) {background: lime;}

需要注意的是語法中 [att*=""]att 必須對應元素已有定義的屬性 (attributes) ,如例中 div 元素的 class 屬性。如果對應的是元素尚未定義的屬性,把上例改成 .content:not([id*=""]) ,雖然語法上沒有錯誤,但是這會使其它新式瀏覽器也同樣有效,就不是僅僅 hack firefox ,而是 hack ie 以外的瀏覽器了 (ie8 尚未支援 :not() negation pseudo-class) 。還有要小心 :not 前面沒有空格。

css hack safari, css hack google chrome

selector:not(:root:link) {css 設計內容}
對照前一個 xhtml 例子,css 可以是
.content:not(:root:link) {background: orange;}

:not() negation pseudo-class 括號內的引數 (argument) ,依據 w3c 的說明,應為 a simple selector (簡單指標) ,但是未明確指出 a sequence of simple selectors (簡單指標串) 是否可以,像是 #main.box, *.content, *[class^=part], 或 a:link 之類。

目前僅有 safarigoogle chrome 支援 :not() 括號內引數可以是 a sequence of simple selectors ,所以就利用這個特點來作區隔。依照這個邏輯,寫法就可以很多彈性變化了,如 selector:not(*:root), selector:not(*.xyz), 或 selctor:not(*[title=xxx]) ,都一樣有效。甚至改成 html:not(*:empty) selector{css 設計內容} 也是可以的,既豐富又有趣。另外,需要小心如果引數裡有元素名稱的 type selector (型態指標), opera 會造成之後 css 設計無效。

css hacks 處理最小高度 (min-height) 及高度 (height) (hack ie bugs)

提到有關 css 指定「高度」的問題,始作俑者就是 ie 6 。 ie 6 並未支援 min-height 特性,這也無可厚非,不過最糟糕的是把 height 特性拿來代替 min-height 特性,這也就造成廣大仰賴 ie 的網頁設計者,遭遇後來新版 ie 及其它新式瀏覽器時,發生版面內區塊的內容超出、重疊、或擠成一堆的狀況。實際上 ie 6 的呈現方式是錯誤的,以前看不出來就算了,現在就不能繼續將錯就錯下去了,幸好,我們可以運用 css hackie 6 的定義區隔起來。

例如 xhtml
<div id="main">
 <p>勸君更盡一杯酒,西出陽關無故人。</p>
</div>
css
#main {min-height: 200px;}

這是常會遇到的狀況,網頁設計者可能因設計需要而必須指定元素 div 有一個高度 (如 200px),但是如果「內容」(content) 增加時,可能會超過 200px ,也希望 div 的高度會隨著「內容」增高。正常狀態下,我們只需要單純地以 #main 這個 css selector 指定 min-height 就可以了,如例中 #main {min-height: 200px;} 。不過, ie 6 沒有支援 min-height 特性,所以對該項定義就不會有作用。如果要讓 ie 6 也能達到同樣效果,就必須用到 height 特性,但是直接增加 height 將會使所有瀏覽器同時有效,如:

這樣的 css 不會是想要的結果
#main {
 min-height: 200px;
 height: 200px;
}

指定了 height 也就是 div 的高度被「固定」了,那麼 min-height 就沒意義了,就算內容增加也不會改變「固定的」高度 (如 200px) ,過多的內容只會以「越出」 div 的高度範圍顯示,就可能與其它的區塊重疊,看起來就像擠成一堆。因此, height 必須另外區隔給 ie 6 才可以達到我們想要的結果。

正確的 css
#main {min-height: 200px;}
* html #main {height: 200px;} /*僅 ie 6 ~ ie 5.5 有效*/ 

ie 6 對第一項定義的 min-height 沒有作用,但是會讓第二項有效;而新式瀏覽器只會讓第一項的定義有效,但第二項不會作用。如此就是運用 css hack 的技巧,讓 ie 6 能以 height 達成「最小高度」的目的,但是又不影響其它瀏覽器。

本篇所提 css hacks 技巧,主要是設計者可以經由 css selectors 的變化,做到在不同瀏覽器可有不相同的 css 設計,提供設計者很大的發揮空間,而且與平常定義 css 特性完全相同;當然, css hacks 還有其它不同方式,設計者應視狀況使用,如何善加運用還是決定在設計者。

參考資源
散佈、展示請參閱 Creative Commons 授權條文,禁止重混,引述請增加原文連結。
, , , ,

Posted by 不惑仔 at 痞客邦 PIXNET 留言(4) 引用(0) 人氣()