font-sizeをremで指定する

コーディングでフォントサイズをpxではなくremで指定した方が、アクセシビリティの観点からいいとされていますが、その理由とsassでpx → remへ変換する自作関数について紹介します。

絶対値と相対値

私の足のサイズは25.5cmですが、これはどこにいても25.5cmで変わらず、絶対値と呼ばれます。
WEBの場合pxが絶対値になるので、font-size: 16px;と指定したらデバイスやブラウザ環境に左右されることなく16pxで表示されます。
ブラウザの設定で文字サイズを大きく設定したユーザーにとっても、設定が活かされずに同じ16pxで表示されてしまいます。

「90%」といわれたら、何かの基準に対しての90%→相対的な数値になります。
WEBでいうと %、em、rem が相対値になります。

1emも1remも両方とも「1文字分」になりますが、基準としているものが違います。
フォントサイズに指定する場合、1emは親のフォントサイズ1文字分、1remはhtmlのフォントサイズ1文字分になります。

特に指定がなけれはhtmlのフォントサイズは16pxなので、1rem=16pxとして計算します。
font-size: 1rem; と指定することで、指定がなかれば16px、ブラウザ設定で文字サイズを大きくしていれば20px・・・といったようにユーザーの設定を反映させた指定ができます。

計算が大変

たとえば14pxをremで指定しようとすると、14÷16=0.875rem、といったように計算が面倒になります。より直感的にrem指定ができるようにする方法を2つ紹介します。

font-size: 62.5%

1つ目は、htmlのフォントサイズを62.5%にするという手法です。
すると、1remは16×0.625=10pxになります。
14pxを指定する場合は1.4remになるので、わかりやすいですね。

sassの自作関数を使う

以前紹介した単位を除く関数と組み合わせて、cssにコンパイルした時にrem に変換されるスニペットを作っておく方法もあります。

数値の単位を除く関数strip-unitのコードはコチラです↓

//function.scss
@use 'sass: math';
@use 'sass: meta';
@function strip-unit($number){
  @if meta.type-of($number) == 'number' and not math.is-unitlless($number){
    @return math.div($number, $number * 0 + 1);
  }
  @return $number;
}

この関数を利用して、pxをrem変換する関数を自作します。

@use 'sass: math';

@function rem($pixel, $base: 16){
  @if math.unit($pixel) != 'px'{
    @warn '引数には、単位がpxの数値を入れて下さい'
  }
  @return math.div(stip-unit($pixel), 16) * 1rem;
}

引数$pixelに入れた数値がそのまま単位が外れて、16で割った数値にremがつきます。
使い方としては

//sass
.hoge{
  font-size: rem(42px);
}


//コンパイル後↓
.hoge{
  font-size: 2.625rem;
}

このような感じになります。

いいなと思ったら応援しよう!