<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title><![CDATA[網頁藝術思考 - <strong class="xtra"><dfn xml:lang="en" lang="en">CSS</dfn> 網頁設計藝術</strong>, <strong class="xtra">無障礙網頁親和力</strong>:: 痞客邦 PIXNET ::]]></title>
    <link>http://boohover.pixnet.net/blog</link>
    <description><![CDATA[把玩 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 網頁視覺設計、矜持 <acronym title="World Wide Web Consortium" xml:lang="en" lang="en">w3c</acronym> 網頁標準語法 (<acronym title="eXtensible HyperText Markup Language" xml:lang="en" lang="en">xhtml</acronym>)、體認無障礙網頁親和力 (<em xml:lang="en" lang="en">accessibility</em>)。<span class="slogan">時間，人為與自然的衝突。 ～ <a href="mailto:WebchainH@hotmail.com" title="將開啟預設電子郵件程式" class="author">不惑仔</a>。</span>]]></description>
    <pubDate>Mon, 13 Oct 2008 09:42:34 +0000</pubDate>
    <managingEditor>boohover@not-valid.com (boohover)</managingEditor>
    <copyright>Copyright 2003-2009 boohover,Pixnet Digital Media Coporation. All rights reserved.</copyright>
    <generator>PIXNET Media Digital Coporation</generator>
    <language>zh</language>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <item>
      <title><![CDATA[CSS 設計 - 樹狀選單, 資料夾選單 (tree menu / folder menu) [5*]]]></title>
      <link>http://boohover.pixnet.net/blog/post/22415556</link>
      <guid>http://boohover.pixnet.net/blog/post/22415556</guid>
      <description><![CDATA[               
                難度：
                適合：有設計網頁及撰寫 css 語法經驗者。
                說明：設計具有樹狀線條的資料夾選單或樹狀選單 (folder menu or tree menu)。本篇的討論僅適用一層子選單，更多層子選單的設計方式，以後再討論。
                更新：2008-10-13
               
               樹狀選單加入樹狀線條的設計
               
                參閱範例
               
               以下將會討論如何巧妙運用 css 基本特性 (property) 來完成這個實例。
               
                先了解 xhtml 這部分內容的安排。
                
                 &lt;div class=&quot;TreeMenu&quot;&gt;
 &lt;div class=&quot;section&quot;&gt;
  &lt;h1&gt;古文今讀&lt;/h1&gt;
  &lt;ul&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;上古神話&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;詩經&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;楚辭&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;諸子散文&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;漢賦選輯&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;樂府&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;駢文&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;唐詩&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;宋詞&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;元曲&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;章回小說&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
 &lt;/div&gt;
 &lt;!--.section--&gt;
 &lt;div class=&quot;section&quot;&gt;
  &lt;h1&gt;現代文藝&lt;/h1&gt;
  &lt;ul&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;小說&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;散文&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;性靈小品&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;新詩&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;翻譯小說&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
 &lt;/div&gt;
 &lt;!--.section--&gt;
&lt;/div&gt;
&lt;!--.TreeMenu--&gt;
                
               
               本篇範例的完整 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 本身沒有縮排。
                
                 接續前面，增加 li 的 css 定義
                 
                  .TreeMenu .section li {
 padding-left: 0.5em;
 border-bottom: 1px dotted;
}
                 
                
                border 也沒有特別指定顏色，這樣可以對應前面 ul 的 border 顏色，如果想另外定義顏色，方法同前。
                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 的實際高度本來就比 li 少 1px 高 (li 比 a 多了線條的高度)。
                增加距離避免重疊，就算完成了。
                
                 參閱範例
                
                只要在分類間加一點距離，重疊的問題就解決了，為 .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 ，在 ul 或 a 可能會發生高度失準或背景圖片移位的問題，解決這類的 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 間距，只需要在 a 或 li 指定 margin-bottom:-1px; (綠字)，就會使 li 之間有 1px 重疊， a 之間就沒有間距了，不過， ie 7, ie 6 最後一個 li 的線會看不見，修正方式也加在 hacks 裡了 (綠字) ，有興趣可以自行試試。
                
               
               散佈、展示請參閱 Creative Commons 授權條文，禁止重混，引述請增加原文連結。
]]></description>
      <content:encoded><![CDATA[               <ul class="adapt">
                <li>難度：<img class="grade" src="http://webchain.oreilly.tw/boohover/images/ic005_5.png" alt="等級5" title="分成1~5等級，愈大難度愈高。" /></li>
                <li>適合：有設計網頁及撰寫 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 語法經驗者。</li>
                <li>說明：設計具有樹狀線條的資料夾選單或樹狀選單 (<span xml:lang="en" lang="en"><dfn>folder menu</dfn> or <dfn>tree menu</dfn></span>)。本篇的討論僅適用一層子選單，更多層子選單的設計方式，以後再討論。</li>
                <li class="latest">更新：<span class="num date">2008-10-13</span></li>
               </ul>
               <h2>樹狀選單加入樹狀線條的設計</h2>
               <div class="FrameBox">
                <iframe class="SamplePage1 FloatRt" src="http://webchain.oreilly.tw/boohover/practices/navfolder1/CSSNavFolder1Step9.htm" width="186" height="440" frameborder="0" marginheight="0" marginwidth="0" allowtransparency="allowtransparency"><a href="http://webchain.oreilly.tw/boohover/practices/navfolder1/CSSNavFolder1Step9.htm" title="造訪其他網站">參閱範例</a></iframe>
               </div>
               <p>以下將會討論如何巧妙運用 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 基本特性 (<dfn xml:lang="en" lang="en">property</dfn>) 來完成這個實例。</p>
               <dl class="samples CodeArea">
                <dt>先了解 <code>xhtml</code> 這部分內容的安排。</dt>
                <dd class="DisplayBox CodeBox">
                 <pre><code>&lt;div class=&quot;TreeMenu&quot;&gt;
 &lt;div class=&quot;section&quot;&gt;
  &lt;h1&gt;古文今讀&lt;/h1&gt;
  &lt;ul&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;上古神話&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;詩經&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;楚辭&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;諸子散文&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;漢賦選輯&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;樂府&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;駢文&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;唐詩&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;宋詞&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;元曲&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;章回小說&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
 &lt;/div&gt;
 &lt;!--.section--&gt;
 &lt;div class=&quot;section&quot;&gt;
  &lt;h1&gt;現代文藝&lt;/h1&gt;
  &lt;ul&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;小說&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;散文&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;性靈小品&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;新詩&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;#&quot;&gt;翻譯小說&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
 &lt;/div&gt;
 &lt;!--.section--&gt;
&lt;/div&gt;
&lt;!--.TreeMenu--&gt;</code></pre>
                </dd>
               </dl>
               <p>本篇範例的<a href="#FinalCSS">完整 <dfn xml:lang="en" lang="en">css</dfn> 設計內容</a>。</p>
               <div class="comments">
                <h2>思考 - <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 設計的構思與佈局</h2>
                <p>我們儘量以探討方式介紹，引導如何構思及擴展 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 設計，希望能激發更多設計想法為主，避免陷入步驟式或教條式的悲慘學習模式。</p>
                <h3>開始：定義一些基本的 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 設計</h3>
                <div class="FrameBox">
                 <iframe class="SamplePage1 FloatRt" src="http://webchain.oreilly.tw/boohover/practices/navfolder1/CSSNavFolder1Step1.htm" width="186" height="280" frameborder="0" marginheight="0" marginwidth="0" allowtransparency="allowtransparency"><a href="http://webchain.oreilly.tw/boohover/practices/navfolder1/CSSNavFolder1Step1.htm" title="造訪其他網站">參閱範例</a></iframe>
                </div>
                <p>最外圍的 <code>.TreeMenu</code> 指定寬度 (<a href="http://www.w3.org/TR/CSS21/visudet.html#propdef-width" title="造訪W3C網站/英文"><code>width</code></a>) 、背景顏色 (<a href="http://www.w3.org/TR/CSS21/colors.html#background" title="造訪W3C網站/英文"><code>background</code></a>)、邊線 (<a href="http://www.w3.org/TR/CSS21/box.html#border-properties" title="造訪W3C網站/英文"><code>border</code></a>) ， 而 <code>h1</code> 指定字體大小 (<a href="http://www.w3.org/TR/CSS21/fonts.html#propdef-font" title="造訪W3C網站/英文"><code>font</code></a>) ， <code>a</code> 去掉底線， <code>ul</code>, <code>h1</code> 去除周圍距離 (<a href="http://www.w3.org/TR/CSS21/box.html#padding-properties" title="造訪W3C網站/英文"><code>padding</code></a>, <a href="http://www.w3.org/TR/CSS21/box.html#margin-properties" title="造訪W3C網站/英文"><code>margin</code></a>) 等等。</p>
                <dl class="samples CodeArea">
                 <dt><code>css</code></dt>
                 <dd class="DisplayBox CodeBox">
                  <pre><code>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;
}</code></pre>
                 </dd>
                </dl>
                <h3 class="clr"><code>line-height</code> (行高) 是設計的主要概念</h3>
                <div class="FrameBox">
                 <iframe class="SamplePage1 FloatRt" src="http://webchain.oreilly.tw/boohover/practices/navfolder1/CSSNavFolder1Step2.htm" width="186" height="280" frameborder="0" marginheight="0" marginwidth="0" allowtransparency="allowtransparency"><a href="http://webchain.oreilly.tw/boohover/practices/navfolder1/CSSNavFolder1Step2.htm" title="造訪其他網站">參閱範例</a></iframe>
                </div>
                <p>視覺性的瀏覽器通常會預先賦予每行「大於一個字」的<dfn>行高</dfn> (<a href="http://www.w3.org/TR/CSS21/visudet.html#propdef-line-height" title="造訪W3C網站/英文"><code>line-height</code></a>) ，為了避免不同瀏覽器間產生的差異，以及後面設計 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 時有所依據，先將整個選單內 <code>line-height</code> 定義為「字高度」的倍數，例中為 1.1 倍，看起來行距應該會較原來更緊一點。由於 <code>line-height</code> 特性 (<dfn xml:lang="en" lang="en">property</dfn>) 有<dfn>繼承性</dfn> (<a href="http://www.w3.org/TR/CSS21/cascade.html#inheritance" title="造訪W3C網站/英文"><dfn xml:lang="en" lang="en">inheritance</dfn></a>) ，所以只需要定義一次在 <code>.TreeMenu</code> 或 <code>.section</code> 就可以；這裡也順便為分類標題 <code>h1</code> 加背景色修飾一下。</p>
                <dl class="samples CodeArea">
                 <dt>接續前面，增加
                  一點 <code>css</code> 定義 (紅字)</dt>
                 <dd class="DisplayBox CodeBox">
                  <pre><code><span class="hilight_1">.TreeMenu .section {
 line-height: 1.1;
}</span>
.TreeMenu .section h1 {
 font-size: 100%;
 font-weight: normal;
 <span class="hilight_1">background: rgb(85%,70%,90%);</span>
}</code></pre>
                 </dd>
                </dl>
                <p>我們只以倍數定義<dfn>行高</dfn>，也沒有指定字體的尺寸 (<code>font-size</code>)，如此是為了使全部的設計，單純地以<dfn>字高</dfn> (<code>em</code>) 的倍數來計算，不用去管字體到底幾個像素 (<dfn xml:lang="en" lang="en">pixel</dfn>) 大，或者一行有多少像素高。想指定 <code>font-size</code> 當然可以，不過<dfn>行高</dfn>最好還是以倍數的方式指定，設計時才不至於太難計算；這只是建議囉，全部都用像素為單位也沒問題，計算清楚，小腦袋瓜別爆掉就好。</p>
                <h3 class="clr">產生樹狀的垂直線條</h3>
                <div class="FrameBox">
                 <iframe class="SamplePage1 FloatRt" src="http://webchain.oreilly.tw/boohover/practices/navfolder1/CSSNavFolder1Step3.htm" width="186" height="280" frameborder="0" marginheight="0" marginwidth="0" allowtransparency="allowtransparency"><a href="http://webchain.oreilly.tw/boohover/practices/navfolder1/CSSNavFolder1Step3.htm" title="造訪其他網站">參閱範例</a></iframe>
                </div>
                <p>在 <code>ul</code> 左側加上線條，當做樹狀結構的垂直線，並且左邊空出一點距離，讓子選項內容 <code>li</code> 看起來向內縮排。這個距離應該是要對應分類標題 <code>h1</code> 來設計，我們指定了向內縮半個字 (<code>0.5em</code>)，所以線看起來像是由標題第一個字中間向下延伸；標題最前面如果變成小圖示 (<dfn xml:lang="en" lang="en">icons</dfn>) ，那就以圖示寬度的一半去定義縮排距離也可以。這裡應該以 <code>margin</code> 來指定內縮距離，因為我們必須讓垂直線緊貼著 <code>li</code> 。線條寬度沒有使用 <code>em</code> 定義，是因為 <code>1px</code> 寬幾乎沒什麼影響，但是如果需要設計較粗的線，單位最好一致。</p>
                <dl class="samples CodeArea">
                 <dt>在前面已指定的 <code>ul</code> 增加 <code>css</code> 定義 (紅字)</dt>
                 <dd class="DisplayBox CodeBox">
                  <pre><code>.TreeMenu .section ul {
 list-style: none;
 <span class="hilight_1">margin-left: 0.5em;
 border-left: 1px dotted;</span>
}</code></pre>
                 </dd>
                </dl>
                <p>我們沒有特別指定線條 <code>border</code> 的顏色，將會與該區域字的顏色相同，如果想另外定義顏色，可以像這樣，</p>
                <pre><code class="hilight_2">border-left: 1px dotted rgb(255,0,0);</code></pre>
                <p>線條要改成實線也可以， <code class="hilight_2">dotted → solid</code> ，當然其它形式的線條也可有更多變化。</p>
                <h3 class="clr">產生樹狀的水平連接線條</h3>
                <div class="FrameBox">
                 <iframe class="SamplePage1 FloatRt" src="http://webchain.oreilly.tw/boohover/practices/navfolder1/CSSNavFolder1Step4.htm" width="186" height="280" frameborder="0" marginheight="0" marginwidth="0" allowtransparency="allowtransparency"><a href="http://webchain.oreilly.tw/boohover/practices/navfolder1/CSSNavFolder1Step4.htm" title="造訪其他網站">參閱範例</a></iframe>
                </div>
                <p>在子選項 <code>li</code> 下方加上線條，當做樹狀結構子選項的橫連接線。這裡也讓 <code>li</code> 的內容 <code>a</code> 向內縮排，不過，不同於前面，我們必須保持每個 <code>li</code> 下方的線與左側 <code>ul</code> 的線緊緊相接，所以在 <code>li</code> 指定 <code>padding</code> ，僅讓內容 <code>a</code> 向內縮，但 <code>li</code> 本身沒有縮排。</p>
                <dl class="samples CodeArea">
                 <dt>接續前面，增加 <code>li</code> 的 <code>css</code> 定義</dt>
                 <dd class="DisplayBox CodeBox">
                  <pre><code><span class="hilight_1">.TreeMenu .section li {
 padding-left: 0.5em;
 border-bottom: 1px dotted;
}</span></code></pre>
                 </dd>
                </dl>
                <p><code>border</code> 也沒有特別指定顏色，這樣可以對應前面 <code>ul</code> 的 <code>border</code> 顏色，如果想另外定義顏色，方法同前。</p>
                <h3 class="clr"><acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> <code>position:relative;</code> 讓 <code>a</code> 向下位移 (<dfn xml:lang="en" lang="en">offset</dfn>)</h3>
                <div class="FrameBox">
                 <iframe class="SamplePage1 FloatRt" src="http://webchain.oreilly.tw/boohover/practices/navfolder1/CSSNavFolder1Step5.htm" width="186" height="280" frameborder="0" marginheight="0" marginwidth="0" allowtransparency="allowtransparency"><a href="http://webchain.oreilly.tw/boohover/practices/navfolder1/CSSNavFolder1Step5.htm" title="造訪其他網站">參閱範例</a></iframe>
                </div>
                <p><acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> <code><a href="http://www.w3.org/TR/CSS21/visuren.html#relative-positioning" title="造訪W3C網站/英文">position:relative;</a></code> 主要的特點就是，元素可以由本身的 <a href="http://boohover.pixnet.net/blog/post/18087970">Box</a> 位移，並且保留其它元素原來的排版。利用這個特點，只要讓 <code>a</code> 向下位移半行，而 <code>li</code> 會維持原來的位置及下方的橫線， <code>a</code> 的中間就會剛好壓在 <code>li</code> 的線上。前面已經指定 <code>line-height:1.1;</code> (1.1倍的字高)，所以半行就是 <code>0.55em</code> ，太棒了，只有 <code>a</code> 向下移，所有 <code>a</code> 以外的東西都不會動。</p>
                <dl class="samples CodeArea">
                 <dt>在前面已指定的 <code>a</code> 增加 <code>css</code> 定義 (紅字)</dt>
                 <dd class="DisplayBox CodeBox">
                  <pre><code>.TreeMenu .section li a {
 text-decoration: none;
 <span class="hilight_1">position: relative;
 top: 0.55em;</span>
}</code></pre>
                 </dd>
                </dl>
                <p>由於水平線條只有 <code>1px</code> 厚度，對整個位置並無影響，可以不需考量；但是如果指定了較粗的線條，就需要顧慮到線條的厚度會佔掉空間，向下位移的距離應該多加半個線的厚度，這也是為什麼前面有提醒要注意單位一致的原因，如果線的單位是 <code>px</code> ，而<dfn>行高</dfn>是 <code>em</code>，那還真有點難算。</p>
                <h3 class="clr">背景顏色蓋掉重疊的線</h3>
                <div class="FrameBox">
                 <iframe class="SamplePage1 FloatRt" src="http://webchain.oreilly.tw/boohover/practices/navfolder1/CSSNavFolder1Step6.htm" width="186" height="280" frameborder="0" marginheight="0" marginwidth="0" allowtransparency="allowtransparency"><a href="http://webchain.oreilly.tw/boohover/practices/navfolder1/CSSNavFolder1Step6.htm" title="造訪其他網站">參閱範例</a></iframe>
                </div>
                <p>明顯地，現在面臨兩個問題：一、字的背面不應該有線。二、因為 <code>a</code> 的向下位移，造成與下一個分類重疊。第二個問題稍後再討論。第一個問題比較容易處理，我們為 <code>a</code> 指定背景色就可以蓋住 <code>li</code> 的橫線了，由於 <code>a</code> 本身為<dfn>行內層級元素</dfn> (<a href="http://boohover.pixnet.net/blog/post/18087970#BoxBlockInline"><dfn xml:lang="en" lang="en">inline-level elements</dfn></a>) ，所以背景色只會在有字的區域呈現。如果 <code>a</code> 不想有背景顏色，只要指定與 <code>.TreeMenu</code> 相同的背景色， <code>a</code> 看起來就像沒有背景色的樣子。</p>
                <dl class="samples CodeArea">
                 <dt>在前面已指定的 <code>a</code> 增加 <code>css</code> 定義 (紅字)</dt>
                 <dd class="DisplayBox CodeBox">
                  <pre><code>.TreeMenu .section li a {
 text-decoration: none;
 position: relative;
 top: 0.55em;
 <span class="hilight_1">background: rgb(80%,85%,100%);</span>
}</code></pre>
                 </dd>
                </dl>
                <p>如果想讓字之後的整條線都蓋掉，只要把 <code>a</code> 轉換成<dfn>區塊層級</dfn> (<a href="http://boohover.pixnet.net/blog/post/18087970#BoxBlockInline"><dfn xml:lang="en" lang="en">block-level</dfn></a>) 呈現即可。</p>
                <div class="FrameBox clr">
                 <iframe class="SamplePage1 FloatRt" src="http://webchain.oreilly.tw/boohover/practices/navfolder1/CSSNavFolder1Step7.htm" width="186" height="280" frameborder="0" marginheight="0" marginwidth="0" allowtransparency="allowtransparency"><a href="http://webchain.oreilly.tw/boohover/practices/navfolder1/CSSNavFolder1Step7.htm" title="造訪其他網站">參閱範例</a></iframe>
                </div>
                <dl class="samples CodeArea">
                 <dt>繼續為 <code>a</code> 增加 <code>css</code> 定義 (紅字)</dt>
                 <dd class="DisplayBox CodeBox">
                  <pre><code>.TreeMenu .section li a {
 text-decoration: none;
 position: relative;
 top: 0.55em;
 background: rgb(80%,85%,100%);
 <span class="hilight_1">display: block;</span>
}</code></pre>
                 </dd>
                </dl>
                <p>此時會看到子選項內容 <code>a</code> 之間有 <code>1px</code> 的間隔，這是因為 <code>a</code> 的實際高度本來就比 <code>li</code> 少 <code>1px</code> 高 (<code>li</code> 比 <code>a</code> 多了線條的高度)。</p>
                <h3 class="clr">增加距離避免重疊，就算完成了。</h3>
                <div class="FrameBox">
                 <iframe class="SamplePage1 FloatRt" src="http://webchain.oreilly.tw/boohover/practices/navfolder1/CSSNavFolder1Step8.htm" width="186" height="280" frameborder="0" marginheight="0" marginwidth="0" allowtransparency="allowtransparency"><a href="http://webchain.oreilly.tw/boohover/practices/navfolder1/CSSNavFolder1Step8.htm" title="造訪其他網站">參閱範例</a></iframe>
                </div>
                <p>只要在分類間加一點距離，重疊的問題就解決了，為 <code>.section</code> 下方加上 <code>padding</code> 應是較恰當的方式。為了分類裡面的上下距離看起來一樣 ([上古神話]上方與[章回小說]下方) ，我們指定了 <code>padding-bottom:1.1em;</code> ，與<dfn>行高</dfn>相等的距離。</p>
                <dl class="samples CodeArea">
                 <dt>在前面已指定的 <code>.section</code> 增加 <code>css</code> 定義 (紅字)</dt>
                 <dd class="DisplayBox CodeBox">
                  <pre><code>.TreeMenu .section {
 line-height: 1.1;
 <span class="hilight_1">padding-bottom: 1.1em;</span>
}</code></pre>
                 </dd>
                </dl>
                <p>換成在 <code>ul</code> 下方增加距離也可以，不過，只能以 <code>margin</code> 來定義，因為 <code>padding</code> 會使左側的線跟著向下延長，就不會與最後一個 <code>li</code> 的橫線緊接了。</p>
                <p>目前應該已經算是完成囉，只剩下修飾更好而已。</p>
                <h3 class="clr"><code>hasLayout</code> 處理 <dfn xml:lang="en" lang="en"><acronym title="Internet Explorer">ie</acronym> bugs</dfn></h3>
                <p><acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 7 或 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 ，在 <code>ul</code> 或 <code>a</code> 可能會發生高度失準或背景圖片移位的問題，解決這類的 <dfn xml:lang="en" lang="en">bugs</dfn> 常用的方式是 <a href="http://boohover.pixnet.net/blog/post/14187356"><dfn xml:lang="en" lang="en">hasLayout property</dfn></a> 。由於目前在 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 8 都還正常，為了清楚區隔，我們最好運用 <a href="http://boohover.pixnet.net/blog/post/8947951"><dfn xml:lang="en" lang="en">css hacks</dfn></a> 技巧。</p>
                <dl class="samples CodeArea">
                 <dt>視問題的區域，自行斟酌增加 <code>css</code> 定義</dt>
                 <dd class="DisplayBox CodeBox">
                  <pre><code>*+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*/</code></pre>
                 </dd>
                 <dt>如果 <code>a</code> 還是有高度或不正常間隙問題</dt>
                 <dd class="DisplayBox CodeBox">
                  <pre><code>*+html .TreeMenu .section ul a {
 zoom:1;
 <span class="hilight_1">vertical-align:top;</span>
} /*hack ie7*/
* html .TreeMenu .section ul a {
 zoom:1;
 <span class="hilight_1">vertical-align:top;</span>
} /*hack ie6*/</code></pre>
                 </dd>
                </dl>
                <h3 class="clr">在子選項前加小圖示，並且做最後修飾</h3>
                <div class="FrameBox">
                 <iframe class="SamplePage1 FloatRt" src="http://webchain.oreilly.tw/boohover/practices/navfolder1/CSSNavFolder1Step9.htm" width="186" height="440" frameborder="0" marginheight="0" marginwidth="0" allowtransparency="allowtransparency"><a href="http://webchain.oreilly.tw/boohover/practices/navfolder1/CSSNavFolder1Step9.htm" title="造訪其他網站">參閱範例</a></iframe>
                </div>
                <p>以小圖示作為 <code>a</code> 的背景，並且指定左邊 <code>padding</code> 距離，讓 <code>a</code> 的內容文字向內縮排，才不會與小圖示重疊。例中的小球圖示 (<code>ic008.png</code>) 寬度 <code>10px</code> ，我們指定它的位置在 <code>a</code> 的最左側並且上下居中，這樣會讓小球剛好緊接在 <code>li</code> 的線後，然後左側 <code>padding</code> 距離為 <code>15px</code> ，讓字不要與圖看起來太緊鄰。另外，把 <code>a</code> 的背景顏色指定成與 <code>.TreeMenu</code> 相同。</p>
                <p>我們也在 <code>a</code> 及標題 <code>h1</code> 上下加了一點 <code>padding</code> 距離，讓字看起來不會與邊緣太緊鄰。不過， <code>a</code> 上下各增加了 <code>0.25em</code> ，表示整行的高度也增加了，所以，向下位移的 <code>top</code> 定義也需要對等增加 <code>0.25em</code> 的距離 (<code>0.55 + 0.25 = 0.8em</code>) ；而 <code>.section</code> 下方的 <code>padding</code> 距離也應該增加為 <code>1.6em</code> (<code>1.1em + 0.25em + 0.25em</code>) 。</p>
                <dl class="samples CodeArea" id="FinalCSS">
                 <dt>範例完整的 <code>css</code> 設計</dt>
                 <dd class="DisplayBox CodeBox">
                  <pre><code>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;
 <span class="hilight_1">padding-bottom:1.6em;</span>
}
.TreeMenu .section h1 {
 font-size: 100%;
 font-weight: normal;
 background: rgb(85%,70%,90%);
 <span class="hilight_1">padding-top: 0.25em;</span>
 <span class="hilight_1">padding-bottom: 0.25em;</span>
}
.TreeMenu .section ul {
 list-style: none;
 margin-left: 0.5em;
 border-left: 1px dotted;
}
*+html .TreeMenu .section ul {
 zoom:1;
 <span class="hilight_2">padding-bottom:1px;
 margin-bottom:-1px;</span>
} /*<dfn xml:lang="en" lang="en">hack</dfn> <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 7*/
* html .TreeMenu .section ul {
 zoom:1;
 <span class="hilight_2">padding-bottom:1px;
 margin-bottom:-1px;</span>
} /*<dfn xml:lang="en" lang="en">hack</dfn> <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6*/
.TreeMenu .section li {
 padding-left: 0.5em;
 border-bottom: 1px dotted;
}
.TreeMenu .section li a {
 text-decoration: none;
 position: relative;
 <span class="hilight_1">top: 0.8em</span>;
 <span class="hilight_1">background: rgb(92%,86%,100%) url(ic008.png) no-repeat left center;</span>
 display: block;
 <span class="hilight_1">padding: 0.25em 4px 0.25em 15px;</span>
 <span class="hilight_2">margin-bottom: -1px;</span>
}
*+html .TreeMenu .section ul a {
 zoom:1;
 vertical-align:top;
} /*<dfn xml:lang="en" lang="en">hack</dfn> <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 7*/
* html .TreeMenu .section ul a {
 zoom:1;
 vertical-align:top;
} /*<dfn xml:lang="en" lang="en">hack</dfn> <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6*/</code></pre>
                 </dd>
                </dl>
                <p>前面提到由於 <code>li</code> 的下方線條使 <code>a</code> 之間會有 <code>1px</code> 間距，只需要在 <code>a</code> 或 <code>li</code> 指定 <code>margin-bottom:-1px;</code> (綠字)，就會使 <code>li</code> 之間有 <code>1px</code> 重疊， <code>a</code> 之間就沒有間距了，不過， <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 7, <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 最後一個 <code>li</code> 的線會看不見，修正方式也加在 <dfn xml:lang="en" lang="en">hacks</dfn> 裡了 (綠字) ，有興趣可以自行試試。</p>
                <div class="clr"></div>
               </div>
               <div class="others"><span class="copyright">散佈、展示請參閱 <a href="http://creativecommons.org/licenses/by-nc-nd/2.5/tw/" title="造訪創用CC條款"><dfn xml:lang="en" lang="en">Creative Commons</dfn> 授權條文</a>，禁止重混，引述請增加原文連結。</span></div>
  <div class="more"><a href="http://boohover.pixnet.net/blog/post/22415556">(Read More...)</a></div>]]></content:encoded>
      <pubDate>Mon, 13 Oct 2008 09:42:34 +0000</pubDate>
      <category>CSS網頁設計魔法</category>
      <comments>http://boohover.pixnet.net/blog/post/22415556#comments</comments>
    </item>
    <item>
      <title><![CDATA[半透明與透明效果設計 - CSS rgba, hsla 色彩單位 (CSS color units) [2*]]]></title>
      <link>http://boohover.pixnet.net/blog/post/20556952</link>
      <guid>http://boohover.pixnet.net/blog/post/20556952</guid>
      <description><![CDATA[               
                難度：
                適合：有 html 及 css 語法基礎概念者。
                說明： rgba 及 hsla 為 css level 3 (css 3) 起，新一代表示色彩的單位 (color units)，最大的進展就是增加了「a」這個可以定義顏色不透明度 (opacity) 的 alpha 值；顏色的指定，當然包括了背景色 (background) 、邊線色 (border) 、前景色或文字色 (color) 等，這讓以往網頁設計需要繁瑣過程的半透明效果變得簡單輕鬆多了。本篇也附帶討論尚未支援的瀏覽器，可做到類似效果的幾種設計概念。
                更新：2009-10-03
                支援： firefox 3, safari,  google chrome, opera 10 (至更新時)。
               
               具有半透明值 (alpha 色版) 的 css 3 顏色單位
               有二種表示方式：
               
                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
                 
&lt;div id=&quot;st1&quot; class=&quot;st&quot;&gt;
 &lt;div class=&quot;inner&quot;&gt;
  &lt;h1&gt;也讓時間等一等&lt;/h1&gt;
  &lt;p&gt;積極很好。人，肯積極，多半心裡有目標。…
   …以下略，實際內容見範例內…
  &lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
                 
                 共同基本的 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);
}
                 
                
                實際呈現可參閱 [範例一] ←請以有支援 css 3 的 firefox 閱覽。
                多層半透明色重疊效果 - 背景加上邊線色 (border-color)
                共同的 css 定義與範例一相同。
                
                 範例二 xhtml
                 
