Sassで角度の単位を変換

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>も単位の異なる演算ができる。半日無駄にした。