在 ul 左側加上線條,當做樹狀結構的垂直線,並且左邊空出一點距離,讓子選項內容 li 看起來向內縮排。這個距離應該是要對應分類標題 h1 來設計,我們指定了向內縮半個字 (0.5em),所以線看起來像是由標題第一個字中間向下延伸;標題最前面如果變成小圖示 (icons) ,那就以圖示寬度的一半去定義縮排距離也可以。這裡應該以 margin 來指定內縮距離,因為我們必須讓垂直線緊貼著 li 。線條寬度沒有使用 em 定義,是因為 1px 寬幾乎沒什麼影響,但是如果需要設計較粗的線,單位最好一致。
在子選項 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;
}
明顯地,現在面臨兩個問題:一、字的背面不應該有線。二、因為 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%);
}
*+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 相同。
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 裡了 (綠字) ,有興趣可以自行試試。
css 3D 立方體動畫
CSS 3D 動畫瘋 (範例來源連結)