&lt;div id=&quot;st2&quot; class=&quot;st&quot;&gt;
 &lt;div class=&quot;inner&quot;&gt;
  &lt;h1&gt;也讓時間等一等&lt;/h1&gt;
  &lt;p&gt;積極很好。人，肯積極，多半心裡有目標。…
     …以下略，實際內容見範例內…
  &lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
                 
                 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 3 的 firefox 閱覽。
                需要了解的是， 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
                 
&lt;div id=&quot;st3&quot; class=&quot;st&quot;&gt;
 &lt;div class=&quot;inner&quot;&gt;
  &lt;h1&gt;也讓時間等一等&lt;/h1&gt;
  &lt;p&gt;積極很好。人，肯積極，多半心裡有目標。…
     …以下略，實際內容見範例內…
  &lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
                 
                 css 把標題首字變半透明色 (color)
                 
#st3 h1::first-letter {
 /* h1 第一個字變粗大且半透明呈現*/
 font: 900 900% &quot;標楷體&quot;,simhei,&quot;細明體&quot;;
 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 的 firefox 閱覽。
                當然，半透明文字的顏色也會與背景色疊合成另一個半透明色，再讓最後面的背景圖片穿透上來。
                css 3 hsla 讓定義色彩及明暗度更直覺
                以色相、飽和度、亮度 (Hue, Saturation, Lightness - HSL) 指定顏色，也是 css 3 開始有的顏色單位，與色彩模型中的 HSB 有些類似，或許還有很多人不太習慣，不過許多情況它還挺方便用的。
                共同的 css 定義與範例一相同。
                
                 範例四 xhtml
                 
&lt;div id=&quot;st4&quot; class=&quot;st&quot;&gt;
 &lt;div class=&quot;inner&quot;&gt;
  &lt;h1&gt;也讓時間等一等&lt;/h1&gt;
  &lt;p&gt;積極很好。人，肯積極，多半心裡有目標。…
     …以下略，實際內容見範例內…
  &lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
                 
                 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);
} /*背景及邊線都是紅色調*/
                 
                
                實際呈現可參閱 [範例四] ←請以有支援 css 3 的 firefox 閱覽。
                很多時候需要以同一種色調 (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=&quot;bg_bk70.png&quot;,sizingMethod=&quot;scale&quot;);
 /*插入圖片並縮放至與元素同尺寸*/
}

                 
                
                圖片會由所在元素的 border box 左上角開始插入。語法中 filter 內的 src=&quot;bg_bk70.png&quot; (綠字) ，明顯地，雙引號內就是指出圖片檔的位址。而 sizingMethod=&quot;scale&quot; 可以有三種選擇：
                
                 sizingMethod=&quot;image&quot; ：不論所在元素的 Box 大小，圖片一律以圖片本身尺寸完整顯示。如果 Box 尺寸大於圖片， Box 超過圖片的區域會被「裁掉」不顯示；如果 Box 尺寸小於圖片， Box 會保持尺寸，不會增大，而圖片則會「突出」 Box 範圍。這個定義是預設值，所以沒有 sizingMethod 這段時，仍會套用此定義。
                 sizingMethod=&quot;scale&quot; ：圖片會自動依據元素的 border box 尺寸縮放，所以圖片呈現可能會寬高不等比例變形。
                 sizingMethod=&quot;crop&quot; ：圖片會保持圖片本身尺寸，但是圖片超出 Box 範圍的部分，不會顯示，類似 css 定義背景圖片的呈現方式。
                
                看起來似乎達到想要的半透明背景效果，也不會讓內容文字也變半透明。這樣的作法只是為了讓原本不能正確呈現的 ie 也能有我們想要的效果，嚴格說起來應算是 ie 的旁門左道，並非 w3c 標準規範。怪的是 ie 仍有不可預期的問題，使用時要先有心理準備就是了，像是內容如果包括需要滑鼠感應的元素 (如按鈕、輸入項之類) ，會變成無法執行，又得以 css 指定這類元素 position:relative; 才會作用。
               
               
                參考資源
                CSS 3 Color Units - w3c 官方文件 (英文) 。
               
               散佈、展示請參閱 Creative Commons 授權條文，禁止重混，引述請增加原文連結。
]]></description>
      <content:encoded><![CDATA[               <ul class="adapt">
                <li>難度：<img class="grade" src="http://webchain.oreilly.tw/boohover/images/ic005_2.png" alt="等級2" title="分成1~5等級，愈大難度愈高。" /></li>
                <li>適合：有 <acronym title="HyperText Markup Language" xml:lang="en" lang="en">html</acronym> 及 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 語法基礎概念者。</li>
                <li>說明： <code>rgba</code> 及 <code>hsla</code> 為 <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> level 3</dfn> (<acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 3) 起，新一代表示色彩的單位 (<dfn xml:lang="en" lang="en">color units</dfn>)，最大的進展就是增加了「<code>a</code>」這個可以定義顏色不透明度 (<dfn xml:lang="en" lang="en">opacity</dfn>) 的 <dfn xml:lang="en" lang="en">alpha</dfn> 值；顏色的指定，當然包括了背景色 (<a href="http://www.w3.org/TR/CSS21/colors.html#background" title="造訪W3C網站/英文"><code>background</code></a>) 、邊線色 (<a href="http://www.w3.org/TR/CSS21/box.html#border-properties" title="造訪W3C網站/英文"><code>border</code></a>) 、前景色或文字色 (<a href="http://www.w3.org/TR/css3-color/#foreground" title="造訪W3C網站/英文"><code>color</code></a>) 等，這讓以往網頁設計需要繁瑣過程的半透明效果變得簡單輕鬆多了。本篇也附帶討論尚未支援的瀏覽器，可做到類似效果的幾種設計概念。</li>
                <li class="latest">更新：<span class="num date">2009-10-03</span></li>
                <li class="supports">支援： <a href="http://moztw.org/" title="造訪Mozilla網站可免費下載firefox"><dfn xml:lang="en" lang="en">firefox 3</dfn></a>, <a href="http://www.apple.com/safari/download/" title="造訪Apple網站可免費下載safari/英文網站"><dfn xml:lang="en" lang="en">safari</dfn></a>,  <a href="http://www.google.com/chrome" title="造訪google網站可免費下載chrome"><dfn xml:lang="en" lang="en">google chrome</dfn></a>, <a href="http://www.opera.com/download/"  title="造訪opera網站可免費下載/英文網站"><dfn xml:lang="en" lang="en">opera 10</dfn></a> (至更新時)。</li>
               </ul>
               <h2>具有半透明值 (<dfn><span xml:lang="en" lang="en">alpha</span> 色版</dfn>) 的 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 3 顏色單位</h2>
               <p>有二種表示方式：</p>
               <ul class="RegularList">
                <li><code>rgba(<span xml:lang="en" lang="en">red</span> 值, <span xml:lang="en" lang="en">green</span> 值, <span xml:lang="en" lang="en">blue</span> 值, <dfn xml:lang="en" lang="en">alpha</dfn> 值)</code>
                 <dl class="method CodeArea">
                  <dt id="rgbValue"><span xml:lang="en" lang="en">red, green, blue</span> 值</dt>
                  <dd class="DisplayBox">可以是 0 ~ 255 的整數值，與一般 8 位元顏色的十進位值相同，惟這類表示法不接受十六進位值 (如 ff, 8c) ；也可以是 0% ~ 100% 的百分比值。所以例如， <code>rgb(128,128,128) = rgb(50%,50%,50%) = #808080</code> 。</dd>
                  <dt id="AlphaValue"><dfn xml:lang="en" lang="en">alpha</dfn> 值 (<dfn xml:lang="en" lang="en">alphavalue</dfn>)</dt>
                  <dd class="DisplayBox">0.0 ~ 1.0 允許小數一位的數值， 0 →完全透明， 1 →完全不透明， 0.7 → 70% 不透明。 <acronym title="World Wide Web Consortium" xml:lang="en" lang="en">w3c</acronym> 沒有明確地表示是否允許小數一位以上的數值，不過 <dfn xml:lang="en" lang="en">firefox</dfn> 小數二位的數值也可以呈現，真是令人讚賞。</dd>
                  <dt>語法實例：</dt>
                  <dd class="DisplayBox CodeBox">
                   <p><code class="hilight_1">rgba(255, 0, 0, 0.6)</code> → 不透明度 60% 紅色</p>
                   <p><code class="hilight_1">rgba(0%, 0%, 100%, 0.4)</code> → 不透明度 40% 藍色</p>
                  </dd>
                 </dl>
                </li>
                <li><code>hsla(<dfn xml:lang="en" lang="en">hue</dfn> 值, <dfn xml:lang="en" lang="en">saturation</dfn> 值, <dfn xml:lang="en" lang="en">lightness</dfn> 值, <dfn xml:lang="en" lang="en">alpha </dfn>值)</code>
                 <dl class="method CodeArea">
                  <dt id="hslValue"><dfn xml:lang="en" lang="en">hue</dfn> 值 (<dfn>色相</dfn>值)</dt>
                  <dd class="DisplayBox">以整數「角度」值表示，但是不加「°」角度符號。 0 或 360 →紅色， 60 →黃色， 120 →綠色， 240 →藍色，就好像彩虹色繞成一個圓。如同數學角度，負值或超過 360 是允許的，不過這樣用好像是有點自找麻煩。</dd>
                  <dt><dfn xml:lang="en" lang="en">saturation</dfn> 值 (<dfn>飽和度</dfn>值)</dt>
                  <dd class="DisplayBox">0% ~ 100% 的百分比值， 0% →灰色調， 100% →最大飽和度。所以 0% 時，不論 <dfn xml:lang="en" lang="en">hue</dfn> 值是多少，都會以灰階單色呈現。</dd>
                  <dt><dfn xml:lang="en" lang="en">lightness</dfn> 值 (<dfn>亮度</dfn>值)</dt>
                  <dd class="DisplayBox">0% ~ 100% 的百分比值， 0% →最暗 (暗黑)， 100% →最亮 (亮白)， 50% →正常亮度。 50% 以上漸漸增加白色， 50% 以下漸漸增加黑色。</dd>
                  <dt><dfn xml:lang="en" lang="en">alpha</dfn> 值 (<dfn xml:lang="en" lang="en"><a href="#AlphaValue">alphavalue</a></dfn>)</dt>
                  <dd class="DisplayBox">0.0 ~ 1.0 允許小數一位的數值。</dd>
                  <dt>語法實例：</dt>
                  <dd class="DisplayBox CodeBox">
                   <p><code class="hilight_1">hsla(0, 100%, 50%, 0.3)</code> → 不透明度 30% 紅色</p>
                   <p><code class="hilight_1">hsla(120, 100%, 20%, 0.4)</code> → 不透明度 40% 暗綠色</p>
                   <p><code class="hilight_1">hsla(240, 0%, 50%, 0.6)</code> → 不透明度 60% 中亮灰色</p>
                  </dd>
                 </dl>
                </li>
               </ul>
               <h3 id="kwTransparent"><dfn xml:lang="en" lang="en">transparent</dfn> 值 - 完全透明的關鍵字 (<dfn xml:lang="en" lang="en">keyword</dfn>) 值</h3>
               <p><dfn xml:lang="en" lang="en">alpha</dfn> 值 = 1 時，完全不透明，實際上就等同沒有半透明 <dfn xml:lang="en" lang="en">alpha</dfn> 值的定義一樣，例如 <code>rgba(255,0,0,<strong class="hilight_1">1</strong>) = rgb(255,0,0) = #ff0000</code> 。</p>
               <p><dfn xml:lang="en" lang="en">alpha</dfn> 值 = 0 時，完全透明，也就等同 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 2 的關鍵字 (<dfn xml:lang="en" lang="en">keyword</dfn>) 值 <dfn xml:lang="en" lang="en">transparent</dfn> ，例如 <code>hsla(0,100%,50%,<strong class="hilight_1">0</strong>) = <strong class="hilight_1">transparent</strong></code> ，不管是什麼顏色，其實都是透明看不見。所以，這也就意味前景色 (<a href="http://www.w3.org/TR/css3-color/#foreground" title="造訪W3C網站/英文"><code>color</code></a>) 特性 (<dfn xml:lang="en" lang="en">property</dfn>) 也接受 <dfn xml:lang="en" lang="en">transparent</dfn> 值了，如 <code>color:<strong class="hilight_1">transparent</strong>;</code> 或 <code>color:rgba(0,0,0,<strong class="hilight_1">0</strong>);</code> ，而這在 <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> level 2</dfn> 是不允許的。</p>
               <div class="comments">
                <h2>思考 - 背景半透明效果輕鬆設計： <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> color module level 3</dfn></h2>
                <p><dfn>顏色單位</dfn> (<dfn xml:lang="en" lang="en">color units</dfn>) 在 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 設計裡，主要運用在指定背景色 (<a href="http://www.w3.org/TR/CSS21/colors.html#background" title="造訪W3C網站/英文"><code>background</code></a>) 、邊線色 (<a href="http://www.w3.org/TR/CSS21/box.html#border-properties" title="造訪W3C網站/英文"><code>border</code></a>) 、前景色或文字色 (<a href="http://www.w3.org/TR/css3-color/#foreground" title="造訪W3C網站/英文"><code>color</code></a>) ，而多了可以直接定義顏色不透明度 (<dfn>opacity</dfn>) 的模式，設計背景半透明效果可說是輕而易舉。</p>
                <h3>半透明背景色 (<code>background-color</code>) 效果</h3>
                <dl class="samples CodeArea">
                 <dt>直接看範例一 <code>xhtml</code></dt>
                 <dd class="DisplayBox CodeBox">
<pre><code>&lt;div id=&quot;st1&quot; class=&quot;st&quot;&gt;
 &lt;div class=&quot;inner&quot;&gt;
  &lt;h1&gt;<span class="CodeZh">也讓時間等一等</span>&lt;/h1&gt;
  &lt;p&gt;<span class="CodeZh">積極很好。人，肯積極，多半心裡有目標。…
   …以下略，實際內容見範例內…</span>
  &lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;</code></pre>
                 </dd>
                 <dt id="ComCSS">共同基本的 <code>css</code> 定義</dt>
                 <dd class="DisplayBox CodeBox">
<pre><code>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; /*<span class="CodeZh">文字白色</span>*/
 /*div.st<span class="CodeZh">加背景圖片並定義與圖片同尺寸</span>*/
 background: url(<span class="CodeZh">圖片檔案位址</span>) no-repeat center;
 height: 534px;
 width: 800px;
 overflow: auto; /*<span class="CodeZh">內容超過高度時產生捲軸</span>*/
 margin: 1.2em auto 0;
 text-align: justify;
 border:1px solid rgb(60%,60%,60%);
 border-right:none;
}</code></pre>
                 </dd>
                 <dt><code>css</code> 定義半透明背景色 (<code>background</code>)</dt>
                 <dd class="DisplayBox CodeBox">
<pre><code>#st1 .inner {
 padding: 1em 4%;
}
/*<span class="CodeZh">標題</span> h1, <span class="CodeZh">段落</span> p <span class="CodeZh">加半透明背景色</span>*/
#st1 h1 {
 <span class="hilight_2">background: rgba(30%,0%,0%,0.6);</span>
}
#st1 p {
 <span class="hilight_2">background: rgba(0%,10%,20%,0.6);</span>
}</code></pre>
                 </dd>
                </dl>
                <p id="ToPratice1">實際呈現可參閱 [<a href="http://webchain.oreilly.tw/boohover/practices/CSSColorUnits_rgba.htm#st1">範例一</a>] ←請以有支援 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 3 的 <a href="http://moztw.org/" title="造訪Mozilla網站可免費下載firefox"><span xml:lang="en" lang="en">firefox</span></a> 閱覽。</p>
                <h3>多層半透明色重疊效果 - 背景加上邊線色 (<code>border-color</code>)</h3>
                <p><a href="#ComCSS">共同的 <code>css</code> 定義</a>與範例一相同。</p>
                <dl class="samples CodeArea">
                 <dt>範例二 <code>xhtml</code></dt>
                 <dd class="DisplayBox CodeBox">
