0
の値の場合に短い単位を採用するという処理は単純に実装できるが、0
でない値の場合はそれなりに面倒くさい。単純に考えれば愚直に単位の変換を行い一番短いものを採用するという形で良いが、それだとかなりコストがかかるだろう。つまり変換すると短くなるケースをある程度想定しなければならない。
時間はs
単位とms
単位のどちらで書いてもあまり長さは変わらない。s
単位の方が単位自体は短いものの、s
単位で時間を指定する場合は概ね小数点を書く必要があるので、その優位点はほぼないと言って良いだろう。ただ場合によってはs
単位の方が短くなる可能性がある。それはms
単位を使った値の末尾が0
の場合だ。
.test {
transition-duration: 210ms;
}
は、
.test {
transition-duration: .21s;
}
の方が1文字短い。末尾の0
を省略できるというわけだ。00
で終わっていると、なんと2文字も短くなる。
例外としては10ms
のようにs
単位にすると小数点だけでなく桁埋めの0
が必要になるケースだ。この場合はms
単位のままでも長さは変わらないので、処理するのは無駄ということになる。ms
単位の値が3桁以上、かつ0
で終わる場合に限って変換すれば良いだろう。
角度はrad
単位とturn
単位は短くなる可能性はあまりない(後述)。deg
単位は小数点が必要なく、概ね短くなりやすいので、これまた変換する必要はない。つまり短くなる可能性が高いのはgrad
単位だけになる。
grad
単位は400
で一周する。つまり400grad
が360deg
と等しいわけだ。小数の場合は変換すると問題が起こりそうなので、実際には整数の値を持つgrad
単位のことだけを考えれば良いだろう。短くなるパターンを頭の中だけで考えてみるのも難しいので、愚直に調査することにした。以下はdeg
単位に変換した方が短くなった場合のみ列挙するコードだ。
i / 400 * 360
という計算式だとi
が70
の時に62.99999999999999
を返してしまうので、先にきれいに割れる除算をし、それを乗算するようにしている。
var deg;
var grad;
for (var i = 0; i <=400; i++) {
grad = i + "grad";
deg = (i * (360 / 400)) + "deg";
if (deg.length < grad.length) {
console.log(grad, deg);
}
}
$ node test.js 10grad 9deg 20grad 18deg ... 390grad 351deg 400grad 360deg
つまりgrad
単位の値が10
の倍数の時、deg
単位でも整数になり、単位の短さのおかげで1文字短くなるようだ。
例外はこちらにもある。それは360deg
や1200grad
のような場合だ。この場合はturn
単位を使うと1turn
なり3turn
なり書けるため、何文字かの節約になる。
ベースが円周率であるrad
単位ではどう書かれていてもどう計算しても小数点以下が多くなるので、うまく短くなることはないだろう。turn
単位に関しては.25turn
は90deg
へと短く変換できる。小数点以下3桁までに限って整数のdeg
単位に変換できる場合はそうする、というのが良さそうだ……と、ここまで考えてturn
単位はサポートが怪しい(Android 2辺りが危険)ことがわかった。先の整数のパターンも含めて、このturn
単位へ変換するのはまずいようだ。
どちらも効果が高いものではないが、普通に書いてしまう600ms
などを.6s
へ変換してくれるのはそれなりに意義はあるだろう。CSSを書くにあたっては常にms
単位やdeg
単位を使い、安全に短くするのはツールに任せるというのは論理的に正しい処世術であるはずだからだ。
もう少し寝かせたらCSSWringへ取り込むことにした。多少、想定が甘いところがあるようなので、もう少し見守ってやる必要がありそうだ。