- From: Kang-Hao (Kenny) Lu <kennyluck@w3.org>
- Date: Tue, 10 Apr 2012 00:07:09 +0800
- To: W3C HTML5 中文興趣小組 <public-html-ig-zh@w3.org>
我在給 CSS3 取值與單位模組(CSS Values and Units Module Level 3,以後簡 稱 CSS3 V&U)找碴的時候,發現到 cycle() [1]的定義似乎不能滿足我想像的使 用情節。目前的定義如下: # ‘cycle()’ 回傳的值必須透過比較繼承值 I(一般是父元素的計算值,若對 # 象是根元素的時候,使用屬性的初始值)與 ‘cycle()’ 的第 n 個參數的計 # 算值 Cn 來決定。若 Cn 是滿足 Cn = I 的最前面的值,則 ‘cycle()’ 回 # 傳 Cn+1。不然,若 Cn 是最後的值,又或沒有等於 I 的 Cn,則回傳第一個 # 值的計算值。 而我想像的使用情節是 使用情節 1:在一個由巢狀的 <table> 構成的使用者介面中,對 <table> 交替使 用不同的 'background-color'。參考圖片[2]。 我本來以為 table { background-color: cycle(gray, white); } 之類的就可以,我也問過 doyle 說「你覺得這個問題要怎麼用 CSS 解決」他也直 接說 'cycle()'。但是按照上面的定義的話,其實不行,因為假如 <table> 跟 <table> 之間有別的元素(在這個介面中當然有 <td> 等等),'background- color' 的繼承值會變回初始值:'none',所以最後會變成每個 <table> 的 'background-color' 都是 'gray'。 [1] http://www.w3.org/html/ig/zh/wiki/Css3-values#cycle [2] http://www.w3.org/DesignIssues/diagrams/tabulator/Picture07.png 這裡我想了不少,想到的兩個解決方案是: 解決方案 A: 更改上述定義成 | 繼承值 I 的定義如下:若屬性可繼承,繼承值為父元素的計算值或屬性的初 | 始值(根元素的時候)。若屬性不可繼承,繼承值為計算值不是屬性初始值的 | 祖先元素中,最靠近對象元素的那一個祖先元素的計算值,或屬性的初始值( | 對象元素是根元素或是祖先元素的計算值全部都是初始值得時候) | | ‘cycle()’ 回傳的值必須透過比較繼承值 I 與 ‘cycle()’ 的第 n 個參 | 數的計算值 Cn 來決定。若 Cn 是滿足 Cn = I 的最前面的值,則 |‘cycle()’ 回傳 Cn+1。不然,若 Cn 是最後的值,又或沒有等於 I 的 Cn, | 則回傳第一個值的計算值。 也就是在非繼承屬性的時候特別無視初始值。不過其實我不太清楚這種使用不是直 接父元素的資訊的方案是不是可實作的。 我另外想了更複雜的方案,等於是重寫 'cycle()' 的運作方式,不過或許更直觀 一點,未來的發展性也說不定更高一點。 解決方案 B: | 每個 ‘cycle()’ 對應一個無名計數器,初始值為 0。每當進入一個設有這 | 個 ‘cycle()’ 的元素的時候,對應計數器加 1,離開的時候計數器減 1。 |‘cycle()’回傳第 counter(anonymous) mod L 個值(從 0 算),其中 L 是 | ‘cycle()’的 <value> 個數。 這個方案其實讓 使用情節 2(範例十七):在巢狀 <ul> 中,輪流使用不同的標記。 更簡單: ul { list-style-type: cycle(disk, circle, square, box); } 現在的範例十七之所以需要用 ul { list-style-type: disk; } li > ul { list-style-type: cycle(disk, circle, square, box); } 是因為 'list-style-type' 的初始值就是 'disk',如果照原先定義,使用上面那 個就會變成第一層 <ul> 是 'circle'。(也就是,原先定義中 'cycle()' 是描述 「若父元素是 A,則變成 B」,我的定義直接是讓 'cycle()' 描述「第 N 層使用 第 N 個值」,也就是不需要特別知道父元素繼承下來的值是什麼。) 但是卻完全不能解決 使用情節 3(範例十六):若 em 不在斜體裡面,使用斜體,若在斜體裡面,使用 一般體。 因為那就是需要「若父元素是 A,則變成 B」的場合。或許有一個專有的 'toggle()' 比較好? 我的定義如果可以不用無名計數器,而直接使用有名計數器的話,CSS 就變成可以 使用一般程式語言的列了、、、 先不天馬行空,不知道大家對這個問題有什麼想法,我自己是覺得使用情節 1 比 使用情節 3 出現的機率高,3 又比 2 高,所以這兩個解決方案之一一定要被採 用,還有其他方案嗎? 又,有沒有人可以幫忙找找類似使用情節 1 的其他情節,或是發揮創意看看 CSS 有列的時候到底在什麼樣的使用情節會有用。基本上回到使用情節討論問題會比較 踏實一點。 此致 呂 康豪(Kenny), 中文興趣小組W3C連絡人 新浪微博: http://t.sina.com.cn/1950042164 Google+: https://plus.google.com/112088462407783855918/posts
Received on Monday, 9 April 2012 16:07:41 UTC