<pre><code>&lt;div id=&quot;st2&quot; class=&quot;st&quot;&gt;
 &lt;div class=&quot;inner&quot;&gt;
  &lt;h1&gt;<span class="CodeZh">也讓時間等一等</span>&lt;/h1&gt;
  &lt;p&gt;<span class="CodeZh">積極很好。人，肯積極，多半心裡有目標。…
     …以下略，實際內容見範例內…</span>
  &lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;</code></pre>
                 </dd>
                 <dt><code>css</code> 增加定義半透明邊線色 (<code>border</code>)</dt>
                 <dd class="DisplayBox CodeBox">
<pre><code>#st2 .inner {
 padding-bottom: 0.25em;
}
/*<span class="CodeZh">半透明背景色與例一雷同</span>*/
#st2 h1 {
 background: rgba(40%,0%,0%,0.6);
 <span class="hilight_2">border-top: 2em solid;
 border-right: 260px solid;
 border-bottom: 0.5em solid;
 border-color: rgba(100%,100%,100%,0.2);</span> /*20%<span class="CodeZh">白色</span>*/
} /*<span class="CodeZh">三邊加上不同寬度的</span> border*/
#st2 p {
 background: rgba(0%,10%,20%,0.6);
 <span class="hilight_2">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);</span>
} /*<span class="CodeZh">四邊加上40%不同顏色的</span> border*/</code></pre>
                 </dd>
                </dl>
                <p id="ToPratice2">實際呈現可參閱 [<a href="http://webchain.oreilly.tw/boohover/practices/CSSColorUnits_rgba.htm#st2">範例二</a>] ←請以有支援 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 3 的 <a href="http://moztw.org/" title="造訪Mozilla網站可免費下載firefox"><span xml:lang="en" lang="en">firefox</span></a> 閱覽。</p>
                <p>需要了解的是， <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 指定元素的背景色或背景圖片 (<code>background</code>) 會顯示在 <a href="http://boohover.pixnet.net/blog/post/18087970#BoxModel"><dfn xml:lang="en" lang="en">border edge</dfn></a> 區域以內，也就是說， <code>border</code> 色與 <code>background</code> 色是重疊的，當 <code>border</code> 顏色定義成半透明時，就會與其後方背景顏色產生混合。在範例二中， <code>h1</code> 加了 20% 半透明白色 <code>border</code> ，但實際呈現的是疊合了暗紅的半透明背景色，因而，在最後面的背景圖片被不同的半透明顏色覆蓋，而產生不同的層次感，並且因為寬度不同的 <code>border</code> 而使設計更具活潑感；而 <code>p</code> 則在四邊運用不同的顏色與背景色混合，讓背景圖片產生較立體的半透明視覺效果。</p>
                <p>這樣的雙層半透明網頁設計效果，只在一個元素 (<dfn xml:lang="en" lang="en">element</dfn>) 上定義樣式 (<dfn xml:lang="en" lang="en">styles</dfn>) 就可輕易完成，沒有 <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> level 3</dfn> 時根本困難重重。</p>
                <h3>文字半透明 (<code>color</code>) 效果</h3>
                <p><dfn>顏色單位</dfn> (<dfn xml:lang="en" lang="en">color units</dfn>) 當然可以用在 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> <code>color</code> 特性 (<dfn xml:lang="en" lang="en">property</dfn>) ， <code>color</code> 通常用來指定文字的顏色，所以也就可以讓文字變成半透明了。</p>
                <p><a href="#ComCSS">共同的 <code>css</code> 定義</a>與範例一相同。</p>
                <dl class="samples CodeArea">
                 <dt>範例三 <code>xhtml</code></dt>
                 <dd class="DisplayBox CodeBox">
<pre><code>&lt;div id=&quot;st3&quot; class=&quot;st&quot;&gt;
 &lt;div class=&quot;inner&quot;&gt;
  &lt;h1&gt;<span class="CodeZh">也讓時間等一等</span>&lt;/h1&gt;
  &lt;p&gt;<span class="CodeZh">積極很好。人，肯積極，多半心裡有目標。…
     …以下略，實際內容見範例內…</span>
  &lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;</code></pre>
                 </dd>
                 <dt><code>css</code> 把標題首字變半透明色 (<code>color</code>)</dt>
                 <dd class="DisplayBox CodeBox">
<pre><code>#st3 h1::first-letter {
 /* h1 <span class="CodeZh">第一個字變粗大且半透明呈現</span>*/
 font: 900 900% &quot;<span class="CodeZh">標楷體</span>&quot;,simhei,&quot;<span class="CodeZh">細明體</span>&quot;;
 vertical-align: -8%;
 <span class="hilight_2">color: rgba(85%,100%,100%,0.5);</span> /*50%<span class="CodeZh">亮藍</span>*/
}
/*<span class="CodeZh">半透明背景及邊線,與前例雷同</span>*/
#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);
}</code></pre>
                 </dd>
                </dl>
                <p id="ToPratice3">實際呈現可參閱 [<a href="http://webchain.oreilly.tw/boohover/practices/CSSColorUnits_rgba.htm#st3">範例三</a>] ←請以有支援 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 3 的 <a href="http://moztw.org/" title="造訪Mozilla網站可免費下載firefox"><span xml:lang="en" lang="en">firefox</span></a> 閱覽。</p>
                <p>當然，半透明文字的顏色也會與背景色疊合成另一個半透明色，再讓最後面的背景圖片穿透上來。</p>
                <h3><acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 3 <code>hsla</code> 讓定義色彩及明暗度更直覺</h3>
                <p>以<dfn>色相</dfn>、<dfn>飽和度</dfn>、<dfn>亮度</dfn> (<dfn xml:lang="en" lang="en">Hue</dfn>, <dfn xml:lang="en" lang="en">Saturation</dfn>, <dfn xml:lang="en" lang="en">Lightness</dfn> - <strong xml:lang="en" lang="en">HSL</strong>) 指定顏色，也是 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 3 開始有的<dfn>顏色單位</dfn>，與色彩模型中的 <strong title="Hue, Saturation, Brightness" xml:lang="en" lang="en">HSB</strong> 有些類似，或許還有很多人不太習慣，不過許多情況它還挺方便用的。</p>
                <p><a href="#ComCSS">共同的 <code>css</code> 定義</a>與範例一相同。</p>
                <dl class="samples CodeArea">
                 <dt>範例四 <code>xhtml</code></dt>
                 <dd class="DisplayBox CodeBox">
<pre><code>&lt;div id=&quot;st4&quot; class=&quot;st&quot;&gt;
 &lt;div class=&quot;inner&quot;&gt;
  &lt;h1&gt;<span class="CodeZh">也讓時間等一等</span>&lt;/h1&gt;
  &lt;p&gt;<span class="CodeZh">積極很好。人，肯積極，多半心裡有目標。…
     …以下略，實際內容見範例內…</span>
  &lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;</code></pre>
                 </dd>
                 <dt><code>css</code> 改變半透明色的飽和度及亮度</dt>
                 <dd class="DisplayBox CodeBox">
<pre><code>#st4 .inner {
 padding: 1em 4%;
}
#st4 h1 {
 background: hsla(120,<span class="hilight_1">60%</span>,<span class="hilight_1">20%</span>,0.6);
 border-top: 1.5em solid hsla(120,<span class="hilight_1">40%</span>,<span class="hilight_1">12%</span>,0.3);
 border-right: 80px solid hsla(120,<span class="hilight_1">40%</span>,<span class="hilight_1">50%</span>,0.3);
} /*<span class="CodeZh">背景及邊線都是綠色調</span>*/
#st4 p {
 background: hsla(0,70%,<span class="hilight_1">30%</span>,0.7);
 border-right: 80px solid hsla(0,70%,<span class="hilight_1">80%</span>,0.2);
} /*<span class="CodeZh">背景及邊線都是紅色調</span>*/</code></pre>
                 </dd>
                </dl>
                <p id="ToPratice4">實際呈現可參閱 [<a href="http://webchain.oreilly.tw/boohover/practices/CSSColorUnits_rgba.htm#st4">範例四</a>] ←請以有支援 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 3 的 <a href="http://moztw.org/" title="造訪Mozilla網站可免費下載firefox"><span xml:lang="en" lang="en">firefox</span></a> 閱覽。</p>
                <p>很多時候需要以同一種<dfn>色調</dfn> (<dfn xml:lang="en" lang="en">Hue</dfn> or <dfn xml:lang="en" lang="en">Tone</dfn>)，呈現出不同明暗度的感覺，讓視覺上更有層次及立體感，範例中使用 <code>hsla</code> 定義顏色會是個好方法。眼尖的人應該已經看出，<code>h1</code> 或是 <code>p</code> 中指定的<dfn>色相</dfn>值 (<dfn xml:lang="en" lang="en">Hue</dfn>) 都是一樣的，也就是說用了同一種<dfn>色調</dfn>，而只是單純地在背景色 (<code>background</code>) 或是 <code>border</code> 定義不同的<dfn>亮度值</dfn> (<dfn xml:lang="en" lang="en">Lightness</dfn>)，就可以產生更有深度的視覺效果；而如果希望降低或增加顏色的鮮艷度，如範例中只需要指定較低或較高的<dfn>飽和度</dfn>值 (<dfn xml:lang="en" lang="en">Saturation</dfn>) 就可以了， <code>h1</code> 就只是稍微改變了<dfn>飽和度</dfn>。使用 <acronym title="Hue, Saturation, Lightness" xml:lang="en" lang="en">hsl</acronym> 定義顏色，確實可以讓我們省卻不斷地挑選 <acronym title="Red, Green, Blue" xml:lang="en" lang="en">rgb</acronym> 顏色的麻煩，因為只要決定一個顏色，剩下就由<dfn>亮度</dfn>或<dfn>飽和度</dfn>來調整就可以了。</p>
                <h3>未支援 <code>rgba</code>, <code>hsla</code> 的瀏覽器也想半透明效果</h3>
                <p>未支援具有半透明 <dfn xml:lang="en" lang="en">alpha</dfn> 值<dfn>色彩單位</dfn> (<dfn xml:lang="en" lang="en">color units</dfn>) 的瀏覽器，如果使用 <code>rgba</code>, <code>hsla</code> 指定色彩，只會略過該項定義，但不會因此而影響樣式表 (<dfn xml:lang="en" lang="en">style sheets</dfn>) 裡其它的定義。因此，我們可以另外替未支援的瀏覽器定義一組色彩，以範例一背景定義為例：</p>
                <dl class="samples CodeArea">
                 <dt><code>css</code> 增加定義給未支援瀏覽器</dt>
                 <dd class="DisplayBox CodeBox">
<pre><code>#st1 h1 {
 background: rgb(30%,0%,0%); /*<span class="CodeZh">未支援瀏覽器指定不透明色</span>*/
 background: rgba(30%,0%,0%,0.6);
}
#st1 p {
 background: rgb(0%,10%,20%); /*<span class="CodeZh">未支援瀏覽器指定不透明色</span>*/
 background: rgba(0%,10%,20%,0.6);
}</code></pre>
                 </dd>
                </dl>
                <p>未支援的瀏覽器只會執行第一項不透明顏色的定義，第二項會略過不產生任何影響；對於有支援半透明色彩的瀏覽器，雖然兩項定義都有效，但當然是以最後一項為執行的依據；所以，注意兩項順序顛倒就不會有半透明效果囉。這種作法，至少未支援的瀏覽器不至於結果差距太多。</p>
                <h4>以 <acronym title="Portable Network Graphics" xml:lang="en" lang="en">png</acronym> 格式半透明圖片作為背景</h4>
                <p>未支援的瀏覽器如果也想要有類似前述半透明效果的背景顏色，只要先製作一個很小的 <acronym title="Portable Network Graphics" xml:lang="en" lang="en">png</acronym> 格式的半透明圖片，例如 10×10 <dfn xml:lang="en" lang="en" title="pixel">px</dfn> 不透明度 (<dfn xml:lang="en" lang="en">opacity</dfn>) 70% 的黑色圖片 [圖例下載→ <img src="http://webchain.oreilly.tw/boohover/images/bg_bk70.png" alt="" title="檔名:bg_bk70.png,按右鍵存檔" />] ，然後定義成背景圖片 (<code>background-image</code>)。以範例一的 <code>p</code> 為例：</p>
                <dl class="samples CodeArea">
                 <dt><code>css</code> 改成定義背景為半透明 <acronym title="Portable Network Graphics" xml:lang="en" lang="en">png</acronym> 圖片</dt>
                 <dd class="DisplayBox CodeBox">
<pre><code>#st1 p {
 background: <span class="hilight_1">url(bg_bk70.png)</span>; /*<span class="CodeZh">未支援瀏覽器指定半透明背景圖片</span>*/
 background: rgba(0,0,0,0.7); /*70%<span class="CodeZh">黑色</span>*/
}
</code></pre>
                 </dd>
                </dl>
                <p>第一項除了 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 沒辦法「正確」呈現外，其實較新型瀏覽器 (包括 <a title="造訪Microsoft網站,並可下載免費ie7" href="http://www.microsoft.com/taiwan/windows/ie/downloads/default.mspx"><span xml:lang="en" lang="en">ie</span> 7</a>) 都會有半透明黑色背景，唯一有點不方便的是，如果定義不同顏色的半透明背景，每次都必須製作不同的半透明 <acronym title="Portable Network Graphics" xml:lang="en" lang="en">png</acronym> 圖片。實際上，只需要第一項就可以在各家瀏覽器達到半透明背景的效果了。加上第二項將會更好，因為也可以讓有支援 <dfn xml:lang="en" lang="en">alpha</dfn> 值的瀏覽器直接運用更便利的 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 半透明顏色定義方式，對未來更有幫助，第二項的定義會將背景圖片 (<code>background-image</code>) 變成預設值 <code>none</code> (無)。</p>
                <p><acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 3 的 <a href="http://www.w3.org/TR/css3-color/#transparency" title="造訪W3C網站/英文"><dfn xml:lang="en" lang="en">opacity</dfn></a> 不透明度特性，像這樣 <code>opacity:0.7;</code> ，如果想要運用在此處，其實不是很恰當，因為 <code>opacity</code> 的定義會使整個元素 (<dfn xml:lang="en" lang="en">element</dfn>) 都變成半透明，包括內容裡的文字，如此可能影響閱讀，目前卻有很多人使用這種方法，有點匪夷所思，有興趣可以參閱<a title="造訪 Mozilla Taiwan 網站" href="http://forum.moztw.org/viewtopic.php?t=17011&amp;start=0&amp;postdays=0&amp;postorder=asc&amp;highlight=opacity">久久前的某一個討論</a>，裡面也有提到麻煩的 <code>opacity</code> 處理方式及以下將會提到的 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> <dfn xml:lang="en" lang="en">filter</dfn> 中的 <code>alpha opacity</code>。</p>
                <h4><dfn xml:lang="en" lang="en">filter</dfn> 中的 <code>alpha(opacity)</code> 不透明度指定給 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6</h4>
                <p><acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 就需要用到 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 專用 (<dfn xml:lang="en" lang="en"><acronym title="Internet Explorer">ie</acronym> only</dfn>) 的 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> <a title="造訪Microsoft網站/英文" href="http://msdn.microsoft.com/en-us/library/ms532849.aspx"><dfn xml:lang="en" lang="en">filter</dfn></a> 語法中 <code>alpha</code> 的不透明度 <a title="造訪Microsoft網站/英文" href="http://msdn.microsoft.com/en-us/library/ms532910(VS.85).aspx"><code>opacity</code></a> ，不過這個方法也是整個元素 (<dfn xml:lang="en" lang="en">element</dfn>) 都會半透明呈現，而且元素必須指定 <a href="http://boohover.pixnet.net/blog/post/14187356">hasLayout property</a> ；也由於是特定給 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 的設計，所以最好運用 <a href="http://boohover.pixnet.net/blog/post/8947951"><dfn xml:lang="en" lang="en">css hacks</dfn></a> 技巧：</p>
                <dl class="samples CodeArea">
                 <dt><code>css</code> 接著前例，定義半透明給 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6</dt>
                 <dd class="DisplayBox CodeBox">
<pre><code>* html #st1 p {
 background: rgb(0,0,0); /*<span class="CodeZh">背景黑色，也讓先前指定的背景圖片回復沒有</span>*/
 zoom: 1; /*hasLayout*/
 <span class="hilight_1">filter: progid:DXImageTransform.Microsoft.Alpha(<span class="hilight_2">opacity=70</span>);</span> /*70%<span class="CodeZh">不透明度</span>*/
}
</code></pre>
                 </dd>
                </dl>
                <p>這是 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 專用 (<dfn xml:lang="en" lang="en"><acronym title="Internet Explorer">ie</acronym> only</dfn>) 語法， 所以其實 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 7 也可以用。麻煩的問題是裡面文字內容也半透明了，雖然有一奇特方法， <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 定義其內層元素 (<dfn xml:lang="en" lang="en">element</dfn>) 為 <code>position: relative;</code> 就可讓裡面內容回復成不透明。但是像範例中的 <code>p</code> ，內層沒有可定義的元素 (<dfn xml:lang="en" lang="en">element</dfn>) 也就沒輒了，其實<dfn>部落格</dfn>設計也會遇到沒辦法自己增加<dfn xml:lang="en" lang="en">元素</dfn>的問題。另外，像範例中有捲軸產生捲動內容，但是在 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 如果內層定義成 <code>position: relative;</code> ，該元素 (<dfn xml:lang="en" lang="en">element</dfn>) 就像是「固定」在原位，不會隨捲軸捲動了。所以，指定 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 這個特性時，只能多注意一點囉。</p>
                <h4><acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 也使用半透明 <acronym title="Portable Network Graphics" xml:lang="en" lang="en">png</acronym> 圖片作背景</h4>
                <p>另一種 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 專用 (<dfn xml:lang="en" lang="en"><acronym title="Internet Explorer">ie</acronym> only</dfn>) 的 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> <dfn xml:lang="en" lang="en">filter</dfn> 語法中 <a title="造訪Microsoft網站/英文" href="http://msdn.microsoft.com/en-us/library/ms532969(VS.85).aspx"><code>AlphaImageLoader</code></a> ，可以讓 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 「較正確」呈現半透明 <acronym title="Portable Network Graphics" xml:lang="en" lang="en">png</acronym> 圖片，不過圖片會「插在」背景 (background) 及內容 (<a href="http://boohover.pixnet.net/blog/post/18087970#BoxModel">content</a>) 之間，所以如果原先有指定背景，會變成像似兩個重疊的背景：</p>
                <dl class="samples CodeArea">
                 <dt><code>css</code> 改成「插入」半透明 <acronym title="Portable Network Graphics" xml:lang="en" lang="en">png</acronym> 圖片當背景</dt>
                 <dd class="DisplayBox CodeBox">
