Sassで角度の単位を変換する関数を書いてた。
$PI: 3.141592653589793;
@function convert-angle($angle, $to-unit) {
$from-unit: unit($angle);
$from-value: strip-unit($angle);
$factors: (
rad: 1,
deg: 180 / $PI,
grad: 200 / $PI,
turn: 0.5 / $PI
);
@if not map-has-key($factors, $from-unit) {
@warn '`#{$angle}` is not an <angle>.';
@return false;
}
@if not map-has-key($factors, $to-unit) {
@warn '`#{$to-unit}` is not a valid <angle> unit.';
@return false;
}
$rad-value: $from-value / map-get($factors, $from-unit);
@return $rad-value * map-get($factors, $to-unit) + $to-unit;
}
@function strip-unit ($number) {
@if unitless($number) {
@return $number;
} @else {
@return $number / ($number * 0 + 1);
}
}
単位を取り除いた上でいったんrad
単位の値に変換し、さらにそこから指定の単位に変換する、という実装。
でも実は、知らなかったんだけど、Sassはネイティブで単位の異なる角度の演算ができる。
@debug 180deg + 0.25turn + 100grad; // 360deg
演算結果は最初に登場した単位になる。これを応用して、値が0の角度を使えば単位の変換はごく簡単にできる。たとえばdeg
からrad
へ変換するにはこう。
@debug 0rad + 180deg; // 3.14159rad
つまり冒頭の関数はまったく不要。どうやら4年前のSass 3.4からの話のようで、<angle>と同じように<time>、<frequency>、<resolution>も単位の異なる演算ができる。半日無駄にした。