- From: Kang-Hao (Kenny) Lu <kennyluck@w3.org>
- Date: Wed, 06 Apr 2011 19:46:08 +0900
- To: 中文HTML5同樂會ML <public-html-ig-zh@w3.org>
抱歉,再來一個 CSS 的討論。這是最近想到的最後一個了,下一個就是正統的 HTML5 討論了。 大家都知道: 1. CSS 很多屬性是速記屬性(shorthand),比如說 border = border-width + border-style + color,border-width = border-top-width + border-right-width + border-bottom-width + border-left-width 等等 2. transform 的用法是函數的疊加,比如說 transform: translate(100px) rotate(20deg) 是先順時針轉 20 度在向右移 100 度(以後要教學生數學就用 transform 教吧 :p) 在 CSS 工作組的郵件群組 www-style 上,一個叫做 Aaron Gustafoson 的 Web Developer 提了這個問題[1]: [[ 假設我有一個 id 為 demo 元素,有兩個狀態的 #demo { transform: scale(2); } #demo.state-1 { transform: scale(2) rotate(45deg); } #demo.state-2 { transform: scale(2) rotate(90deg); } 需要寫那個 scale(2) 一次又一次,很冗長,如果我們可以這樣做呢 #demo { transform: scale(2); } #demo.state-1 { transform-rotate: 45deg; } #demo.state-2 { transform-rotate: 90deg; } 也就是把 transform 拆成 transform-rotate, transform-translate, transform-scale 之類的,然後 transform 就是這些屬性的速記。怎麼樣呢? ]] [1] http://lists.w3.org/Archives/Public/www-style/2011Mar/thread#msg564 數學好的興趣小組成員可能一眼就會看出這種想法的問題在哪,其實問題關鍵在於 'transform: translateX(100px) rotate(45deg)' 跟 'transform: rotate(45deg) translateX(100px)' 是不一樣的變換!(又可以教數學了 xd)。 所以說如果 transform 是 transform-* 的速記的話 transform-rotate: 45deg; transform-translateX: 100px 會無法*簡單*的定義結果 其實類似的狀況還發生在 background-*(多背景) *-shadow(多陰影) 等等能 吃一排取值排序有差的屬性上,總之就是怎麼樣也可以只微調一部份的取值的這個 問題。 大家有什麼想法? www-style 上有一人(包括我)提了一些.... 有點不太漂亮的解法 == 解法一 == 其實只管 transform 的這個情形,可能有以下的辦法: 仍然引入 transform-* 但是它們不是 transform 的展開屬性,而是發生在 transform 之後的一些附加轉換,然後要定義一個發生的順序,比如說: transform > transform-scale > transform-skew > transform-rotate > transform-translate 這個解法的問題: 1. 上面的順序只能隨便選一個 2. transform 不是 transform-* 的速記恐怕會造成以後很多人學習的困擾 == 解法二(我提的) == 引入 also-transform 這個屬性。這個屬性就跟它的名字暗示的意思一樣,發生在 transform 之後的 transform,所以剛剛那個例子就是可以寫成: #demo { transform: scale(2); } #demo.state-1 { also-transform: rotate(45deg); } #demo.state-2 { also-transform: rotate(90deg); } 這種解法基本上可以推廣到 also-background 跟 also-*-shadow 等等,就是要定 義一個這些屬性的「累加」(例: also-background 總是畫在 background 之後 等等) 這個解法的問題: 名字太醜 所以總之目前為止用*比較正常*的方法是沒什麼好辦法的。但是以上名字太醜這個 問題,假如引入新的 CSS 的語法呢?例如:'+transform: rotate(45deg)' 之類呢。 我覺得一個很重要的問題應該問的問題是,SASS 對於這個問題到底有沒有解法, 有沒有熟 SASS 的人可以解釋一下的。用前置處理加上新的語法真的能解決這個問 題嗎? 大家千萬不要以為 SASS 跟 CSS 沒關係啊,現在 Google 的人在試玩的兩個提案 CSS Variable[2] 跟 CSS Mixins[3] 基本上都是 SASS 有很久的功能 :p [2] http://www.xanthir.com/blog/b4AD0 [3] http://www.xanthir.com/blog/b4Av0 大家覺得呢? 此致 Kenny, 中文興趣小組W3C連絡人 推特: http://twitter.com/kanghaolu 噗浪: http://www.plurk.com/kennyluck 新浪微博: http://t.sina.com.cn/1950042164 (還不是很有東西)
Received on Wednesday, 6 April 2011 10:43:48 UTC