<pre><code>* html #st1 p {
 background: <span class="hilight_1">none</span>; /*<span class="CodeZh">先前指定的背景圖片改回沒有</span>*/
 zoom: 1; /*hasLayout*/
 <span class="hilight_1">filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(<span class="hilight_2">src=&quot;bg_bk70.png&quot;,sizingMethod=&quot;scale&quot;</span>);</span>
 /*<span class="CodeZh">插入圖片並縮放至與元素同尺寸</span>*/
}
</code></pre>
                 </dd>
                </dl>
                <p>圖片會由所在元素的 <a href="http://boohover.pixnet.net/blog/post/18087970#BoxNames"><dfn xml:lang="en" lang="en">border box</dfn></a> 左上角開始插入。語法中 <code>filter</code> 內的 <code>src=&quot;bg_bk70.png&quot;</code> (綠字) ，明顯地，雙引號內就是指出圖片檔的位址。而 <code>sizingMethod=&quot;scale&quot;</code> 可以有三種選擇：</p>
                <ul class="RegularList">
                 <li><code><strong>sizingMethod=&quot;image&quot;</strong></code> ：不論所在元素的 <a href="http://boohover.pixnet.net/blog/post/18087970"><dfn xml:lang="en" lang="en">Box</dfn></a> 大小，圖片一律以圖片本身尺寸完整顯示。如果 <dfn xml:lang="en" lang="en">Box</dfn> 尺寸大於圖片， <dfn xml:lang="en" lang="en">Box</dfn> 超過圖片的區域會被「裁掉」不顯示；如果 <dfn xml:lang="en" lang="en">Box</dfn> 尺寸小於圖片， <dfn xml:lang="en" lang="en">Box</dfn> 會保持尺寸，不會增大，而圖片則會「突出」 <dfn xml:lang="en" lang="en">Box</dfn> 範圍。這個定義是預設值，所以沒有 <code>sizingMethod</code> 這段時，仍會套用此定義。</li>
                 <li><code><strong>sizingMethod=&quot;scale&quot;</strong></code> ：圖片會自動依據元素的 <dfn xml:lang="en" lang="en">border box</dfn> 尺寸縮放，所以圖片呈現可能會寬高不等比例變形。</li>
                 <li><code><strong>sizingMethod=&quot;crop&quot;</strong></code> ：圖片會保持圖片本身尺寸，但是圖片超出 <dfn xml:lang="en" lang="en">Box</dfn> 範圍的部分，不會顯示，類似 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 定義背景圖片的呈現方式。</li>
                </ul>
                <p>看起來似乎達到想要的半透明背景效果，也不會讓內容文字也變半透明。這樣的作法只是為了讓原本不能正確呈現的 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 也能有我們想要的效果，嚴格說起來應算是 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 的旁門左道，並非 <acronym title="World Wide Web Consortium" xml:lang="en" lang="en">w3c</acronym> 標準規範。怪的是 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 仍有不可預期的問題，使用時要先有心理準備就是了，像是內容如果包括需要滑鼠感應的元素 (如按鈕、輸入項之類) ，會變成無法執行，又得以 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 指定這類元素 <code>position:relative;</code> 才會作用。</p>
               </div>
               <dl class="resources">
                <dt>參考資源</dt>
                <dd><a title="造訪其他網站" href="http://www.w3.org/TR/css3-color/#colorunits"><span xml:lang="en" lang="en">CSS 3 Color Units</span></a> - <acronym title="World Wide Web Consortium" xml:lang="en" lang="en">w3c</acronym> 官方文件 (英文) 。</dd>
               </dl>
               <div class="others"><span class="copyright">散佈、展示請參閱 <a href="http://creativecommons.org/licenses/by-nc-nd/2.5/tw/" title="造訪創用CC條款"><dfn xml:lang="en" lang="en">Creative Commons</dfn> 授權條文</a>，禁止重混，引述請增加原文連結。</span></div>
  <div class="more"><a href="http://boohover.pixnet.net/blog/post/20556952">(Read More...)</a></div>]]></content:encoded>
      <pubDate>Mon, 28 Jul 2008 06:07:59 +0000</pubDate>
      <category>CSS單位(units),值(value)</category>
      <comments>http://boohover.pixnet.net/blog/post/20556952#comments</comments>
    </item>
    <item>
      <title><![CDATA[Box Model - CSS 框框模型 [2*]]]></title>
      <link>http://boohover.pixnet.net/blog/post/18087970</link>
      <guid>http://boohover.pixnet.net/blog/post/18087970</guid>
      <description><![CDATA[               
                難度：
                適合：有 html 及 css 語法基礎概念者。
                說明：css box model 描述出文件中，元素 (elements) 所形成的最基本矩形區域 (boxes) 及專有名詞；此為呈現視覺性 (visual) 版面的重要基礎。
                更新：2008-05-27
               
               Box Model (框框模型) 是什麼？
               
                
               
               只要有東西在版面上描繪 (可以把版面想成一張空白的紙) ，就一定會佔有版面上某些空間，縱使是一個字，也至少就佔了一個字的矩形區域，而這樣的區域被定義為「框」 (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 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
                 &lt;p&gt;
                  看到竹子想到王陽明。看到桃花想到桃花源記。看到蓮花想到周敦頤。&lt;em&gt;看到荷花想到何仙姑。看到玫瑰想到愛神。看到菊花想到陶淵明。&lt;/em&gt;看到百合想到香水。～節錄自 monica 「聯想的遊戲」 
                  &lt;/p&gt;
                
                元素 p 代表段落，一般以區塊層級 (block-level) 方式呈現，會是一個「獨立」的矩形 box ，可特別稱為 block boxes (圖中綠線) 。而 p 所包含的「內容」 (content) 可想像成，由「三節」行內層級 (inline-level) 或文字層級 (text-level) 的文字組成，三個行內層級元素 (inline-level emements) 當然都有自己的 box ，可特別稱為 inline boxes ，以一個個「自動緊接」的方式呈現，與 block boxes 圍成「一區」的矩形不盡相同。
                
                 看到竹子想到王陽明。看到桃花想到桃花源記。看到蓮花想到周敦頤。
                 &lt;em&gt;看到荷花想到何仙姑。看到玫瑰想到愛神。看到菊花想到陶淵明。&lt;/em&gt;
                 看到百合想到香水。～節錄自 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 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) 所決定，而高度則由 css line-height 或 vertical-align 的定義來決定。
                多重的 block boxes 像洋葱一層包著一層
                實際上，每一個區塊層級元素 (block-level elements) ，必然會由另一個區塊層級元素包圍，根元素除外 (root element, html 文件指的就是 html 元素) ，所以，許多個 block boxes 一層一層包圍起來時就好似洋葱的構造。
                
                 例如 xhtml
                 &lt;blockquote&gt;
                  &lt;h1&gt;聯想的遊戲&lt;/h1&gt;
                  &lt;p&gt;看到三國演義想到七俠五義。看到紅樓夢想到牡丹亭。看到山海經想到鏡花緣。看到芭蕉扇想到鐵扇公主。看到豬八戒想到沙悟淨。看到孫悟空想到如來佛。看到史記想到司馬遷。看到船想到孔明借箭。看到滿山秋色想到最愛的詩人王維。看到赤子純真一般的畫想到豐子愷。看到李叔同想到大護法夏丏尊。～節錄自 monica 「聯想的遊戲」&lt;/p&gt;
                  &lt;/blockquote&gt;
                
                
                 
                
                很明顯地， h1, p, blockquote 都是區塊層級元素。 h1 與 p 的「內容」 (content) 僅包含著行內層級的元素，就像前面一樣，兩者各自擁有矩形的 block box ，也都可以各自指定 padding, border, margin (圖中紅線) 。而 blockquote 從外包圍著 h1 與 p ， h1 與 p 成了 blockquote 的「內容」 (content) ； blockquote 形成另一個 block box (圖中綠線) ，當然也可以指定 box 的各項數值。
               
               
                參考資源
                CSS basic box model - w3c 官方文件 (英文) 。
               
               散佈、展示請參閱 Creative Commons 授權條文，禁止重混，引述請增加原文連結。
]]></description>
      <content:encoded><![CDATA[               <ul class="adapt">
                <li>難度：<img class="grade" src="http://webchain.oreilly.tw/boohover/images/ic005_2.png" alt="等級2" title="分成1~5等級，愈大難度愈高。" /></li>
                <li>適合：有 <acronym title="HyperText Markup Language" xml:lang="en" lang="en">html</acronym> 及 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 語法基礎概念者。</li>
                <li>說明：<acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> <dfn xml:lang="en" lang="en">box model</dfn> 描述出文件中，元素 (<dfn xml:lang="en" lang="en">elements</dfn>) 所形成的最基本矩形區域 (<dfn xml:lang="en" lang="en">boxes</dfn>) 及專有名詞；此為呈現視覺性 (<span xml:lang="en" lang="en">visual</span>) 版面的重要基礎。</li>
                <li class="latest">更新：<span class="num date">2008-05-27</span></li>
               </ul>
               <h2 id="BoxModel"><dfn xml:lang="en" lang="en">Box Model</dfn> (框框模型) 是什麼？</h2>
               <div class="IllusBox">
                <div class="illus illus1" style="background-image:url(http://webchain.oreilly.tw/boohover/images/BoxModel.png); width:720px; height:440px;"></div>
               </div>
               <p>只要有東西在版面上描繪 (可以把版面想成一張空白的紙) ，就一定會佔有版面上某些空間，縱使是一個字，也至少就佔了一個字的矩形區域，而這樣的區域被定義為「<dfn>框</dfn>」 (<dfn xml:lang="en" lang="en">boxes</dfn>) 。</p>
               <p>文件內某「一個」元素的「框」 (<dfn xml:lang="en" lang="en">box</dfn>) 可由四個層疊的 (<span xml:lang="en" lang="en">nested</span>) 區域所組成：該元素所包含的「內容」 (不論是單純的文字，或是其它元素) 形成最內層的區域，就是 <dfn xml:lang="en" lang="en">content area</dfn> (內容區) ，依序向外一層一層圍繞為 <span xml:lang="en" lang="en"><dfn>padding area</dfn>, <dfn>border area</dfn>, <dfn>margin area</dfn></span> (補距區 - 邊線區 - 邊距區) 。</p>
               <p>區與區之間可分別由 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 指定 <a href="http://www.w3.org/TR/CSS21/box.html#padding-properties" title="造訪W3C網站/英文"><code>padding</code></a>, <a href="http://www.w3.org/TR/CSS21/box.html#border-properties" title="造訪W3C網站/英文"><code>border</code></a>, <a href="http://www.w3.org/TR/CSS21/box.html#margin-properties" title="造訪W3C網站/英文"><code>margin</code></a> 特性 (<dfn xml:lang="en" lang="en">property</dfn>) 來改變相互的距離，而每種特性定義都有上下左右四向，可由版面設計者指定各不相同的距離 (說成是厚度、寬度也可以) ，當然也可以沒有距離，運用這樣的概念進而改變版面上整組 <dfn xml:lang="en" lang="en">box</dfn> 的尺寸及呈現。</p>
               <p>由內向外四個區都各自有「四邊」形成緊鄰的框，標準的名稱依序為：</p>
               <dl id="BoxNames">
                <dt><span xml:lang="en" lang="en"><dfn>content edge</dfn> or <dfn>inner edge</dfn></span> (內緣-圖中綠線)</dt>
                <dd>具有寬 (<a href="http://www.w3.org/TR/CSS21/visudet.html#propdef-width" title="造訪W3C網站/英文"><code>width</code></a>) 及高 (<a href="http://www.w3.org/TR/CSS21/visudet.html#propdef-height" title="造訪W3C網站/英文"><code>height</code></a>) 的 <dfn xml:lang="en" lang="en">content area</dfn> 四邊，與 <dfn xml:lang="en" lang="en">padding area</dfn> 交界處；四邊圍成的區域稱為 <dfn xml:lang="en" lang="en" class="hilight_3">content box</dfn> 。</dd>
                <dt><dfn xml:lang="en" lang="en">padding edge</dfn> (補距外緣-圖中紅線)</dt>
                <dd><dfn xml:lang="en" lang="en">padding area</dfn> 四邊，與 <dfn xml:lang="en" lang="en">border area</dfn> 交界處；四邊圍成的區域稱為 <dfn xml:lang="en" lang="en" class="hilight_3">padding box</dfn> 。</dd>
                <dt><dfn xml:lang="en" lang="en">border edge</dfn> (邊線外緣-圖中藍線)</dt>
                <dd><dfn xml:lang="en" lang="en">border area</dfn> 四邊，與 <dfn xml:lang="en" lang="en">margin area</dfn> 交界處；四邊圍成的區域稱為 <dfn xml:lang="en" lang="en" class="hilight_3">border box</dfn> 。</dd>
                <dt><span xml:lang="en" lang="en"><dfn>margin edge</dfn> or <dfn>outer edge</dfn></span> (框外緣-圖中深灰線)</dt>
                <dd><dfn xml:lang="en" lang="en">margin area</dfn> 四邊，也是整個框 (<dfn xml:lang="en" lang="en">box</dfn>) 的最外緣；四邊圍成的區域稱為 <dfn xml:lang="en" lang="en" class="hilight_3">margin box</dfn> 。</dd>
               </dl>
               <p>對 <dfn xml:lang="en" lang="en">margin box</dfn> 來說，永遠呈現透明 (因此能看到其背後的內容)；在元素上定義背景 (<a href="http://www.w3.org/TR/CSS21/colors.html#background" title="造訪W3C網站/英文"><code>background</code></a>) 呈現在 <dfn xml:lang="en" lang="en">border box</dfn>, <dfn xml:lang="en" lang="en">padding box</dfn>, 及 <dfn xml:lang="en" lang="en">content box</dfn> 的區域內。而 <dfn xml:lang="en" lang="en">content box</dfn> 的「內容」當然是呈現在背景的前面。</p>
               <div class="comments">
                <h2>思考 - <dfn xml:lang="en" lang="en">Box Model</dfn> 與 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 版面視覺設計</h2>
                <p><dfn xml:lang="en" lang="en">Box</dfn> 在版面編排上可以說是無所不在，就算「內容」 (<a href="#BoxModel" xml:lang="en" lang="en">content</a>) 是單單一個字都具有 <dfn xml:lang="en" lang="en">box</dfn>，佔有一小塊矩形區域；當然，也能由 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 個別指定不同的 <code>padding</code>, <code>border</code>, <code>margin</code>。如果 <code>padding</code>, <code>border</code>, <code>margin</code> 的距離都是「零」，那麼當然， <dfn xml:lang="en" lang="en">padding box</dfn>, <dfn xml:lang="en" lang="en">border box</dfn>, <dfn xml:lang="en" lang="en">margin box</dfn> 的大小就會與 <dfn xml:lang="en" lang="en">content box</dfn> 所擁有的寬高一樣。</p>
                <div class="IllusBox">
                 <div class="illus illus1" style="background-image:url(http://webchain.oreilly.tw/boohover/images/BoxModel_illus1.png); width:600px; height:400px;"></div>
                </div>
                <p>許許多多字的 <dfn xml:lang="en" lang="en">Box</dfn> 就如同「堆積木」，一個個相鄰著由上而下堆疊起來 (書寫方向為由左向右、由上至下時)，將內容有規則地分布在版面上，而這個規則就是設計者以 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 定義的呈現方式。</p>
                <h3 id="BoxBlockInline"><dfn>行內層級</dfn> (<dfn xml:lang="en" lang="en">inline-level</dfn>) 與<dfn>區塊層級</dfn> (<dfn xml:lang="en" lang="en">block-level</dfn>) 呈現模式不同 </h3>
                <p>許多的「字」結合起來可以產生「段落」，段落則再形成更大的矩形 <dfn xml:lang="en" lang="en">box</dfn> ，將文字圍繞起來。</p>
                <dl class="samples CodeArea">
                 <dt>例如 <code>xhtml</code></dt>
                 <dd class="DisplayBox CodeBox"><code>&lt;p&gt;<br />
                  看到竹子想到王陽明。看到桃花想到桃花源記。看到蓮花想到周敦頤。&lt;em&gt;看到荷花想到何仙姑。看到玫瑰想到愛神。看到菊花想到陶淵明。&lt;/em&gt;看到百合想到香水。～節錄自 monica 「聯想的遊戲」 <br />
                  &lt;/p&gt;</code></dd>
                </dl>
                <p>元素 <code>p</code> 代表段落，一般以<dfn>區塊層級</dfn> (<a href="http://www.w3.org/TR/CSS21/visuren.html#block-boxes" title="造訪W3C網站/英文"><dfn xml:lang="en" lang="en">block-level</dfn></a>) 方式呈現，會是一個「獨立」的矩形 <dfn xml:lang="en" lang="en">box</dfn> ，可特別稱為 <dfn xml:lang="en" lang="en">block boxes</dfn> (圖中綠線) 。而 <code>p</code> 所包含的「內容」 (<a href="#BoxModel" xml:lang="en" lang="en">content</a>) 可想像成，由「三節」<dfn>行內層級</dfn> (<a href="http://www.w3.org/TR/CSS21/visuren.html#inline-boxes" title="造訪W3C網站/英文"><dfn xml:lang="en" lang="en">inline-level</dfn></a>) 或<dfn>文字層級</dfn> (<dfn xml:lang="en" lang="en">text-level</dfn>) 的文字組成，三個<dfn>行內層級元素</dfn> (<dfn xml:lang="en" lang="en">inline-level emements</dfn>) 當然都有自己的 <dfn xml:lang="en" lang="en">box</dfn> ，可特別稱為 <dfn xml:lang="en" lang="en">inline boxes</dfn> ，以一個個「自動緊接」的方式呈現，與 <dfn xml:lang="en" lang="en">block boxes</dfn> 圍成「一區」的矩形不盡相同。</p>
                <ol>
                 <li>看到竹子想到王陽明。看到桃花想到桃花源記。看到蓮花想到周敦頤。</li>
                 <li>&lt;em&gt;看到荷花想到何仙姑。看到玫瑰想到愛神。看到菊花想到陶淵明。&lt;/em&gt;</li>
                 <li>看到百合想到香水。～節錄自 monica 「聯想的遊戲」</li>
                </ol>
                <div class="IllusBox">
                 <div class="illus illus1" style="background-image:url(http://webchain.oreilly.tw/boohover/images/BoxModel_illus2.png); width:600px; height:400px;"></div>
                </div>
                <p>1 與 3 只是文字，屬於<dfn>文字層級</dfn> (<dfn xml:lang="en" lang="en">text-level</dfn>) 元素，雖然有「自然產生」的 <dfn xml:lang="en" lang="en">inline boxes</dfn> ，不過由於沒有賦予特定的元素名稱，也可稱為「不具名 (<span xml:lang="en" lang="en">anonymous</span>) 元素」，所以無法經由 <a href="http://www.w3.org/TR/CSS21/selector.html" title="造訪W3C網站/英文"><dfn xml:lang="en" lang="en">css selectors</dfn></a> 為其指定 <code>padding</code>, <code>border</code>, <code>margin</code> 等；而 2 因為已被指定成 <code>em</code> 元素 (<dfn>行內層級元素</dfn>) ，就可以由設計者定義。</p>
                <p><dfn>行內層級元素</dfn>無法容納在一行內時， <dfn xml:lang="en" lang="en">inline boxes</dfn> 就會拆斷成二行或是數行，範例中的 em 元素就可能拆成二行或是三行的矩形框 (圖中藍線)，不再是標準的一塊矩形而已了。 <dfn xml:lang="en" lang="en">inline boxes</dfn> 的「左邊」在該元素第一行起始的左方，「右邊」在最末行結尾的右方，所以如果指定「左或右」的 <code>padding</code>, <code>border</code>, <code>margin</code> 時，只會在第一行和最末行作用，不會在各分行的「拆斷處」產生；指定「上或下」會在各行產生 (當然，依據 <a href="http://www.w3.org/TR/CSS21/box.html#margin-properties" title="造訪W3C網站/英文"><code>margin</code></a> 規則，定義「上或下」不會作用在「不可替換」行內元素 (<a href="http://www.w3.org/TR/REC-CSS2/conform.html#replaced-element" title="造訪W3C網站/英文"><dfn xml:lang="en" lang="en">non-replaced inline elements</dfn></a>) 。</p>
                <h3 id="LineBox">抽象的 <dfn xml:lang="en" lang="en">line box</dfn> 因 <dfn xml:lang="en" lang="en">inline boxes</dfn> 而產生</h3>
                <p><dfn xml:lang="en" lang="en">line box</dfn> 像是抽屜，也像骨架一般，將<dfn>行內元素</dfn>分成一層一層「收納」，如前例 (圖中紅線)，一層放不下就會轉到下一層。通常會看到行與行之間其實會有些許的空隙，不只是「字」的高度而已，這就是 <dfn xml:lang="en" lang="en">line box</dfn> 這個抽屜的高度，並不是 <dfn xml:lang="en" lang="en">inline box</dfn> 的高度。所以，實際上 <dfn xml:lang="en" lang="en">inline boxes</dfn> 是存在於一行一行抽象的 <dfn xml:lang="en" lang="en">line box</dfn> 裡，而 <dfn xml:lang="en" lang="en">line box</dfn> 一行行疊成<dfn>區塊層級元素</dfn> (如前例的 <code>p</code>) 。 <dfn xml:lang="en" lang="en">line box</dfn> 由上向下，一行緊鄰著一行，而且永遠不會相互重疊。 </p>
                <p><a href="http://www.w3.org/TR/CSS21/visuren.html#line-box" title="造訪W3C網站/英文"><dfn xml:lang="en" lang="en">line box</dfn></a> 與前面所講的 <dfn xml:lang="en" lang="en">box</dfn> 不同， <dfn xml:lang="en" lang="en">line box</dfn> 是因<dfn>行內元素</dfn>所產生的抽象空間，只是<dfn>區塊層級元素</dfn> (<dfn xml:lang="en" lang="en">block-level elements</dfn>) 的 <dfn xml:lang="en" lang="en">box model</dfn> 一部分而已，不是真實的元素，所以也不可能為其指定 <dfn xml:lang="en" lang="en">box</dfn> 的各項數值 (如 <code>width</code>, <code>height</code>, <code>padding</code>, <code>border</code>, <code>margin</code> 等) 。 <dfn xml:lang="en" lang="en">line box</dfn> 的寬度根據其容納區 (<a href="http://www.w3.org/TR/CSS21/visudet.html#containing-block-details" title="造訪W3C網站/英文"><dfn xml:lang="en" lang="en">containing block</dfn></a>) 所決定，而高度則由 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> <a href="http://www.w3.org/TR/CSS21/visudet.html#propdef-line-height" title="造訪W3C網站/英文"><code>line-height</code></a> 或 <a href="http://www.w3.org/TR/CSS21/visudet.html#propdef-vertical-align" title="造訪W3C網站/英文"><code>vertical-align</code></a> 的定義來決定。</p>
                <h3 id="BoxBlock">多重的 <dfn xml:lang="en" lang="en">block boxes</dfn> 像洋葱一層包著一層</h3>
                <p>實際上，每一個<dfn>區塊層級元素</dfn> (<dfn xml:lang="en" lang="en">block-level elements</dfn>) ，必然會由另一個<dfn>區塊層級元素</dfn>包圍，<dfn>根元素</dfn>除外 (<a href="http://www.w3.org/TR/CSS21/conform.html#doctree" title="造訪W3C網站/英文"><dfn xml:lang="en" lang="en">root element</dfn></a>, <acronym title="HyperText Markup Language" xml:lang="en" lang="en">html</acronym> 文件指的就是 <code>html</code> 元素) ，所以，許多個 <dfn xml:lang="en" lang="en">block boxes</dfn> 一層一層包圍起來時就好似洋葱的構造。</p>
                <dl class="samples CodeArea">
                 <dt>例如 <code>xhtml</code></dt>
                 <dd class="DisplayBox CodeBox"><code>&lt;blockquote&gt;<br />
                  &lt;h1&gt;聯想的遊戲&lt;/h1&gt;<br />
                  &lt;p&gt;看到三國演義想到七俠五義。看到紅樓夢想到牡丹亭。看到山海經想到鏡花緣。看到芭蕉扇想到鐵扇公主。看到豬八戒想到沙悟淨。看到孫悟空想到如來佛。看到史記想到司馬遷。看到船想到孔明借箭。看到滿山秋色想到最愛的詩人王維。看到赤子純真一般的畫想到豐子愷。看到李叔同想到大護法夏丏尊。～節錄自 monica 「聯想的遊戲」&lt;/p&gt;<br />
                  &lt;/blockquote&gt;</code></dd>
                </dl>
                <div class="IllusBox">
                 <div class="illus illus1" style="background-image:url(http://webchain.oreilly.tw/boohover/images/BoxModel_illus3.png); width:600px; height:400px;"></div>
                </div>
                <p>很明顯地， <code>h1</code>, <code>p</code>, <code>blockquote</code> 都是<dfn>區塊層級元素</dfn>。 <code>h1</code> 與 <code>p</code> 的「內容」 (<a href="#BoxModel" xml:lang="en" lang="en">content</a>) 僅包含著<dfn>行內層級</dfn>的元素，就像前面一樣，兩者各自擁有矩形的 <dfn xml:lang="en" lang="en">block box</dfn> ，也都可以各自指定 <code>padding</code>, <code>border</code>, <code>margin</code> (圖中紅線) 。而 <code>blockquote</code> 從外包圍著 <code>h1</code> 與 <code>p</code> ， <code>h1</code> 與 <code>p</code> 成了 <code>blockquote</code> 的「內容」 (<dfn xml:lang="en" lang="en">content</dfn>) ； <code>blockquote</code> 形成另一個 <dfn xml:lang="en" lang="en">block box</dfn> (圖中綠線) ，當然也可以指定 <dfn xml:lang="en" lang="en">box</dfn> 的各項數值。</p>
               </div>
               <dl class="resources">
                <dt>參考資源</dt>
                <dd><a title="造訪其他網站" href="http://www.w3.org/TR/css3-box/"><span xml:lang="en" lang="en">CSS basic box model</span></a> - <acronym title="World Wide Web Consortium" xml:lang="en" lang="en">w3c</acronym> 官方文件 (英文) 。</dd>
               </dl>
               <div class="others"><span class="copyright">散佈、展示請參閱 <a href="http://creativecommons.org/licenses/by-nc-nd/2.5/tw/" title="造訪創用CC條款"><dfn xml:lang="en" lang="en">Creative Commons</dfn> 授權條文</a>，禁止重混，引述請增加原文連結。</span></div>
  <div class="more"><a href="http://boohover.pixnet.net/blog/post/18087970">(Read More...)</a></div>]]></content:encoded>
      <pubDate>Tue, 27 May 2008 07:59:31 +0000</pubDate>
      <category>CSS box, block, inline</category>
      <comments>http://boohover.pixnet.net/blog/post/18087970#comments</comments>
    </item>
    <item>
      <title><![CDATA[ie hasLayout property - 終結 ie bugs 之「有編置」性質(ie only) [4*]]]></title>
      <link>http://boohover.pixnet.net/blog/post/14187356</link>
      <guid>http://boohover.pixnet.net/blog/post/14187356</guid>
      <description><![CDATA[              
               難度：
               適合：有 html 及 css 語法撰寫基礎者。
               說明： ie 專有用法 (ie only)。部分 ie 專有的特性 (property) ，如 filters and transitions ，有作用的必要條件就是指定 hasLayout 性質。 hasLayout 性質本來是微軟為了補救 ie 內部不完善所自創的，並非 w3c 標準，所以有時用起來覺得相當無厘頭。但神奇地， ie 衍生的網頁不正常呈現問題 (ie bugs)，大多數竟可由指定 hasLayout 來解決。
               更新：2008-02-18
              
              為物件指定 hasLayout property
              hasLayout &quot;property&quot; 和 css property 雖然英文名稱一樣，但實際上不太相同。 hasLayout 本身並非 css 特性的一種，所以沒辦法直接定義物件的 css 特性 hasLayout 的值 (value)，而是間接以其它的 css 特性指定在物件上，使該物件符合 hasLayout ，所以我比較傾向稱它是 hasLayout 「性質」。
              
               符合以下任一種 css 特性及值的定義方式，物件即是 hasLayout (有編置) ：
               
                
                 height: auto; (預設值) 以外的值 [參閱 CSS 特性]
                 width: auto; (預設值) 以外的值 [參閱 CSS 特性]
                 float: none; (預設值) 以外的值 [參閱 CSS 特性]
                 position: absolute; [參閱 CSS 特性]
                 display: inline-block; [參閱 CSS 特性]
                 zoom: normal; (預設值) 以外的值 [參閱 CSS 特性]
                 writing-mode: tb-rl; [參閱 CSS 特性]
                
               
               ie 7 增加了幾個新的指定方式：
               
                
                 min-height: ?; 任何長度值 [參閱 CSS 特性]
                 max-height: none; (預設值) 以外的值 [參閱 CSS 特性]
                 min-width: ?; 任何長度值 [參閱 CSS 特性]
                 max-width: none; (預設值) 以外的值 [參閱 CSS 特性]
                 overflow: visible (預設值) 以外的值 [參閱 CSS 特性]
                 overflow-x: visible (預設值) 以外的值 [參閱 CSS 特性]
                 overflow-y: visible (預設值) 以外的值 [參閱 CSS 特性]
                 position: fixed; [參閱 CSS 特性]
                
               
              
              認識 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 有效，只是 &quot;fixed&quot; 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 為 css3 的規則，撰文時僅 ie 及 firefox 支援。
              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
               &lt;div id=&quot;main&quot;&gt;
                &nbsp;&lt;p&gt;漁舟逐水愛山春，兩岸桃花夾去津。坐看紅樹不知遠，行盡青溪不見人。&lt;/p&gt;
                &nbsp;&lt;p&gt;山口潛行始隈隩，山開曠望旋平陸。遙看一處攢雲樹，近入千家散花竹。&lt;/p&gt;
                &nbsp;&lt;p class=&quot;extract&quot;&gt;節錄自：王維的桃源行&lt;/p&gt;
                &lt;/div&gt;
               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 標準，所以沒有把它列在上述卸除規則。
              
               思考 - hasLayout 與 css hacks 拯救 ie bugs
               本篇一開始就提到，為物件指定 hasLayout 性質就可以修復很多 ie 令人噴飯的 css bugs (hasLayout 大部分可修復背景不正常及 position 特性位移等問題) ，有幾種目前公認穩定又好的方式，但是有時必須搭配 CSS hacks ，才可以在不同瀏覽器正常地呈現，而如果需要通過 W3C validation ，用到非 w3c 標準語法時就需要運用 Conditional Comments 把語法隔離起來。
               
                xhtml
                &lt;div id=&quot;main&quot; class=&quot;hasLayout&quot;&gt;
                &nbsp;&lt;h2&gt;早梅  張謂&lt;/h2&gt;
                &nbsp;&lt;p&gt;一樹寒梅白玉條，迥臨村路傍溪橋。不知近水花先發，疑是經冬雪未銷。&lt;/p&gt;
                &lt;/div&gt;
                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
                &lt;div id=&quot;nav&quot;&gt;
                &lt;ul&gt;
                &nbsp;&lt;li&gt;&lt;a href=&quot;#&quot;&gt;王維-陽關曲&lt;/a&gt;&lt;/li&gt;
                &nbsp;&lt;li&gt;&lt;a href=&quot;#&quot;&gt;張謂-早梅&lt;/a&gt;&lt;/li&gt;
                &nbsp;&lt;li&gt;&lt;a href=&quot;#&quot;&gt;杜甫-客至&lt;/a&gt;&lt;/li&gt;
                &lt;/ul&gt;
                &lt;/div&gt;
                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 ，才是網頁設計者應有的態度。
              
              
               參考資源
               
                
                 msdn hasLayout Property - Microsoft 官方文件 (英文) 。
                 On having layout - 完整研討，內容較繁長，已有譯成多種語言。
                 hasLayout by Zoffix Znet - 較精簡解說 (英文) 。
                
               
              
              散佈、展示請參閱 Creative Commons 授權條文，禁止重混，引述請增加原文連結。
]]></description>
      <content:encoded><![CDATA[              <ul class="adapt">
               <li>難度：<img class="grade" src="http://webchain.oreilly.tw/boohover/images/ic005_4.png" alt="等級4" title="分成1~5等級，愈大難度愈高。" style="zoom:1;" /></li>
               <li>適合：有 <acronym title="HyperText Markup Language" xml:lang="en" lang="en">html</acronym> 及 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 語法撰寫基礎者。</li>
               <li>說明： <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 專有用法 (<dfn xml:lang="en" lang="en"><acronym title="Internet Explorer">ie</acronym> only</dfn>)。部分 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 專有的特性 (<dfn xml:lang="en" lang="en">property</dfn>) ，如 <a title="造訪微軟網站/英文" href="http://msdn.microsoft.com/en-us/library/ms532849.aspx"><code>filters and transitions</code></a> ，有作用的必要條件就是指定 <code>hasLayout</code> 性質。 <code>hasLayout</code> 性質本來是微軟為了補救 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 內部不完善所自創的，並非 <acronym title="World Wide Web Consortium" xml:lang="en" lang="en">w3c</acronym> 標準，所以有時用起來覺得相當無厘頭。但神奇地， <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 衍生的網頁不正常呈現問題 (<dfn xml:lang="en" lang="en"><acronym title="Internet Explorer">ie</acronym> bugs</dfn>)，大多數竟可由指定 <code>hasLayout</code> 來解決。</li>
               <li class="latest">更新：<span class="num date">2008-02-18</span></li>
              </ul>
              <h2>為物件指定 <code>hasLayout</code> <span xml:lang="en" lang="en">property</span></h2>
              <p><code>hasLayout</code> &quot;<dfn xml:lang="en" lang="en">property</dfn>&quot; 和 <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> property</dfn> 雖然英文名稱一樣，但實際上不太相同。 <code>hasLayout</code> 本身並非 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 特性的一種，所以沒辦法直接定義物件的 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 特性 <code>hasLayout</code> 的值 (<dfn xml:lang="en" lang="en">value</dfn>)，而是間接以其它的 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 特性指定在物件上，使該物件符合 <code>hasLayout</code> ，所以我比較傾向稱它是 <code>hasLayout</code> 「性質」。</p>
              <dl class="method CodeArea">
               <dt>符合以下任一種 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 特性及值的定義方式，物件即是 <code>hasLayout</code> (<dfn>有編置</dfn>) ：</dt>
               <dd class="DisplayBox CodeBox">
                <ul class="RegularList">
                 <li><code>height: auto;</code> (預設值) 以外的值 [<a class="prompt" title="造訪W3C網站/英文" href="http://www.w3.org/TR/CSS21/visudet.html#propdef-height">參閱 <span xml:lang="en" lang="en">CSS</span> 特性</a>]</li>
                 <li><code>width: auto;</code> (預設值) 以外的值 [<a class="prompt" title="造訪W3C網站/英文" href="http://www.w3.org/TR/CSS21/visudet.html#propdef-width">參閱 <span xml:lang="en" lang="en">CSS</span> 特性</a>]</li>
                 <li><code>float: none;</code> (預設值) 以外的值 [<a class="prompt" title="造訪W3C網站/英文" href="http://www.w3.org/TR/CSS21/visuren.html#propdef-float">參閱 <span xml:lang="en" lang="en">CSS</span> 特性</a>]</li>
                 <li><code>position: absolute;</code> [<a class="prompt" title="造訪W3C網站/英文" href="http://www.w3.org/TR/CSS21/visuren.html#propdef-position">參閱 <span xml:lang="en" lang="en">CSS</span> 特性</a>]</li>
                 <li><code>display: inline-block;</code> [<a class="prompt" title="造訪W3C網站/英文" href="http://www.w3.org/TR/CSS21/visuren.html#propdef-display">參閱 <span xml:lang="en" lang="en">CSS</span> 特性</a>]</li>
                 <li><code>zoom: normal;</code> (預設值) 以外的值 [<a class="prompt" title="造訪微軟網站/英文" href="http://msdn.microsoft.com/en-us/library/ms531189(VS.85).aspx">參閱 <span xml:lang="en" lang="en">CSS</span> 特性</a>]</li>
                 <li><code>writing-mode: tb-rl;</code> [<a class="prompt" title="造訪W3C網站/英文" href="http://www.w3.org/TR/2003/CR-css3-text-20030514/#writing-mode">參閱 <span xml:lang="en" lang="en">CSS</span> 特性</a>]</li>
                </ul>
               </dd>
               <dt><acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 7 增加了幾個新的指定方式：</dt>
               <dd class="DisplayBox CodeBox">
                <ul class="RegularList">
                 <li><code>min-height: ?;</code> 任何長度值 [<a class="prompt" title="造訪W3C網站/英文" href="http://www.w3.org/TR/CSS21/visudet.html#propdef-min-height">參閱 <span xml:lang="en" lang="en">CSS</span> 特性</a>]</li>
                 <li><code>max-height: none;</code> (預設值) 以外的值 [<a class="prompt" title="造訪W3C網站/英文" href="http://www.w3.org/TR/CSS21/visudet.html#propdef-max-height">參閱 <span xml:lang="en" lang="en">CSS</span> 特性</a>]</li>
                 <li><code>min-width: ?;</code> 任何長度值 [<a class="prompt" title="造訪W3C網站/英文" href="http://www.w3.org/TR/CSS21/visudet.html#propdef-min-width">參閱 <span xml:lang="en" lang="en">CSS</span> 特性</a>]</li>
                 <li><code>max-width: none;</code> (預設值) 以外的值 [<a class="prompt" title="造訪W3C網站/英文" href="http://www.w3.org/TR/CSS21/visudet.html#propdef-max-width">參閱 <span xml:lang="en" lang="en">CSS</span> 特性</a>]</li>
                 <li><code>overflow: visible</code> (預設值) 以外的值 [<a class="prompt" title="造訪W3C網站/英文" href="http://www.w3.org/TR/CSS21/visufx.html#propdef-overflow">參閱 <span xml:lang="en" lang="en">CSS</span> 特性</a>]</li>
                 <li><code>overflow-x: visible</code> (預設值) 以外的值 [<a class="prompt" title="造訪W3C網站/英文" href="http://www.w3.org/TR/css3-box/#overflow1">參閱 <span xml:lang="en" lang="en">CSS</span> 特性</a>]</li>
                 <li><code>overflow-y: visible</code> (預設值) 以外的值 [<a class="prompt" title="造訪W3C網站/英文" href="http://www.w3.org/TR/css3-box/#overflow1">參閱 <span xml:lang="en" lang="en">CSS</span> 特性</a>]</li>
                 <li><code>position: fixed;</code> [<a class="prompt" title="造訪W3C網站/英文" href="http://www.w3.org/TR/CSS21/visuren.html#propdef-position">參閱 <span xml:lang="en" lang="en">CSS</span> 特性</a>]</li>
                </ul>
               </dd>
              </dl>
              <h3>認識 <code>hasLayout</code> 的 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 規則</h3>
              <p>上述規則有的看起來有點含糊，有的好像又很陌生，那要怎麼正確定義物件 <code>hasLayout</code> 呢？</p>
              <p><code>height</code> 或 <code>width</code> 特性只需要指定一個「具體值」 <code>hasLayout</code> 就有效了，如 <code>width:80%;</code> ，甚至 <code>height:0;</code> 也可以喲。 <code>min-height, max-height, min-width, max-width</code> 等特性也可以如法炮製，如 <code>max-width:100em;</code> 或是 <code>min-height:0;</code>。需要注意的是依據 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 規則，這類特性在行內層級 (<a title="造訪W3C網站/英文" href="http://boohover.pixnet.net/blog/post/18087970#BoxBlockInline"><dfn xml:lang="en" lang="en">inline-level</dfn></a>) 元素不會有作用。</p>
              <p><code>float</code> 特性通常有 <code>float:left;</code> 或 <code>float:right;</code> 二種值都可以達成 <code>hasLayout</code>。</p>
              <p><code>position:absolute;</code> 及 <code>position:fixed;</code> 算是同類型的定義，二者都能使 <code>hasLayout</code> 有效，只是 &quot;<code>fixed</code>&quot; <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 沒支援。</p>
              <p><code>zoom</code> 特性看名稱就知道是縮放大小，像 <code>height</code> 之類一樣，只要有「具體值」 <code>hasLayout</code> 就有效了，而且<dfn>行內層級元素</dfn>也能作用，如 <code>zoom:0.9;</code> 。撰文時這個特性僅為 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 專用 (<dfn xml:lang="en" lang="en"><acronym title="Internet Explorer">ie</acronym> only</dfn>) ，非 <acronym title="World Wide Web Consortium" xml:lang="en" lang="en">w3c</acronym> 標準，所以非 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 瀏覽器 (<span xml:lang="en" lang="en"><dfn>firefox</dfn>, <dfn>opera</dfn>, <dfn>safari</dfn></span>, …) 沒有支援也就不會有任何影響。</p>
              <p>指定 <code>overflow</code> 特性通常有 <code>overflow:auto;</code>, <code>overflow:hidden;</code> 或 <code>overflow:scroll;</code> 三種值，雖然 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 有支援，不過目前只有 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 7 會讓 <code>hasLayout</code> 有效。而 <code>overflow-x</code> 及 <code>overflow-y</code> 為 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym>3 的規則，撰文時僅 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 及 <dfn xml:lang="en" lang="en">firefox</dfn> 支援。</p>
              <p><code>writing-mode</code> 特性也是 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym>3 的規則，比較少會用這個特性指定 <code>hasLayout</code> ，撰文時也僅 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 支援。</p>
              <p>物件原則上預設都是不具 <code>hasLayout</code> 性質，所以我們才需要特別指定 <code>hasLayout</code> ，但是有部分元素在 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 預先就已內定永遠為 <code>hasLayout</code> ，明細可參閱 <a title="造訪其他網站/英文" href="http://msdn.microsoft.com/en-us/library/ms533776.aspx"><span xml:lang="en" lang="en">Microsoft</span> 官方文件</a>。</p>
              <h3>卸除 <code>hasLayout</code> 性質</h3>
              <p>當然，可以反向定義物件 <code>hasLayout</code> 性質為無效，不過部分元素已內定 <code>hasLayout</code> 就沒辦法使其失效的。會用到卸除 <code>hasLayout</code> 的時機，都是針對已指定過 <code>hasLayout</code> 的物件，卻可能因某些目的而必須轉回無 <code>hasLayout</code> 。所以，通常只要將原先定義 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 特性，再重新定義回「預設值」，就會讓物件的 <code>hasLayout</code> 性質無效了。</p>
              <dl class="method CodeArea">
               <dt><acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 特性及值再定義成以下任一種方式，即可使 <code>hasLayout</code> 無效 (卸除) ：</dt>
               <dd class="DisplayBox CodeBox">
                <ul class="RegularList">
                 <li><code>height: auto;</code></li>
                 <li><code>width: auto;</code></li>
                 <li><code>max-height: none;</code></li>
                 <li><code>max-width: none;</code></li>
                 <li><code>float: none;</code></li>
                 <li><code>position: static;</code> (預設值)</li>
                 <li><code>overflow: visible;</code></li>
                 <li><code>overflow-x: visible;</code></li>
                 <li><code>overflow-y: visible;</code></li>
                 <li><code>zoom: normal;</code></li>
                 <li><code>writing-mode: lr-tb;</code> (預設值)</li>
                </ul>
               </dd>
              </dl>
              <p>舉例子看看就明瞭了：</p>
              <dl class="samples CodeArea">
               <dt><code>xhtml</code></dt>
               <dd class="DisplayBox CodeBox"><code>&lt;div id=&quot;main&quot;&gt;<br />
                &nbsp;&lt;p&gt;漁舟逐水愛山春，兩岸桃花夾去津。坐看紅樹不知遠，行盡青溪不見人。&lt;/p&gt;<br />
                &nbsp;&lt;p&gt;山口潛行始隈隩，山開曠望旋平陸。遙看一處攢雲樹，近入千家散花竹。&lt;/p&gt;<br />
                &nbsp;&lt;p class=&quot;extract&quot;&gt;節錄自：王維的桃源行&lt;/p&gt;<br />
                &lt;/div&gt;</code></dd>
               <dt><code>css</code> (例一) </dt>
               <dd class="DisplayBox CodeBox"><code>#main p {float:left;}<br />
                #main .extract {float:none;}</code></dd>
               <dt><code>css</code> (例二)</dt>
               <dd class="DisplayBox CodeBox"><code>#main p {zoom:125%;}<br />
                #main .extract {zoom:normal;}</code></dd>
              </dl>
              <p>兩例的 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 都類似情形，前一條定義先讓全部三段 <code>p</code> 成為 <code>hasLayout</code> ，後一條再讓最後一段的 <code>hasLayout</code> 無效。需要了解的是，卸除 <code>hasLayout</code> 的規則是定義在 <code>hasLayout</code> 規則之後的另一組挑子 (<dfn>selectors</dfn>) 裡，而且是取代先前「相同的」特性，前面用 <code>float</code> 指定，後面就要用 <code>float</code> 來卸除，這本來就是依循 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 的規則，只是再提醒一下而已。</p>
              <h3>無法卸除 <code>hasLayout</code> 的定義</h3>
              <p>以 <code>display:inline-block;</code> 指定 <code>hasLayout</code> 後，就沒辦法卸除，無論再定義回 <code>display:inline;</code> 或 <code>display:block;</code> ， <code>hasLayout</code> 依然維持有效，所以上述卸除規則沒有這項，這點必須注意。</p>
              <p>由於 <code>min-height</code> 與 <code>min-width</code> 的預設值是 0，所以縱使再定義為 <code>min-height:0;</code> (具體值)，也無法卸除 <code>hasLayout</code> 。但是 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 卻接受 <code class="hilight_1">min-height:auto;</code> 或 <code class="hilight_1">min-width:auto;</code> 來卸除 <code>hasLayout</code> ，特別須注意的是 <code>auto</code> 值並非 <acronym title="World Wide Web Consortium" xml:lang="en" lang="en">w3c</acronym> 標準，所以沒有把它列在上述卸除規則。</p>
              <div class="comments">
               <h2>思考 - <code>hasLayout</code> 與 <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> hacks</dfn> 拯救 <dfn xml:lang="en" lang="en"><acronym title="Internet Explorer">ie</acronym> bugs</dfn></h2>
               <p>本篇一開始就提到，為物件指定 <code>hasLayout</code> 性質就可以修復很多 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 令人噴飯的 <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> bugs</dfn> (<code>hasLayout</code> 大部分可修復背景不正常及 <code>position</code> 特性位移等問題) ，有幾種目前公認穩定又好的方式，但是有時必須搭配 <a href="CSShacks_1.htm" lang="en" xml:lang="en">CSS hacks</a> ，才可以在不同瀏覽器正常地呈現，而如果需要通過 <a title="造訪其他網站" href="http://jigsaw.w3.org/css-validator/" xml:lang="en" lang="en"><span xml:lang="en" lang="en">W3C validation</span></a> ，用到非 <acronym title="World Wide Web Consortium" xml:lang="en" lang="en">w3c</acronym> 標準語法時就需要運用 <a href="../html/ieCondCom.htm" xml:lang="en" lang="en">Conditional Comments</a> 把語法隔離起來。</p>
               <dl class="samples CodeArea">
                <dt><code>xhtml</code></dt>
                <dd class="DisplayBox CodeBox"><code>&lt;div id=&quot;main&quot; class=&quot;hasLayout&quot;&gt;<br />
                &nbsp;&lt;h2&gt;早梅  張謂&lt;/h2&gt;<br />
                &nbsp;&lt;p&gt;一樹寒梅白玉條，迥臨村路傍溪橋。不知近水花先發，疑是經冬雪未銷。&lt;/p&gt;<br />
                &lt;/div&gt;</code></dd>
                <dt><code>css</code></dt>
                <dd class="DisplayBox CodeBox"><code>.hasLayout {min-height:0;}</code> /* <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 7 <code>hasLayout</code> 生效 */<br />
                <code>* html .hasLayout {height:0;}</code> /* <dfn xml:lang="en" lang="en">hack</dfn> <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 <code>hasLayout</code> 生效 */</dd>
               </dl>
               <p>上面 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 語法例子符合 <acronym title="World Wide Web Consortium" xml:lang="en" lang="en">w3c</acronym> 標準，是很穩定的好方法，只是語法感覺有點冗長。 <code>min-height:0;</code> 本來就是預設值，加了此項其實是多餘的，所以對任何瀏覽器不會有影響，也就不需要用到 <dfn xml:lang="en" lang="en">hacks</dfn> ；而 <code>min-height:0;</code> 在 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 7 可驅使 <code>hasLayout</code> 生效，難纏的 <dfn xml:lang="en" lang="en"><acronym title="Internet Explorer">ie</acronym> bugs</dfn> 也就隨之解決了。但是， <code>height:0;</code> 在不同瀏覽器上呈現有很大差異，所以就必須採取 <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> hacks</dfn> 的技巧。 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 7 與 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 的 <span xml:lang="en" lang="en">bugs</span> 未必會在同一個物件同樣發生，所以，上述語法並沒有要求一定兩項條件都要同時存在，比較常出現 <span xml:lang="en" lang="en">bugs</span> 會是在 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 ，可以視狀況加入其中一項或兩項囉。另外需要提醒的是，依據規則此方法在「文字層級」物件沒有作用。</p>
               <p>承上 <acronym title="eXtensible HyperText Markup Language" xml:lang="en" lang="en">xhtml</acronym> 例，再看另一種 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> <code>hasLayout</code> 作法。 </p>
               <dl class="samples CodeArea">
                <dt><code>css</code></dt>
                <dd class="DisplayBox CodeBox"><code>#main {zoom:1;}</code></dd>
               </dl>
               <p>以 <code>zoom</code> 指定 <code>hasLayout</code> 算是精簡的好方法， <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 5.5 以後版本就有支援。 <code>zoom:1;</code> 維持物件原來大小不作任何改變，但可驅使 <code>hasLayout</code> 有效，而且不論區塊層級或行內元素都有作用；非 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 瀏覽器尚未支援 <code>zoom</code> 特性，所以完全不受影響，也就不需要用到 <dfn xml:lang="en" lang="en">hacks</dfn> 。唯一的小問題只是 <code>zoom</code> 並未納入 <acronym title="World Wide Web Consortium" xml:lang="en" lang="en">w3c</acronym> 標準。</p>
               <p>再看不同的例子。</p>
               <dl class="samples CodeArea">
                <dt><code>xhtml</code></dt>
                <dd class="DisplayBox CodeBox"><code>&lt;div id=&quot;nav&quot;&gt;<br />
                &lt;ul&gt;<br />
                &nbsp;&lt;li&gt;&lt;a href=&quot;#&quot;&gt;王維-陽關曲&lt;/a&gt;&lt;/li&gt;<br />
                &nbsp;&lt;li&gt;&lt;a href=&quot;#&quot;&gt;張謂-早梅&lt;/a&gt;&lt;/li&gt;<br />
                &nbsp;&lt;li&gt;&lt;a href=&quot;#&quot;&gt;杜甫-客至&lt;/a&gt;&lt;/li&gt;<br />
                &lt;/ul&gt;<br />
                &lt;/div&gt;</code></dd>
                <dt><code>css</code></dt>
                <dd class="DisplayBox CodeBox"><code>#nav li a {display:inline-block;}</code> /* <code>hasLayout</code> 生效 */<br />
                <code>#nav li a {display:block;}</code></dd>
               </dl>
               <p>此例在版面設計常會遇到，因設計需要必須將行內元素 <code>a</code> 轉換成區塊層級呈現 (改變物件的 <code>display</code> 特性) ，很明顯地，加了 <code>display:inline-block;</code> 這項其實是多餘的，因為元素 <code>a</code> 還是會依照其後定義的 <code>dislpay:block;</code> 呈現，所以任何瀏覽器的呈現也不會有差異；而 <code>display:inline-block;</code> 驅使 <code>hasLayout</code> 生效， <dfn xml:lang="en" lang="en"><acronym title="Internet Explorer">ie</acronym> bugs</dfn> 也就隨之解決了。這個方式 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 5.5 以後版本就有支援，完全符合 <acronym title="World Wide Web Consortium" xml:lang="en" lang="en">w3c</acronym> 標準，精簡且不需要用到 <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> hacks</dfn> ，適當地運用也是一個很好的技巧。</p>
               <p>最後叮嚀，不要想偷懶企圖使用像 <code>* {zoom:1;}</code> 的方式一次指定所有物件，發生問題的時候恐怕沒人救得了你；指定 <code>hasLayout</code> 性質的方式算是不少了，學習在不同情況下，針對有問題的物件變換最恰當的語法來修復 <dfn xml:lang="en" lang="en"><acronym title="Internet Explorer">ie</acronym> bugs</dfn> ，才是網頁設計者應有的態度。</p>
              </div>
              <dl class="resources">
               <dt>參考資源</dt>
               <dd>
                <ul class="RegularList">
                 <li><a title="造訪其他網站" href="http://msdn.microsoft.com/en-us/library/ms533776.aspx"><span xml:lang="en" lang="en">msdn hasLayout Property</span></a> - <span xml:lang="en" lang="en">Microsoft</span> 官方文件 (英文) 。</li>
                 <li><a title="造訪其他網站" href="http://www.satzansatz.de/cssd/onhavinglayout.html"><span xml:lang="en" lang="en">On having layout</span></a> - 完整研討，內容較繁長，已有譯成多種語言。</li>
                 <li><a title="造訪其他網站" href="http://haslayout.net/haslayout"><span xml:lang="en" lang="en">hasLayout by Zoffix Znet</span></a> - 較精簡解說 (英文) 。</li>
                </ul>
               </dd>
              </dl>
              <div class="others"><span class="copyright">散佈、展示請參閱 <a href="http://creativecommons.org/licenses/by-nc-nd/2.5/tw/" title="造訪創用CC條款"><dfn xml:lang="en" lang="en">Creative Commons</dfn> 授權條文</a>，禁止重混，引述請增加原文連結。</span></div>
  <div class="more"><a href="http://boohover.pixnet.net/blog/post/14187356">(Read More...)</a></div>]]></content:encoded>
      <pubDate>Mon, 11 Feb 2008 11:02:51 +0000</pubDate>
      <category>IE bugs </category>
      <comments>http://boohover.pixnet.net/blog/post/14187356#comments</comments>
    </item>
    <item>
      <title><![CDATA[CSS Selectors :before, :after - 擬元素挑選元, Pseudo-elements [2*]]]></title>
      <link>http://boohover.pixnet.net/blog/post/13148783</link>
      <guid>http://boohover.pixnet.net/blog/post/13148783</guid>
      <description><![CDATA[              
               難度：
               適合：有 html 及 css 語法基礎概念者。
               說明：以特別的 CSS selectors (指標) 語法，指向 html 元素 (elements, 如 p, h1, div 等) 裡沒有實際元素名稱或原來不存在的內容，並且使其被視為一個新的元素，稱之為擬元素 (pseudo-elements) 。在原有 selectors 加上 ::before 或 ::after 的擬元素表示法，如 #main::before ，將會指向該元素的內容最前或最後，並可在該處加入新的字元，而且新加的字元被視為新的元素，也可以賦予各種設計風格 (styles)。
               更新：2009-06-11
               支援： firefox, opera, safari, google chrome, ie8 。(至撰文時)
              
              Pseudo-elements ::before, ::after 範例
              
               xhtml
               &lt;strong class=&quot;amount&quot;&gt;700&lt;/strong&gt;
               css
               .amount::before {content:&quot;$ &quot;;}
               .amount::after {content:&quot; 萬元&quot;;}
               原來只有 700 ，但加了 css 以後呈現會是
               $ 700 萬元
              
              
               思考 - ::before, ::after Pseudo-element Selectors 使用原則
               :: 為 CSS3 擬元素的標準表示法，主要是為了與 : 的擬類別 (Pseudo-classes) 作區分，有別於原來 css2 兩者同樣使用 : 表示，目前較先進瀏覽器 (firefox, opera, safari, …) 均有支援。
               ::before 搭配 contnet 特性 (property) 雙引號內所指示的字元，可在 selectors 指定的元素最前加入該字串 (包括空格，如上例的 &quot;$ &quot;)， css 因而將此字串視為一個元素，所以可以賦予該字串各種設計風格； ::after 一樣用法，不同的只是加在最後。可以把上例想像成加了兩個實際的元素，如：
               
                xhtml
                &lt;strong class=&quot;amount&quot;&gt;&lt;span&gt;$ &lt;/span&gt;700&lt;span&gt; 萬元&lt;/span&gt;&lt;/strong&gt;
               
               另加一下 css 看看變化，
               
                css
                .amount {color:red;}
               
               這樣會是整個 $ 700 萬元 都變成紅字，因為 ::before, ::after 所加入的字串擬元素，仍屬於 .amount 元素的內容，所以依據繼承性，擬元素 $, 萬元 也都是紅字了。稍微改變一下 css 看看：
               
                css
                .amount::before {content:&quot;$ &quot;; color:blue;}
                .amount::after {content:&quot; 萬元&quot;; color:blue;}
               
               這樣只有擬元素變成藍字，結果會像 $ 700 萬元，先前定義的紅字還是存在。 ::before, ::after 沒有限制兩個同時都要指定，也可以只指定一個前或一個後。
               需要注意的是，以 ::before, ::after 配合 content 所產生的擬元素字串，會視為行內層級元素 (inline emements)，也就是文字層級 (text-level) 。 
               至於 content  特性還有更有用的字串加入方式，由於撰文時大多瀏覽器支援不甚完全，以後再作討論，有興趣可先參考 W3C The content Property 說明。
              
              
               參考資源
               W3C pseudo-elements - w3c 官方文件 (英文) 。
              
              散佈、展示請參閱 Creative Commons 授權條文，禁止重混，引述請增加原文連結。
]]></description>
      <content:encoded><![CDATA[              <ul class="adapt">
               <li>難度：<img class="grade" src="http://webchain.oreilly.tw/boohover/images/ic005_2.png" alt="等級2" title="分成1~5等級，愈大難度愈高。" /></li>
               <li>適合：有 <acronym title="HyperText Markup Language" xml:lang="en" lang="en">html</acronym> 及 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 語法基礎概念者。</li>
               <li>說明：以特別的 <a href="http://www.w3.org/TR/css3-selectors/" title="造訪W3C網站/英文"><dfn xml:lang="en" lang="en">CSS selectors</dfn></a> (指標) 語法，指向 <acronym title="HyperText Markup Language" xml:lang="en" lang="en">html</acronym> 元素 (<dfn xml:lang="en" lang="en">elements</dfn>, 如 <code>p, h1, div</code> 等) 裡沒有實際元素名稱或原來不存在的內容，並且使其被視為一個新的元素，稱之為<dfn>擬元素</dfn> (<dfn xml:lang="en" lang="en">pseudo-elements</dfn>) 。在原有 <dfn xml:lang="en" lang="en">selectors</dfn> 加上 <code>::before</code> 或 <code>::after</code> 的<dfn>擬元素</dfn>表示法，如 <code>#main::before</code> ，將會指向該元素的內容最前或最後，並可在該處加入新的字元，而且新加的字元被視為新的元素，也可以賦予各種設計風格 (<dfn xml:lang="en" lang="en">styles</dfn>)。</li>
               <li class="latest">更新：<span class="num date">2009-06-11</span></li>
               <li class="supports">支援： <span xml:lang="en" lang="en"><dfn>firefox</dfn>, <dfn>opera</dfn>, <dfn>safari</dfn>, <dfn>google chrome</dfn>, <dfn><acronym title="Internet Explorer">ie</acronym></dfn>8</span> 。(至撰文時)</li>
              </ul>
              <h2><span xml:lang="en" lang="en">Pseudo-elements</span> <code>::before, ::after</code> 範例</h2>
              <dl class="samples CodeArea">
               <dt><code>xhtml</code></dt>
               <dd class="DisplayBox CodeBox"><code>&lt;strong class=&quot;amount&quot;&gt;700&lt;/strong&gt;</code></dd>
               <dt><code>css</code></dt>
               <dd class="DisplayBox CodeBox"><code>.amount::before {content:&quot;$ &quot;;}<br />
               .amount::after {content:&quot; 萬元&quot;;}</code></dd>
               <dt>原來只有 <samp>700</samp> ，但加了 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 以後呈現會是</dt>
               <dd class="DisplayBox CodeBox"><samp>$ 700 萬元</samp></dd>
              </dl>
              <div class="comments">
               <h2>思考 - <code>::before, ::after</code> <span xml:lang="en" lang="en">Pseudo-element Selectors</span> 使用原則</h2>
               <p><code>::</code> 為 <a href="http://www.w3.org/TR/css3-selectors/#pseudo-elements" title="造訪W3C網站/英文"><dfn xml:lang="en" lang="en">CSS</dfn>3 擬元素</a>的標準表示法，主要是為了與 <code>:</code> 的<dfn>擬類別</dfn> (<a href="http://www.w3.org/TR/css3-selectors/#pseudo-classes" title="造訪W3C網站/英文"><dfn xml:lang="en" lang="en">Pseudo-classes</dfn></a>) 作區分，有別於原來 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym>2 兩者同樣使用 <code>:</code> 表示，目前較先進瀏覽器 (<span xml:lang="en" lang="en"><dfn>firefox</dfn>, <dfn>opera</dfn>, <dfn>safari</dfn></span>, …) 均有支援。</p>
               <p><code>::before</code> 搭配 <code>contnet</code> 特性 (<dfn xml:lang="en" lang="en">property</dfn>) 雙引號內所指示的字元，可在 <dfn xml:lang="en" lang="en">selectors</dfn> 指定的元素最前加入該字串 (包括空格，如上例的 <code>&quot;$ &quot;</code>)， <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 因而將此字串視為一個元素，所以可以賦予該字串各種設計風格； <code>::after</code> 一樣用法，不同的只是加在最後。可以把上例想像成加了兩個實際的元素，如：</p>
               <dl class="samples CodeArea">
                <dt><code>xhtml</code></dt>
                <dd class="DisplayBox CodeBox"><code>&lt;strong class=&quot;amount&quot;&gt;<span class="hilight_1">&lt;span&gt;$ &lt;/span&gt;</span>700<span class="hilight_1">&lt;span&gt; 萬元&lt;/span&gt;</span>&lt;/strong&gt;</code></dd>
               </dl>
               <p>另加一下 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 看看變化，</p>
               <dl class="samples CodeArea">
                <dt><code>css</code></dt>
                <dd class="DisplayBox CodeBox"><code>.amount {color:red;}</code></dd>
               </dl>
               <p>這樣會是整個 <samp class="hilight_1">$ 700 萬元</samp> 都變成紅字，因為 <code>::before, ::after</code> 所加入的字串<dfn>擬元素</dfn>，仍屬於 <code>.amount</code> 元素的內容，所以依據<a href="http://www.w3.org/TR/CSS21/cascade.html#inheritance" title="造訪W3C網站/英文">繼承性</a>，<dfn>擬元素</dfn> <samp>$, 萬元</samp> 也都是紅字了。稍微改變一下 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 看看：</p>
               <dl class="samples CodeArea">
                <dt><code>css</code></dt>
                <dd class="DisplayBox CodeBox"><code>.amount::before {content:&quot;$ &quot;; color:blue;}<br />
                .amount::after {content:&quot; 萬元&quot;; color:blue;}</code></dd>
               </dl>
               <p>這樣只有<dfn>擬元素</dfn>變成藍字，結果會像 <samp class="hilight_1"><span class="hilight_3">$</span> 700 <span class="hilight_3">萬元</span></samp>，先前定義的紅字還是存在。 <code>::before</code>, <code>::after</code> 沒有限制兩個同時都要指定，也可以只指定一個前或一個後。</p>
               <p>需要注意的是，以 <code>::before, ::after</code> 配合 <code>content</code> 所產生的<dfn>擬元素</dfn>字串，會視為<dfn>行內層級元素</dfn> (<a href="http://boohover.pixnet.net/blog/post/18087970#BoxBlockInline"><dfn xml:lang="en" lang="en">inline emements</dfn></a>)，也就是文字層級 (<dfn xml:lang="en" lang="en">text-level</dfn>) 。 </p>
               <p>至於 <code>content </code> 特性還有更有用的字串加入方式，由於撰文時大多瀏覽器支援不甚完全，以後再作討論，有興趣可先參考 <a href="http://www.w3.org/TR/CSS21/generate.html#propdef-content"title="造訪其他網站" xml:lang="en" lang="en">W3C The content Property</a> 說明。</p>
              </div>
              <dl class="resources">
               <dt>參考資源</dt>
               <dd><a title="造訪其他網站" href="http://www.w3.org/TR/CSS21/selector.html#before-and-after"><span xml:lang="en" lang="en">W3C pseudo-elements</span></a> - <acronym title="World Wide Web Consortium" xml:lang="en" lang="en">w3c</acronym> 官方文件 (英文) 。</dd>
              </dl>
              <div class="others"><span class="copyright">散佈、展示請參閱 <a href="http://creativecommons.org/licenses/by-nc-nd/2.5/tw/" title="造訪創用CC條款"><dfn xml:lang="en" lang="en">Creative Commons</dfn> 授權條文</a>，禁止重混，引述請增加原文連結。</span></div>
  <div class="more"><a href="http://boohover.pixnet.net/blog/post/13148783">(Read More...)</a></div>]]></content:encoded>
      <pubDate>Fri, 18 Jan 2008 09:01:08 +0000</pubDate>
      <category>pseudo-elements擬元素</category>
      <comments>http://boohover.pixnet.net/blog/post/13148783#comments</comments>
    </item>
    <item>
      <title><![CDATA[ie 條件式註解,Conditional Comments [if IE] [3*]]]></title>
      <link>http://boohover.pixnet.net/blog/post/12309095</link>
      <guid>http://boohover.pixnet.net/blog/post/12309095</guid>
      <description><![CDATA[              
               難度：
               適合：有設計網頁及撰寫 html 語法經驗者。
               說明： ie 專用語法 (ie only) 。運用 html 註解形式 &lt;!-- --&gt;，在註解間加入特殊的語法，可使 ie 將該註解內容反視為有效語法，甚至可自動區分不同版本 ie 來解讀。而非 ie 瀏覽器 (firefox, opera, safari, google chrome …) 一律視其為註解，所以同時也有了區隔不同瀏覽器的功能，有點像是 html hacks。 ie5 就已開始支援。
               更新：2008-11-23
              
               Conditional Comments [if IE] : ie 專用 (ie only) 條件式 html 註解的語法
              
               &lt;!--[if IE]&gt;內容&lt;![endif]--&gt;
               內容只有 ie 會顯現。
               &lt;!--[if IE 6]&gt;內容&lt;![endif]--&gt; 
               內容只有 ie6 會顯現。
               &lt;!--[if lt IE 7]&gt;內容&lt;![endif]--&gt;
               內容只在比 ie7 更舊的版本會顯現。 [參考說明]
               &lt;!--[if gte IE 8]&gt;內容&lt;![endif]--&gt;
               內容只有 ie8 及其較新版本會顯現。 [參考說明]
               &lt;!--[if !IE]&gt;--&gt;內容&lt;!--&lt;![endif]--&gt;
               內容除 ie 以外都會顯現。 [參考說明]
               &lt;!--[if !(IE 6)]&gt;內容&lt;![endif]--&gt;
               內容除 ie6 以外的 ie 都會顯現。 [參考說明]
               &lt;!--[if (gte IE 6)&amp;(lt IE 8)]&gt;內容&lt;![endif]--&gt;
               內容只從 ie6 以後及 ie8 之前版本會顯現。 [參考說明]
               &lt;!--[if (IE 7)|(IE 6)]&gt;內容&lt;![endif]--&gt;
               內容只有 ie7 及 ie6 會顯現。 [參考說明]
               &lt;!--[if gte IE 7]&gt;&lt;!--&gt;內容&lt;!--&lt;![endif]--&gt;
               內容在 ie7 及其較新版本，以及 ie 以外都會顯現。 [參考說明]
              
              藍色部分 &lt;!-- 或 --&gt; 為標準 html 註解的起始或結尾；除此之外，紅色部分即為 ie 能辨識的特殊語法。所以，只有 ie 會依據紅字所表示的條件來判斷呈現與否，而其它瀏覽器依標準一律當成是註解。
              語法中空格不能任意省去，尤其注意 IE 之後，版本編號前的空格。除 IE 必須大寫，其餘英文字母都是小寫。註解的結尾語法都是 &lt;![endif]--&gt; 。              
              
               思考 - 條件式註解的應用
               運用不同條件可在不同版本呈現的原理，我們可以做出提供使用者，類似瀏覽器版本線上偵測的範例 ：
               
                xhtml 語法
                
                 &lt;!--[if IE]&gt;
 &lt;p&gt;您正在使用的瀏覽器為 ie 。&lt;/p&gt;
&lt;![endif]--&gt;
                
                
                 &lt;!--[if IE 6]&gt;
 &lt;p&gt;您正在使用的瀏覽器為 ie6 。&lt;/p&gt;
&lt;![endif]--&gt;
                
                
                 &lt;!--[if IE 7]&gt;
 &lt;p&gt;您正在使用的瀏覽器為 ie7 。&lt;/p&gt;
&lt;![endif]--&gt;
                
                
                 &lt;!--[if lt IE 7]&gt;
 &lt;p&gt;您正在使用的瀏覽器為比 ie7 較舊的版本。&lt;/p&gt;
&lt;![endif]--&gt;
                
                
                 &lt;!--[if gte IE 8]&gt;
 &lt;p&gt;您正在使用的瀏覽器為 ie8 或比 ie8 更新的版本。&lt;/p&gt;
&lt;![endif]--&gt;
                
                
                 &lt;!--[if !IE]&gt;--&gt;
 &lt;p&gt;您正在使用的瀏覽器不是 ie 。&lt;/p&gt;
&lt;!--&lt;![endif]--&gt;
                
                
                 &lt;!--[if !(IE 6)]&gt;
 &lt;p&gt;您正在使用的瀏覽器為 ie ，但不是 ie6 。&lt;/p&gt;
&lt;![endif]--&gt;
                
                
                 &lt;!--[if (gte IE 5.5)&amp;(lt IE 7)]&gt;
 &lt;p&gt;您正在使用的瀏覽器為 ie5.5 或 ie6 。&lt;/p&gt;
&lt;![endif]--&gt;
                
                
                 &lt;!--[if (IE 7)|(IE 6)]&gt;
 &lt;p&gt;您正在使用的瀏覽器為 ie7 或 ie6 。&lt;/p&gt;
&lt;![endif]--&gt;
                
                
                 &lt;!--[if gte IE 7]&gt;&lt;!--&gt;
 &lt;p&gt;您正在使用的瀏覽器為 ie7 或比 ie7 更新的版本，或不是使用 ie 。&lt;/p&gt;
&lt;!--&lt;![endif]--&gt;
                
               
               
                上面的語法實際呈現如下，請使用不同瀏覽器測試。
                
                 
                 
                 
                 
                 
                 您正在使用的瀏覽器不是 ie 。
                 
                 
                 
                 您正在使用的瀏覽器為 ie7 或比 ie7 更新的版本，或不是使用 ie 。
                
               
               ie Conditional Comments 幾乎可以包圍任何 html 內容，包括整個元素 (elements) 或單獨的標籤 (tags) ；這屬於 html 語法，只適用在 html 語法內，出現在其它如 css 語法裡或 javascript 程式裡是會錯誤的。有時候我們因某些狀況不得不使用 ie 自創專有的語法，又必須符合 w3c 標準語法規範，或是需要避開 ie 的錯誤，又為了避免與其它瀏覽器發生衝突，條件式註解就成了有用的技巧。
               條件註解當作 css hacks
               
                僅供 ie6 及其較舊版套用的樣式清單檔
                
                 &lt;!--[if lte IE 6]&gt;
 &lt;link href=&quot;style_ie6.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;
&lt;![endif]--&gt;
                
               
               條件註解讓 javascript 在指定的瀏覽器執行
               
                僅供 ie 執行的 javascript 程式檔
                
                 &lt;!--[if IE]&gt;
 &lt;script src=&quot;script_ie.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;![endif]--&gt;
                
               
               註解裡的運算子 (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 有效。。
                &amp; : 符合由 &amp; 連接的全部子運算式的條件，如 [if (gt IE 5.0)&amp;(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]&gt;&lt;!--&gt; 中多加了 &lt;! (綠色) ，只是為了避免 ie 會把接下去的 --&gt; 顯示出來。
               類似運用註解的方法在許多應用軟體也常見到，例如 Adobe Dreamweaver 裡的範本 (templates) 標籤、圖庫 (library) 標籤，也都是運用註解標註的方式讓特定的應用軟體來辨識，所以瀏覽器只會把它們當成註解而已，多留意看看就會發現其中的奧妙了。
              
              
               參考資源
               
                
                 msdn Conditional Comments for IE only - Microsoft 官方文件 (英文) 。
                 Conditional Comments as a CSS hack (英文) 
                
               
              
              散佈、展示請參閱 Creative Commons 授權條文，禁止重混，引述請增加原文連結。
]]></description>
      <content:encoded><![CDATA[              <ul class="adapt">
               <li>難度：<img class="grade" src="http://webchain.oreilly.tw/boohover/images/ic005_3.png" alt="等級3" title="分成1~5等級，愈大難度愈高。" /></li>
               <li>適合：有設計網頁及撰寫 <acronym title="HyperText Markup Language" xml:lang="en" lang="en">html</acronym> 語法經驗者。</li>
               <li>說明： <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 專用語法 (<dfn xml:lang="en" lang="en"><acronym title="Internet Explorer">ie</acronym> only</dfn>) 。運用 <acronym title="HyperText Markup Language" xml:lang="en" lang="en">html</acronym> 註解形式 <code class="hilight_2">&lt;!-- --&gt;</code>，在註解間加入特殊的語法，可使 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 將該註解內容反視為有效語法，甚至可自動區分不同版本 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 來解讀。而非 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 瀏覽器 (<span xml:lang="en" lang="en"><dfn>firefox</dfn>, <dfn>opera</dfn>, <dfn>safari</dfn>, <dfn>google chrome</dfn></span> …) 一律視其為註解，所以同時也有了區隔不同瀏覽器的功能，有點像是 <dfn xml:lang="en" lang="en"><acronym title="HyperText Markup Language">html</acronym> hacks</dfn>。 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>5 就已開始支援。</li>
               <li class="latest">更新：<span class="num date">2008-11-23</span></li>
              </ul>
               <h2><dfn xml:lang="en" lang="en">Conditional Comments</dfn> <code>[if IE]</code> : <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 專用 (<dfn xml:lang="en" lang="en"><acronym title="Internet Explorer">ie</acronym> only</dfn>) 條件式 <acronym title="HyperText Markup Language" xml:lang="en" lang="en">html</acronym> 註解的語法</h2>
              <dl class="method CodeArea">
               <dt class="CodeBox"><code><span class="hilight_3">&lt;!--</span><span class="hilight_1">[if IE]&gt;</span>內容<span class="hilight_1">&lt;![endif]</span><span class="hilight_3">--&gt;</span></code></dt>
               <dd class="DisplayBox">內容只有 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 會顯現。</dd>
               <dt><code><span class="hilight_3">&lt;!--</span><span class="hilight_1">[if IE 6]&gt;</span>內容<span class="hilight_1">&lt;![endif]</span><span class="hilight_3">--&gt;</span></code> </dt>
               <dd class="DisplayBox">內容只有 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>6 會顯現。</dd>
               <dt class="CodeBox"><code><span class="hilight_3">&lt;!--</span><span class="hilight_1">[if lt IE 7]&gt;</span>內容<span class="hilight_1">&lt;![endif]</span><span class="hilight_3">--&gt;</span></code></dt>
               <dd class="DisplayBox">內容只在比 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>7 更舊的版本會顯現。 [<a href="#CondComOp" class="prompt">參考說明</a>]</dd>
               <dt class="CodeBox"><code><span class="hilight_3">&lt;!--</span><span class="hilight_1">[if gte IE 8]&gt;</span>內容<span class="hilight_1">&lt;![endif]</span><span class="hilight_3">--&gt;</span></code></dt>
               <dd class="DisplayBox">內容只有 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>8 及其較新版本會顯現。 [<a href="#CondComOp" class="prompt">參考說明</a>]</dd>
               <dt class="CodeBox"><code><span class="hilight_3">&lt;!--</span><span class="hilight_1">[if !IE]&gt;</span><span class="hilight_3">--&gt;</span>內容<span class="hilight_3">&lt;!--</span><span class="hilight_1">&lt;![endif]</span><span class="hilight_3">--&gt;</span></code></dt>
               <dd class="DisplayBox">內容除 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 以外都會顯現。 [<a href="#CondComOp" class="prompt">參考說明</a>]</dd>
               <dt class="CodeBox"><code><span class="hilight_3">&lt;!--</span><span class="hilight_1">[if !(IE 6)]&gt;</span>內容<span class="hilight_1">&lt;![endif]</span><span class="hilight_3">--&gt;</span></code></dt>
               <dd class="DisplayBox">內容除 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>6 以外的 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 都會顯現。 [<a href="#CondComOp" class="prompt">參考說明</a>]</dd>
               <dt class="CodeBox"><code><span class="hilight_3">&lt;!--</span><span class="hilight_1">[if (gte IE 6)&amp;(lt IE 8)]&gt;</span>內容<span class="hilight_1">&lt;![endif]</span><span class="hilight_3">--&gt;</span></code></dt>
               <dd class="DisplayBox">內容只從 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>6 以後及 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>8 之前版本會顯現。 [<a href="#CondComOp" class="prompt">參考說明</a>]</dd>
               <dt class="CodeBox"><code><span class="hilight_3">&lt;!--</span><span class="hilight_1">[if (IE 7)|(IE 6)]&gt;</span>內容<span class="hilight_1">&lt;![endif]</span><span class="hilight_3">--&gt;</span></code></dt>
               <dd class="DisplayBox">內容只有 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>7 及 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>6 會顯現。 [<a href="#CondComOp" class="prompt">參考說明</a>]</dd>
               <dt class="CodeBox"><code><span class="hilight_3">&lt;!--</span><span class="hilight_1">[if gte IE 7]&gt;</span><span class="hilight_2">&lt;!</span><span class="hilight_3">--&gt;</span>內容<span class="hilight_3">&lt;!--</span><span class="hilight_1">&lt;![endif]</span><span class="hilight_3">--&gt;</span></code></dt>
               <dd class="DisplayBox">內容在 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>7 及其較新版本，以及 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 以外都會顯現。 [<a href="#CondComOp" class="prompt">參考說明</a>]</dd>
              </dl>
              <p>藍色部分 <code class="hilight_3">&lt;!--</code> 或 <code class="hilight_3">--&gt;</code> 為標準 <acronym title="HyperText Markup Language" xml:lang="en" lang="en">html</acronym> 註解的起始或結尾；除此之外，紅色部分即為 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 能辨識的特殊語法。所以，只有 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 會依據紅字所表示的條件來判斷呈現與否，而其它瀏覽器依標準一律當成是註解。</p>
              <p>語法中空格不能任意省去，尤其注意 <code>IE</code> 之後，版本編號前的空格。除 <code>IE</code> 必須大寫，其餘英文字母都是小寫。註解的結尾語法都是 <code>&lt;![endif]--&gt;</code> 。              </p>
              <div class="comments">
               <h2>思考 - <dfn>條件式註解</dfn>的應用</h2>
               <p>運用不同條件可在不同版本呈現的原理，我們可以做出提供使用者，類似瀏覽器版本線上偵測的範例 ：</p>
               <dl class="samples CodeArea">
                <dt><code>xhtml</code> 語法</dt>
                <dd class="DisplayBox CodeBox">
                 <pre><code>&lt;!--[if IE]&gt;
 &lt;p&gt;您正在使用的瀏覽器為 ie 。&lt;/p&gt;
&lt;![endif]--&gt;</code></pre>
                </dd>
                <dd class="DisplayBox CodeBox">
                 <pre><code>&lt;!--[if IE 6]&gt;
 &lt;p&gt;您正在使用的瀏覽器為 ie6 。&lt;/p&gt;
&lt;![endif]--&gt;</code></pre>
                </dd>
                <dd class="DisplayBox CodeBox">
                 <pre><code>&lt;!--[if IE 7]&gt;
 &lt;p&gt;您正在使用的瀏覽器為 ie7 。&lt;/p&gt;
&lt;![endif]--&gt;</code></pre>
                </dd>
                <dd class="DisplayBox CodeBox">
                 <pre><code>&lt;!--[if lt IE 7]&gt;
 &lt;p&gt;您正在使用的瀏覽器為比 ie7 較舊的版本。&lt;/p&gt;
&lt;![endif]--&gt;</code></pre>
                </dd>
                <dd class="DisplayBox CodeBox">
                 <pre><code>&lt;!--[if gte IE 8]&gt;
 &lt;p&gt;您正在使用的瀏覽器為 ie8 或比 ie8 更新的版本。&lt;/p&gt;
&lt;![endif]--&gt;</code></pre>
                </dd>
                <dd class="DisplayBox CodeBox">
                 <pre><code>&lt;!--[if !IE]&gt;--&gt;
 &lt;p&gt;您正在使用的瀏覽器不是 ie 。&lt;/p&gt;
&lt;!--&lt;![endif]--&gt;</code></pre>
                </dd>
                <dd class="DisplayBox CodeBox">
                 <pre><code>&lt;!--[if !(IE 6)]&gt;
 &lt;p&gt;您正在使用的瀏覽器為 ie ，但不是 ie6 。&lt;/p&gt;
&lt;![endif]--&gt;</code></pre>
                </dd>
                <dd class="DisplayBox CodeBox">
                 <pre><code>&lt;!--[if (gte IE 5.5)&amp;(lt IE 7)]&gt;
 &lt;p&gt;您正在使用的瀏覽器為 ie5.5 或 ie6 。&lt;/p&gt;
&lt;![endif]--&gt;</code></pre>
                </dd>
                <dd class="DisplayBox CodeBox">
                 <pre><code>&lt;!--[if (IE 7)|(IE 6)]&gt;
 &lt;p&gt;您正在使用的瀏覽器為 ie7 或 ie6 。&lt;/p&gt;
&lt;![endif]--&gt;</code></pre>
                </dd>
                <dd class="DisplayBox CodeBox">
                 <pre><code>&lt;!--[if gte IE 7]&gt;&lt;!--&gt;
 &lt;p&gt;您正在使用的瀏覽器為 ie7 或比 ie7 更新的版本，或不是使用 ie 。&lt;/p&gt;
&lt;!--&lt;![endif]--&gt;</code></pre>
                </dd>
               </dl>
               <dl class="samples render">
                <dt>上面的語法實際呈現如下，請使用不同瀏覽器測試。</dt>
                <dd class="DisplayBox RenderBox">
                 <!--[if IE]><p>您正在使用的瀏覽器為 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 。</p><![endif]-->
                 <!--[if IE 6]><p>您正在使用的瀏覽器為 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>6 。</p><![endif]-->
                 <!--[if IE 7]><p>您正在使用的瀏覽器為 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>7 。</p><![endif]-->
                 <!--[if lt IE 7]><p>您正在使用的瀏覽器為比 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>7 較舊的版本。</p><![endif]-->
                 <!--[if gte IE 8]><p>您正在使用的瀏覽器為 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>8 或比 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>8 更新的版本。</p><![endif]-->
                 <!--[if !IE]>--><p>您正在使用的瀏覽器不是 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 。</p><!--<![endif]-->
                 <!--[if !(IE 6)]><p>您正在使用的瀏覽器為 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> ，但不是 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>6 。</p><![endif]-->
                 <!--[if (gte IE 5.5)&(lt IE 7)]><p>您正在使用的瀏覽器為 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>5.5 或 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>6 。</p><![endif]-->
                 <!--[if (IE 7)|(IE 6)]><p>您正在使用的瀏覽器為 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>7 或 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>6 。</p><![endif]-->
                 <!--[if gte IE 7]><!--><p>您正在使用的瀏覽器為 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>7 或比 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>7 更新的版本，或不是使用 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 。</p><!--<![endif]-->
                </dd>
               </dl>
               <p><span xml:lang="en" lang="en"><acronym title="Internet Explorer">ie</acronym> <dfn>Conditional Comments</dfn></span> 幾乎可以包圍任何 <acronym title="HyperText Markup Language" xml:lang="en" lang="en">html</acronym> 內容，包括整個元素 (<dfn xml:lang="en" lang="en">elements</dfn>) 或單獨的標籤 (<dfn xml:lang="en" lang="en">tags</dfn>) ；這屬於 <acronym title="HyperText Markup Language" xml:lang="en" lang="en">html</acronym> 語法，只適用在 <acronym title="HyperText Markup Language" xml:lang="en" lang="en">html</acronym> 語法內，出現在其它如 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 語法裡或 <dfn xml:lang="en" lang="en">javascript</dfn> 程式裡是會錯誤的。有時候我們因某些狀況不得不使用 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 自創專有的語法，又必須符合 <acronym title="World Wide Web Consortium" xml:lang="en" lang="en">w3c</acronym> 標準語法規範，或是需要避開 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 的錯誤，又為了避免與其它瀏覽器發生衝突，<dfn>條件式註解</dfn>就成了有用的技巧。</p>
               <h3><dfn>條件註解</dfn>當作 <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> hacks</dfn></h3>
               <dl class="samples CodeArea">
                <dt>僅供 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>6 及其較舊版套用的樣式清單檔</dt>
                <dd class="DisplayBox CodeBox">
                 <pre><code><span class="hilight_1">&lt;!--[if lte IE 6]&gt;</span>
 &lt;link href=&quot;style_ie6.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;
<span class="hilight_1">&lt;![endif]--&gt;</span></code></pre>
                </dd>
               </dl>
               <h3><dfn>條件註解</dfn>讓 <dfn xml:lang="en" lang="en">javascript</dfn> 在指定的瀏覽器執行</h3>
               <dl class="samples CodeArea">
                <dt>僅供 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 執行的 <dfn xml:lang="en" lang="en">javascript</dfn> 程式檔</dt>
                <dd class="DisplayBox CodeBox">
                 <pre><code><span class="hilight_1">&lt;!--[if IE]&gt;</span>
 &lt;script src=&quot;script_ie.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
<span class="hilight_1">&lt;![endif]--&gt;</span></code></pre>
                </dd>
               </dl>
               <h3 id="CondComOp">註解裡的運算子 (<dfn xml:lang="en" lang="en">operators</dfn>) : <code>lt</code>, <code>lte</code>, <code>gt</code>, <code>gte</code>…</h3>
               <p>語法中除了 <code>if</code>, <code>IE</code> 比較容易體會含意外，其餘看似難懂的符號，列出來解釋一下就容易了。</p>
               <ul class="RegularList">
                <li><code class="hilight_1">lt</code> : <span xml:lang="en" lang="en">lower than</span> ，比某一版本更舊的版本，如 <code>[if lt IE 7]</code> 。</li>
                <li><code class="hilight_1">lte</code> : <span xml:lang="en" lang="en">lower than or equal to</span> ，某一版本及其更舊的版本，如 <code>[if lte IE 6]</code> 。</li>
                <li><code class="hilight_1">gt</code> : <span xml:lang="en" lang="en">greater than</span> ，比某一版本更新的版本，如 <code>[if gt IE 6]</code>。</li>
                <li><code class="hilight_1">gte</code> : <span xml:lang="en" lang="en">greater than or equal to</span> ，某一版本及其更新的版本，如 <code>[if gte IE 8]</code> 。</li>
                <li><code class="hilight_1">!</code> : 「非」、「排除」、「反向」的意思，可加在版本、運算子、或子運算式 <code>( )</code> 前，如 <code>[if !IE]</code> ，指定 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 以外有效。</li>
                <li><code class="hilight_1">( )</code> : 可將基本的條件加入子運算式 (<dfn xml:lang="en" lang="en">subexpression</dfn>) 處理更複雜的條件，如 <code>[if !(IE 6)]</code> ，指定除 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>6 以外的 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 有效。。</li>
                <li><code class="hilight_1">&amp;</code> : 符合由 <code>&amp;</code> 連接的全部子運算式的條件，如 <code>[if (gt IE 5.0)&amp;(lt IE 7)]</code> ，指定 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>5 之後， <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>7 之前有效。</li>
                <li><code class="hilight_1">|</code> : 符合由 <code>|</code> 連接的任一個子運算式的條件，如 <code>[if (IE 5.5)|(IE 6)]</code> ，指定 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>5.5 或是 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>6 有效。</li>
               </ul>
               <p>所以， <code>[if lte IE 6]</code> 和 <code>[if lt IE 7]</code> 同樣指的都是 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>6 及其更舊版本，而 <code>[if gt IE 6]</code>與 <code>[if gte IE 7]</code> 同指 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>7 及其較新版本。</p>
               <p>實際上，常用的運算子應該只有前面五項，所以沒有特別需求的話，不需要浪費太多時間鑽研每一項的用法囉！</p>
               <h3>稍作變化才能正確用在 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 以外瀏覽器</h3>
               <p>在前面語法中，關於 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 以外瀏覽器顯現的作法，加了一點東西，這是將 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 專用註解語法 (紅色部分) ，再加註解標記，變成前後兩部分 <acronym title="HyperText Markup Language" xml:lang="en" lang="en">html</acronym> 標準註解 (注意藍色部分) ，才可以讓內容不再是註解；而 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 仍舊以原來特殊語法判斷，不會理會另外加的符號，如此既能區分瀏覽器，又不會違反 <acronym title="World Wide Web Consortium" xml:lang="en" lang="en">w3c</acronym> 標準語法。另外需要注意的是，如果同時也要讓某些 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 顯現 (如最後一項) ，就必須動點手腳，如 <code>[if gte IE 7]&gt;&lt;!--&gt;</code> 中多加了 <code>&lt;!</code> (綠色) ，只是為了避免 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 會把接下去的 <code>--&gt;</code> 顯示出來。</p>
               <p>類似運用註解的方法在許多應用軟體也常見到，例如 <dfn xml:lang="en" lang="en">Adobe Dreamweaver</dfn> 裡的範本 (<span xml:lang="en" lang="en">templates</span>) 標籤、圖庫 (<span xml:lang="en" lang="en">library</span>) 標籤，也都是運用註解標註的方式讓特定的應用軟體來辨識，所以瀏覽器只會把它們當成註解而已，多留意看看就會發現其中的奧妙了。</p>
              </div>
              <dl class="resources">
               <dt>參考資源</dt>
               <dd>
                <ul class="RegularList">
                 <li><a title="造訪其他網站" href="http://msdn.microsoft.com/en-us/library/ms537512.aspx"><span xml:lang="en" lang="en">msdn Conditional Comments for IE only</span></a> - Microsoft 官方文件 (英文) 。</li>
                 <li><a title="造訪其他網站" href="http://www.webdevout.net/css-hacks#conditional_comments-css_hack"><span xml:lang="en" lang="en">Conditional Comments as a CSS hack</span></a> (英文) </li>
                </ul>
               </dd>
              </dl>
              <div class="others"><span class="copyright">散佈、展示請參閱 <a href="http://creativecommons.org/licenses/by-nc-nd/2.5/tw/" title="造訪創用CC條款"><dfn xml:lang="en" lang="en">Creative Commons</dfn> 授權條文</a>，禁止重混，引述請增加原文連結。</span></div>
  <div class="more"><a href="http://boohover.pixnet.net/blog/post/12309095">(Read More...)</a></div>]]></content:encoded>
      <pubDate>Thu, 27 Dec 2007 09:12:13 +0000</pubDate>
      <category>IE Only</category>
      <comments>http://boohover.pixnet.net/blog/post/12309095#comments</comments>
    </item>
    <item>
      <title><![CDATA[CSS hacks, CSS filters-CSS 區隔各類不同瀏覽器 [5*]]]></title>
      <link>http://boohover.pixnet.net/blog/post/8947951</link>
      <guid>http://boohover.pixnet.net/blog/post/8947951</guid>
      <description><![CDATA[               
                難度：
                適合：有設計網頁及撰寫 css 語法經驗者。
                說明：利用不同瀏覽器對 CSS selectors (指標) 支援程度的不同，使得 css 設計效果，可針對不同瀏覽器分別製作，一般稱這類處理方式為 css hacks (css 區隔設計) 或  css filters。
                更新：2009-06-03
               
               css selectors 的語法及對應有效的瀏覽器 (css hacks)
               
                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&gt;body selector {css 設計內容}
或可簡化為 *&gt;selector {css 設計內容} 
                
                firefox, opera, safari, google chrome …等新式瀏覽器及 ie8 (含)以後版本
                
html&gt;/**/body selector {css 設計內容}
                
                firefox, opera, safari, google chrome …等新式瀏覽器 (ie 以外) [參考說明]
                
html:root selector {css 設計內容}
                
                ie8 [參考說明]
                
html&gt;/**/body selector {css 設計內容}
html:root selector {css 設計內容} (以此項覆蓋前項的定義，保留前項給 ie8)
                
                firefox (Gecko series), google chrome2, safari4 [參考說明]
                
selector:not([att*=&quot;&quot;]) {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 hacks 與 css  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&gt;/**/body selector {css 設計內容}
html:root selector {css 設計內容}
                第一項在 ie8 及其它新式瀏覽器有效，而第二項只在非 ie 的新式瀏覽器有效，所以只要在第二項定義 css 覆蓋掉第一項，就等同單獨為 ie8 指定。如，
                html&gt;/**/body #main {color:blue;}
html:root #main {color:inherit;}
                ie8 字的顏色會以 blue 呈現，而其它瀏覽器則保留原來樣式。
                又如，
                #main {background:yellow;}
html&gt;/**/body #main {background:orange;}
html:root #main {background:yellow;}
                ie8 背景色會以 orange 呈現，而其它瀏覽器則為 yellow 。
                css hack firefox, opera, safari, google chrome …等新式瀏覽器
html&gt;body selector {css 設計內容}
                html&gt;body 在語法上可以說是多餘的，因為 html 文件的最外兩層就是 html 和 body 這兩個唯一的元素，所以加不加這段，結果其實是一樣的；但是由於 ie 6 沒有支援有 「&gt;」 符號 (child combinators) ，就可以利用此方式為 ie 6 以外的瀏覽器定義 css 設計。運用同樣的道理，大部分時候，可以將它簡化寫成 *&gt;selector ，只是使用時要注意 selector 所指向的元素的階層關係，如果覺得搞不清楚，最好還是使用前者語法比較保險。
html&gt;/**/body selector {css 設計內容}
                html&gt;/**/body 和 html&gt;body 其實是同樣意義，因為符號 /**/ 只是 css 定義裡的註解語法，瀏覽器應當忽略它不會影響原有的內容，但是 ie 7 卻會因為這個位置加了註解符號而變成無效。
                css hack non-ie (非 ie)
html:root selector {css 設計內容}
                通常運用 ie 未支援的 css  selectors 語法，就可以為 ie 以外的瀏覽器 (non-ie browsers) 設計。
                :root pseudo-class 在 ie 8 仍未支援，所以語法中 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*=&quot;&quot;]) {css 設計內容}
                這個…真有點複雜，先對照例子看看。
                
                 xhtml
                 
&lt;div class=&quot;content&quot;&gt;
 &lt;p&gt;花徑不曾緣客掃，蓬門今始為君開。&lt;/p&gt;
&lt;/div&gt;
                 
                 css
                 
.content:not([class*=&quot;&quot;]) {background: lime;}
                 
                
                需要注意的是語法中 [att*=&quot;&quot;] 的 att 必須對應元素已有定義的屬性 (attributes) ，如例中 div 元素的 class 屬性。如果對應的是元素尚未定義的屬性，把上例改成 .content:not([id*=&quot;&quot;]) ，雖然語法上沒有錯誤，但是這會使其它新式瀏覽器也同樣有效，就不是僅僅 hack firefox ，而是 hack ie 以外的瀏覽器了 (ie 尚未支援 :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 之類。
                目前僅有 safari 及 google 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 hack 將 ie 6 的定義區隔起來。
                
                 例如 xhtml
                 
&lt;div id=&quot;main&quot;&gt;
 &lt;p&gt;勸君更盡一杯酒，西出陽關無故人。&lt;/p&gt;
&lt;/div&gt;
                 
                 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 還有其它不同方式，設計者應視狀況使用，如何善加運用還是決定在設計者。
               
               
                參考資源
                
                 
                  CSS hacks - 多種不同方式的詳細研討，內容較繁長 (英文) 。
                  centricle CSS filters - 各種瀏覽器及版本列表，完整但較不易理解 (英文) 。
                  條件式註解 Conditional Comments -  ie 專屬的 html 方式。
                  Thoughts on IE hack management - 各種方式比較與說明 (英文) 。
                 
                
               
               散佈、展示請參閱 Creative Commons 授權條文，禁止重混，引述請增加原文連結。
]]></description>
      <content:encoded><![CDATA[               <ul class="adapt">
                <li>難度：<img class="grade" src="http://webchain.oreilly.tw/boohover/images/ic005_5.png" alt="等級5" title="分成1~5等級，愈大難度愈高。" /></li>
                <li>適合：有設計網頁及撰寫 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 語法經驗者。</li>
                <li>說明：利用不同瀏覽器對 <a href="http://www.w3.org/TR/css3-selectors/" title="造訪W3C網站/英文"><dfn xml:lang="en" lang="en">CSS selectors</dfn></a> (指標) 支援程度的不同，使得 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 設計效果，可針對不同瀏覽器分別製作，一般稱這類處理方式為 <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> hacks</dfn> (<acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 區隔設計) 或  <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> filters</dfn>。</li>
                <li class="latest">更新：<span class="num date">2009-06-03</span></li>
               </ul>
               <h2><dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> selectors</dfn> 的語法及對應有效的瀏覽器 (<dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> hacks</dfn>)</h2>
               <dl class="method CodeArea">
                <dt><acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>7</dt>
                <dd class="DisplayBox CodeBox">
<pre><code><span class="hilight_1">*+html</span> selector {css 設計內容}</code></pre>
                </dd>
                <dt><acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>7, <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>6 ~ <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>5.5</dt>
                <dd class="DisplayBox CodeBox">
<pre><code><span class="hilight_1">*+html</span> selector {css 設計內容}
<span class="hilight_1">* html</span> selector {css 設計內容}</code></pre>
                </dd>
                <dd class="DisplayBox CodeBox">
<pre><code>selector<span class="hilight_1">,</span> {css 設計內容}</code> (此詭異方法非 <acronym title="World Wide Web Consortium" xml:lang="en" lang="en">w3c</acronym> 標準，卻很方便)</pre>
                </dd>
                <dt><acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>6 ~ <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>5.5</dt>
                <dd class="DisplayBox CodeBox">
<pre><code><span class="hilight_1">* html</span> selector {css 設計內容}</code></pre>
                </dd>
                <dt><span xml:lang="en" lang="en"><dfn>firefox</dfn>, <dfn>opera</dfn>, <dfn>safari</dfn>, <dfn>google chrome</dfn></span> …等新式瀏覽器及 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>7 (含)以後版本</dt>
                <dd class="DisplayBox CodeBox">
<pre><code><span class="hilight_1">html&gt;body</span> selector {css 設計內容}</code>
或可簡化為 <code><span class="hilight_1">*&gt;</span>selector {css 設計內容} </code></pre>
                </dd>
                <dt><span xml:lang="en" lang="en"><dfn>firefox</dfn>, <dfn>opera</dfn>, <dfn>safari</dfn>, <dfn>google chrome</dfn></span> …等新式瀏覽器及 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>8 (含)以後版本</dt>
                <dd class="DisplayBox CodeBox">
<pre><code><span class="hilight_1">html&gt;/**/body</span> selector {css 設計內容}</code></pre>
                </dd>
                <dt><span xml:lang="en" lang="en"><dfn>firefox</dfn>, <dfn>opera</dfn>, <dfn>safari</dfn>, <dfn>google chrome</dfn></span> …等新式瀏覽器 (<acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 以外) [<a href="#HackNonIE" class="prompt">參考說明</a>]</dt>
                <dd class="DisplayBox CodeBox">
<pre><code><span class="hilight_1">html:root</span> selector {css 設計內容}</code></pre>
                </dd>
                <dt><acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>8 [<a href="#HackIE8" class="prompt">參考說明</a>]</dt>
                <dd class="DisplayBox CodeBox">
<pre><code><span class="hilight_1">html&gt;/**/body</span> selector {css 設計內容}
<span class="hilight_1">html:root</span> selector {css 設計內容}</code> (以此項覆蓋前項的定義，保留前項給 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>8)</pre>
                </dd>
                <dt><span xml:lang="en" lang="en"><dfn>firefox</dfn> (<dfn>Gecko</dfn> series), <dfn>google chrome</dfn>2, <dfn>safari</dfn>4</span> [<a href="#HackFx" class="prompt">參考說明</a>]</dt>
                <dd class="DisplayBox CodeBox">
<pre><code>selector<span class="hilight_1">:not([<span class="hilight_2">att</span>*=&quot;&quot;])</span> {css 設計內容}</code></pre>
                </dd>
                <dt><dfn xml:lang="en" lang="en">safari</dfn>, <dfn xml:lang="en" lang="en">google chrome</dfn> [<a href="#HackSafari" class="prompt">參考說明</a>]</dt>
                <dd class="DisplayBox CodeBox">
<pre><code>selector<span class="hilight_1">:not(:root:link)</span> {css 設計內容}</code></pre>
                </dd>
                <dt><dfn xml:lang="en" lang="en">Opera</dfn></dt>
                <dd class="DisplayBox CodeBox">
<pre><code><span class="hilight_1">html:root</span> selector {css 設計內容}
<span class="hilight_1">html:not(:link)</span> selector {css 設計內容}</code> (此項 <dfn xml:lang="en" lang="en">Opera</dfn> 無效)</pre>
                </dd>
                <dt><dfn xml:lang="en" lang="en">Opera</dfn> 9.5 (不含) 以前版本</dt>
                <dd class="DisplayBox CodeBox">
<pre><code><span class="hilight_1">html:first-child</span> selector {css 設計內容}</code></pre>
                </dd>
               </dl>
               <p>註：新式瀏覽器如未加註版本，以近期較新版為準。</p>
               <div class="comments">
                <h2>思考 - <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> hacks</dfn> 與 <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym>  selectors</dfn></h2>
                <p><code>selector {css 設計內容}</code> 這一部分和平常的 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 寫法完全一樣，而多加了一些有點陌生的符號 (紅色部分) ，變成「很另類」的 <dfn xml:lang="en" lang="en">selectors</dfn> ，就可以使設計內容在不同瀏覽器有效。可別小看這種 <dfn xml:lang="en" lang="en">selectors</dfn> 的寫法，它仍舊符合 <acronym title="World Wide Web Consortium" xml:lang="en" lang="en">w3c</acronym> 規範的語法。注意語法中有空格的地方不能隨意省去，因為意義會是不同的。</p>
                <h3><dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> hack</dfn> <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>6</h3>
<pre><code><span class="hilight_1">* html</span> selector {css 設計內容}</code></pre>
                <p>正常 <acronym title="HyperText Markup Language" xml:lang="en" lang="en">html</acronym> 文件的最外層元素就是 <code>html</code> 這個「唯一的」元素 (<dfn xml:lang="en" lang="en">elements</dfn>) ，而 <code class="hilight_1">* html</code> 的「*」指向 <code>html</code> 更外層的元素，當然是不存在的；但是 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 會誤認為有效，所以就可以利用此法設計只會在 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 呈現的 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 。</p>
                <h3><dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> hack</dfn> <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>7</h3>
<pre><code><span class="hilight_1">*+html</span> selector {css 設計內容}</code></pre>
                <p>正常 <acronym title="HyperText Markup Language" xml:lang="en" lang="en">html</acronym> 文件的最外層元素就是 <code>html</code> 這個「唯一的」元素，而 <code class="hilight_1">*+html</code> 的「*+」指向 <code>html</code> 同層 (<a href="http://www.w3.org/TR/css3-selectors/#adjacent-sibling-combinators" title="造訪W3C網站/英文"><dfn xml:lang="en" lang="en">adjacent sibling combinator</dfn></a>) 的元素，當然不存在；但是 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 7 會誤認為有效，所以就可以利用此法設計只會在 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 7 呈現的 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 。</p>
                <h3 id="HackIE8"><dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> hack</dfn> <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>8</h3>
<pre><code><span class="hilight_1">html&gt;/**/body</span> selector {css 設計內容}
<span class="hilight_1">html:root</span> selector {css 設計內容}</code></pre>
                <p>第一項在 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>8 及其它新式瀏覽器有效，而第二項只在非 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 的新式瀏覽器有效，所以只要在第二項定義 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 覆蓋掉第一項，就等同單獨為 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>8 指定。如，</p>
                <pre><code>html&gt;/**/body #main {color:blue;}
html:root #main {color:inherit;}</code></pre>
                <p><acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>8 字的顏色會以 <code>blue</code> 呈現，而其它瀏覽器則保留原來樣式。</p>
                <p>又如，</p>
                <pre><code>#main {background:yellow;}
html&gt;/**/body #main {background:orange;}
html:root #main {background:yellow;}</code></pre>
                <p><acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>8 背景色會以 <code>orange</code> 呈現，而其它瀏覽器則為 <code>yellow</code> 。</p>
                <h3><dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> hack</dfn> <span xml:lang="en" lang="en"><dfn>firefox</dfn>, <dfn>opera</dfn>, <dfn>safari</dfn>, <dfn>google chrome</dfn></span> …等新式瀏覽器</h3>
<pre><code><span class="hilight_1">html&gt;body</span> selector {css 設計內容}</code></pre>
                <p><code class="hilight_1">html&gt;body</code> 在語法上可以說是多餘的，因為 <acronym title="HyperText Markup Language" xml:lang="en" lang="en">html</acronym> 文件的最外兩層就是 <code>html</code> 和 <code>body</code> 這兩個唯一的元素，所以加不加這段，結果其實是一樣的；但是由於 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 沒有支援有 「<code class="hilight_1">&gt;</code>」 符號 (<a href="http://www.w3.org/TR/css3-selectors/#child-combinators" title="造訪W3C網站/英文"><dfn xml:lang="en" lang="en">child combinators</dfn></a>) ，就可以利用此方式為 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 以外的瀏覽器定義 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 設計。運用同樣的道理，大部分時候，可以將它簡化寫成 <code class="hilight_1">*&gt;selector</code> ，只是使用時要注意 <dfn xml:lang="en" lang="en">selector</dfn> 所指向的元素的階層關係，如果覺得搞不清楚，最好還是使用前者語法比較保險。</p>
<pre><code><span class="hilight_1">html&gt;/**/body</span> selector {css 設計內容}</code></pre>
                <p><code class="hilight_1">html&gt;/**/body</code> 和 <code>html&gt;body</code> 其實是同樣意義，因為符號 <code>/**/</code> 只是 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 定義裡的註解語法，瀏覽器應當忽略它不會影響原有的內容，但是 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 7 卻會因為這個位置加了註解符號而變成無效。</p>
                <h3 id="HackNonIE"><dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> hack</dfn> <dfn xml:lang="en" lang="en">non-ie</dfn> (非 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym>)</h3>
<pre><code><span class="hilight_1">html:root</span> selector {css 設計內容}</code></pre>
                <p>通常運用 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 未支援的 <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym>  selectors</dfn> 語法，就可以為 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 以外的瀏覽器 (<dfn xml:lang="en" lang="en">non-ie browsers</dfn>) 設計。</p>
                <p><a href="http://www.w3.org/TR/css3-selectors/#root-pseudo" title="造訪W3C網站/英文"><code>:root</code></a> <dfn xml:lang="en" lang="en">pseudo-class</dfn> 在 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 8 仍未支援，所以語法中 <code class="hilight_1">html:root</code> 就可以簡單地將 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 排除在外了。 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 還有其它尚未支援的 <dfn xml:lang="en" lang="en">selectors</dfn> 也都可以派上用場，像是運用 <a href="http://www.w3.org/TR/css3-selectors/#negation" title="造訪W3C網站/英文"><code>:not()</code></a> <dfn>negation pseudo-class</dfn> ，可以寫成如 <code><span class="hilight_1">html:not(:first-child)</span> selector</code> 或是 <code><span class="hilight_1">html:not(:empty)</span> selector</code> ，也都可以將 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 排除。 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 的支援程度總會較其它新式瀏覽器慢半拍，依循這個邏輯，就可以很輕易與 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 區隔設計了。</p>
                <h3 id="HackFx"><dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> hack</dfn> <dfn xml:lang="en" lang="en">firefox</dfn> (<dfn xml:lang="en" lang="en">Gecko</dfn> 核心的瀏覽器), <dfn xml:lang="en" lang="en">google chrome</dfn>2, <dfn xml:lang="en" lang="en">safari</dfn>4</h3>
<pre><code>selector<span class="hilight_1">:not([att*=&quot;&quot;])</span> {css 設計內容}</code></pre>
                <p>這個…真有點複雜，先對照例子看看。</p>
                <dl class="samples CodeArea">
                 <dt><code>xhtml</code></dt>
                 <dd class="DisplayBox CodeBox">
<pre><code>&lt;div class=&quot;content&quot;&gt;
 &lt;p&gt;花徑不曾緣客掃，蓬門今始為君開。&lt;/p&gt;
&lt;/div&gt;</code></pre>
                 </dd>
                 <dt><code>css</code></dt>
                 <dd class="DisplayBox CodeBox">
<pre><code>.content<span class="hilight_1">:not([class*=&quot;&quot;])</span> {background: lime;}</code></pre>
                 </dd>
                </dl>
                <p>需要注意的是語法中 <code>[<span class="hilight_1">att</span>*=&quot;&quot;]</code> 的 <code>att</code> 必須對應元素已有定義的屬性 (<dfn xml:lang="en" lang="en">attributes</dfn>) ，如例中 <code>div</code> 元素的 <code>class</code> 屬性。如果對應的是元素尚未定義的屬性，把上例改成 <code>.content:not([<span class="hilight_1">id</span>*=&quot;&quot;])</code> ，雖然語法上沒有錯誤，但是這會使其它新式瀏覽器也同樣有效，就不是僅僅 <dfn xml:lang="en" lang="en">hack firefox</dfn> ，而是 <span class="hilight_1"><dfn xml:lang="en" lang="en">hack</dfn> <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 以外的瀏覽器</span>了 (<acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 尚未支援 <a href="http://www.w3.org/TR/css3-selectors/#negation" title="造訪W3C網站/英文"><code>:not()</code></a> <dfn>negation pseudo-class</dfn>) 。還有要小心 <code class="hilight_1">:not</code> 前面沒有空格。</p>
                <h3 id="HackSafari"><dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> hack</dfn> <dfn xml:lang="en" lang="en">safari</dfn>, <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> hack</dfn> <dfn xml:lang="en" lang="en">google chrome</dfn></h3>
<pre><code>selector<span class="hilight_1">:not(:root:link)</span> {css 設計內容}</code></pre>
                <dl class="samples CodeArea">
                 <dt>對照前一個 <code>xhtml</code> 例子，<code>css</code> 可以是</dt>
                 <dd class="DisplayBox CodeBox">
<pre><code>.content<span class="hilight_1">:not(:root:link)</span> {background: orange;}</code></pre>
                 </dd>
                </dl>
                <p><a href="http://www.w3.org/TR/css3-selectors/#negation" title="造訪W3C網站/英文"><code>:not()</code></a> <dfn>negation pseudo-class</dfn> 括號內的<dfn>引數</dfn> (<dfn xml:lang="en" lang="en">argument</dfn>) ，依據 <acronym title="World Wide Web Consortium" xml:lang="en" lang="en">w3c</acronym> 的說明，應為 <a href="http://www.w3.org/TR/css3-selectors/#simple-selectors" title="造訪W3C網站/英文"><dfn xml:lang="en" lang="en">a simple selector</dfn></a> (<dfn>簡單指標</dfn>) ，但是未明確指出 <a href="http://www.w3.org/TR/css3-selectors/#selector-syntax" title="造訪W3C網站/英文"><dfn xml:lang="en" lang="en">a sequence of simple selectors</dfn></a> (<dfn>簡單指標串</dfn>) 是否可以，像是 <code>#main.box</code>, <code>*.content</code>, <code>*[class^=part]</code>, 或 <code>a:link</code> 之類。</p>
                <p>目前僅有 <dfn xml:lang="en" lang="en">safari</dfn> 及 <dfn xml:lang="en" lang="en">google chrome</dfn> 支援 <code>:not()</code> 括號內<dfn>引數</dfn>可以是 <dfn xml:lang="en" lang="en">a sequence of simple selectors</dfn> ，所以就利用這個特點來作區隔。依照這個邏輯，寫法就可以很多彈性變化了，如 <code>selector<span class="hilight_1">:not(*:root)</span></code>, <code>selector<span class="hilight_1">:not(*.xyz)</span></code>, 或 <code>selctor<span class="hilight_1">:not(*[title=xxx]</span>)</code> ，都一樣有效。甚至改成 <code><span class="hilight_1">html:not(*:empty)</span> selector{css 設計內容}</code> 也是可以的，既豐富又有趣。另外，需要小心如果<dfn>引數</dfn>裡有<dfn>元素</dfn>名稱的 <a href="http://www.w3.org/TR/css3-selectors/#type-selectors" title="造訪W3C網站/英文"><dfn xml:lang="en" lang="en">type selector</dfn></a> (型態指標)， <dfn xml:lang="en" lang="en">opera</dfn> 會造成之後 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 設計無效。</p>
                <h3 id="HackHeight"><dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> hacks</dfn> 處理最小高度 (<code>min-height</code>) 及高度 (<code>height</code>) (<dfn xml:lang="en" lang="en">hack <acronym title="Internet Explorer">ie</acronym> bugs</dfn>)</h3>
                <p>提到有關 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 指定「高度」的問題，始作俑者就是 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 。 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 並未支援 <a href="http://www.w3.org/TR/CSS21/visudet.html#propdef-min-height" title="造訪W3C網站/英文"><code>min-height</code></a> 特性，這也無可厚非，不過最糟糕的是把 <a href="http://www.w3.org/TR/CSS21/visudet.html#propdef-height" title="造訪W3C網站/英文"><code>height</code></a> 特性拿來代替 <code>min-height</code> 特性，這也就造成廣大仰賴 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 的網頁設計者，遭遇後來新版 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 及其它新式瀏覽器時，發生版面內區塊的內容超出、重疊、或擠成一堆的狀況。實際上 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 的呈現方式是錯誤的，以前看不出來就算了，現在就不能繼續將錯就錯下去了，幸好，我們可以運用 <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> hack</dfn> 將 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 的定義區隔起來。</p>
                <dl class="samples CodeArea">
                 <dt>例如 <code>xhtml</code></dt>
                 <dd class="DisplayBox CodeBox">
<pre><code>&lt;div id=&quot;main&quot;&gt;
 &lt;p&gt;勸君更盡一杯酒，西出陽關無故人。&lt;/p&gt;
&lt;/div&gt;</code></pre>
                 </dd>
                 <dt><code>css</code></dt>
                 <dd class="DisplayBox CodeBox">
<pre><code>#main {min-height: 200px;}</code></pre>
                 </dd>
                </dl>
                <p>這是常會遇到的狀況，網頁設計者可能因設計需要而必須指定元素 <code>div</code> 有一個高度 (如 <code>200px</code>)，但是如果「內容」(<a href="http://boohover.pixnet.net/blog/post/18087970#BoxModel" xml:lang="en" lang="en">content</a>) 增加時，可能會超過 <code>200px</code> ，也希望 <code>div</code> 的高度會隨著「內容」增高。正常狀態下，我們只需要單純地以 <code>#main</code> 這個 <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> selector</dfn> 指定 <code>min-height</code> 就可以了，如例中 <code>#main {min-height: 200px;}</code> 。不過， <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 沒有支援 <code>min-height</code> 特性，所以對該項定義就不會有作用。如果要讓 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 也能達到同樣效果，就必須用到 <code>height</code> 特性，但是直接增加 <code>height</code> 將會使所有瀏覽器同時有效，如：</p>
                <dl class="samples CodeArea">
                 <dt>這樣的 <code>css</code> <span class="hilight_1">不會是想要的結果</span></dt>
                 <dd class="DisplayBox CodeBox">
<pre><code>#main {
 min-height: 200px;
 height: 200px;
}</code></pre>
                  </dd>
                </dl>
                <p>指定了 <code>height</code> 也就是 <code>div</code> 的高度被「固定」了，那麼 <code>min-height</code> 就沒意義了，就算內容增加也不會改變「固定的」高度 (如 <code>200px</code>) ，過多的內容只會以「越出」 <code>div</code> 的高度範圍顯示，就可能與其它的區塊重疊，看起來就像擠成一堆。因此， <code>height</code> 必須另外區隔給 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 才可以達到我們想要的結果。 </p>
                <dl class="samples CodeArea">
                 <dt>正確的 <code>css</code></dt>
                 <dd class="DisplayBox CodeBox">
<pre><code><span class="hilight_3">#main</span> {min-height: 200px;}
<span class="hilight_1">* html</span> <span class="hilight_3">#main</span> {height: 200px;}</code> <span class="hilight_3">/*僅 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 ~ <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 5.5 有效*/ </span></pre>
                 </dd>
                </dl>
                <p><acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 對第一項定義的 <code>min-height</code> 沒有作用，但是會讓第二項有效；而新式瀏覽器只會讓第一項的定義有效，但第二項不會作用。如此就是運用 <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> hack</dfn> 的技巧，讓 <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 6 能以 <code>height</code> 達成「最小高度」的目的，但是又不影響其它瀏覽器。</p>
                <p>本篇所提 <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> hacks</dfn> 技巧，主要是設計者可以經由 <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> selectors</dfn> 的變化，做到在不同瀏覽器可有不相同的 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 設計，提供設計者很大的發揮空間，而且與平常定義 <acronym title="Cascading Style Sheets" xml:lang="en" lang="en">css</acronym> 特性完全相同；當然， <dfn xml:lang="en" lang="en"><acronym title="Cascading Style Sheets">css</acronym> hacks</dfn> 還有其它不同方式，設計者應視狀況使用，如何善加運用還是決定在設計者。</p>
               </div>
               <dl class="resources">
                <dt>參考資源</dt>
                <dd>
                 <ul class="RegularList">
                  <li><a title="造訪其他網站" href="http://www.webdevout.net/css-hacks#in_css"><span xml:lang="en" lang="en">CSS hacks</span></a> - 多種不同方式的詳細研討，內容較繁長 (英文) 。</li>
                  <li><a title="造訪其他網站" href="http://centricle.com/ref/css/filters/"><span xml:lang="en" lang="en">centricle CSS filters</span></a> - 各種瀏覽器及版本列表，完整但較不易理解 (英文) 。</li>
                  <li><a href="http://boohover.pixnet.net/blog/post/12309095">條件式註解 <span xml:lang="en" lang="en">Conditional Comments</span></a> -  <acronym title="Internet Explorer" xml:lang="en" lang="en">ie</acronym> 專屬的 <acronym title="HyperText Markup Language" xml:lang="en" lang="en">html</acronym> 方式。</li>
                  <li><a title="造訪其他網站" href="http://onhavinglayout.fwpf-webdesign.de/hack_management/"><span xml:lang="en" lang="en">Thoughts on IE hack management</span></a> - 各種方式比較與說明 (英文) 。</li>
                 </ul>
                </dd>
               </dl>
               <div class="others"><span class="copyright">散佈、展示請參閱 <a href="http://creativecommons.org/licenses/by-nc-nd/2.5/tw/" title="造訪創用CC條款"><dfn xml:lang="en" lang="en">Creative Commons</dfn> 授權條文</a>，禁止重混，引述請增加原文連結。</span></div>
  <div class="more"><a href="http://boohover.pixnet.net/blog/post/8947951">(Read More...)</a></div>]]></content:encoded>
      <pubDate>Tue, 18 Sep 2007 09:09:52 +0000</pubDate>
      <category>CSS hacks</category>
      <comments>http://boohover.pixnet.net/blog/post/8947951#comments</comments>
    </item>
  </channel>
</rss>
