2024.12.26 Web制作
Scss/flocssで自作ユーティリティー font-size / font-weight編
font-sizeでは、u-fs-20やu-fs-md-24など「u-fs」、font-weightではu-fw-boldやu-fw-mediumなど「u-fw」の接頭辞がついた、ユーティリティーを作成します
フォルダ構成やutilityの適用順などはflocssを基準にしています
社内のコーディング共通フォーマットとして少しずつ独自の改良をしてきた設定です
下記もあわせてご覧ください
- Scss/floccsで自作ユーティリティー margin / padding編
- Scss/floccsで自作ユーティリティー display / gap編
- Scss/floccsで自作ユーティリティー font-size / font-weight編
- Scss/floccsで自作ユーティリティー border編
- Scss/floccsで自作ユーティリティー width編
- Scss/floccsで自作ユーティリティー color / background-color編
ゴール
- media queryのサイズによる階層的な適用が確実にされること
- font-size
- オリジナル名称の設定を作成すること
- ピクセルごとの設定を作成すること
- font-weight
- weight名で設定できること
前提
foundation/variable
使用しないbreak pointを入れておくと無駄な設定ができてしまいますので、注意してください
$break-points: (
all: '',
lg: 'screen and (max-width: 1024px)',
md: 'screen and (max-width: 820px)',
) !default;
$font-sizes: (
sm: (14, 13, 12),
md: (20, 19, 18),
lg: (28, 27, 26),
);
$font-weights: (
thin: 100,
extra-light: 200,
light: 300,
regular: 400,
medium: 500,
semibold: 600,
bold: 700,
extra-bold: 800,
black: 900,
);
foundation/mixin
@use 'sass:map';
@use 'sass:math';
@function Rem($size) {
@return math.div($size, 10) + rem;
}
@mixin mq($breakpoint: md) {
@if($breakpoint == 'all') {
@content;
} @else {
@media #{map.get($break_points, $breakpoint)} {
@content;
}
}
}
使用法
font-size
オリジナル名称の設定
.u-fs-{$font-sizes}
ピクセルごとの設定
.u-fs-{数値}
.u-fs-{$break-points}-{数値}
パラメータ
{数値} … 10~32
{$font-sizes}は、上記前提を参照
font-weight
オリジナル名称の設定
.u-fw-{重さ}
.u-fw-{$break-points}-{重さ}
パラメータ
{重さ} … 上記前提の$font-weights
使用例
<h2 class="u-fs-sm u-fw-regular u-fw-lg-bold u-fw-md-medium">
・・・
</h2>
上記では、画面幅により下記のようになります
- 1025px以上:「u-fs-sm」でfont-sizeが1.4rem / 「u-fw-regular」でfont-weitが400
- 821~1024px:「u-fs-sm」でfont-sizeが1.3rem / 「u-fw-lg-bold」でfont-weitが700
- 820px以下:「u-fs-sm」でfont-sizeが1.2rem / 「u-fw-md-medium」でfont-weitが500
$font-weights: (
thin: 100,
extra-light: 200,
light: 300,
regular: 400,
medium: 500,
semibold: 600,
bold: 700,
extra-bold: 800,
black: 900,
);
$font-sizes: (
sm: (14, 13, 12),
md: (20, 19, 18),
lg: (28, 27, 26),
);
上記$font-sizesの設定は、この名称は自由に作成できるため、例えば、h1variationやh2variationなどの設定を作成することで、複数の文字設定も作成できます。
最終形
上記の前提は、各環境にあわせ別ファイルとして振り分け、下記ファイルで読み込んでください
font-size
@use 'sass:map';
@use '../../foundation/variable' as *;
@use '../../foundation/mixin' as *;
// -----------------------------------------------------------------
// Font-Size
// -----------------------------------------------------------------
.u-fs {
@each $breakpoint, $query in $break-points {
@include mq($breakpoint) {
// $font-sizesのkey名で設定
@each $name, $values in $font-sizes {
$num: index(map.keys($break-points), $breakpoint);
&-#{$name} {
font-size: #{Rem(nth($values, $num))} !important;
}
}
@for $i from 10 through 32 {
@if $breakpoint=='all' {
&-#{$i} {
font-size: Rem($i) !important;
}
} @else {
&-#{$breakpoint}-#{$i} {
font-size: Rem($i) !important;
}
}
}
}
}
}
font-weight
// 上記前提が記載されたファイル
@use '../../foundation/variable' as *;
@use '../../foundation/mixin' as *;
// -----------------------------------------------------------------
// Font-Weight
// -----------------------------------------------------------------
.u-fw {
@each $breakpoint, $query in $break-points {
@include mq($breakpoint) {
@each $key, $weight in $font_weights {
@if $breakpoint=='all' {
&-#{""+$key} {
font-weight: $weight !important;
}
} @else {
&-#{$breakpoint}-#{""+$key} {
font-weight: $weight !important;
}
}
}
}
}
}
解説
上記最終系を一つずつ見ていきます。下記はfont-size及びfont-weightで同じです
ループ設定
$break-points: (
all: '',
lg: 'screen and (max-width: 1024px)',
md: 'screen and (max-width: 820px)',
) !default;
上記$break-pointsをループして展開していきます(font-weightの場合は、u-fsの部分はu-fwとなります。以下同様)
.u-fs {
@each $breakpoint, $query in $break-points {
@include mq($breakpoint) {
・・・
}
}
展開されるイメージは下記の通りです
.u-fs {
// all
// lg
@media 'screen and (max-width: 1024px)' {
}
// md
@media 'screen and (max-width: 820px)' {
}
}
最初の$breakpointは「all」となりますが、下記mixinでは、allの場合は、特に処理を行っていませんので空になります
@mixin mq($breakpoint: md) {
@if($breakpoint == 'all') {
@content;
} @else {
@media #{map.get($break_points, $breakpoint)} {
@content;
}
}
}
ここでのポイントは、「$break-points」を大きいサイズから設定していことです
詳細クラスの設定
font-size
オリジナル名称の設定
配列「$font-sizes」を展開していきます
$font-sizes: (
sm: (14, 13, 12),
md: (20, 19, 18),
lg: (28, 27, 26),
);
$font-sizesにある各変数のカッコ内の数字は、$break-pointsの数と同じ数設定しています
したがって、ここは、左から「all」「lg」「md」のpxサイズを数値のみで設定しています
.u-fs {
@each $breakpoint, $query in $break-points {
@include mq($breakpoint) {
@each $name, $values in $font-sizes {
$num: index(map.keys($break-points), $breakpoint);
&-#{$name} {
font-size: #{Rem(nth($values, $num))} !important;
}
}
}
}
}
上記ブロックの真ん中の部分を解説していきます
@each $name, $values in $font-sizes {
$font-sizesをeach文で展開していますが、ここでは、最初は「$name」に「sm」が、「$values」には「(14, 13, 12)」が入ることになります
$num: index(map.keys($break-points), $breakpoint);
map.keysで$break-pointsのkeyだけの配列を作成しています。結果は「all, lg, md」となります
そしてindex関数で、「all, lg, md」の中でall(二つ目のループで最初の$breakpointは「all」)の位置を取得しています。ここでは「1」が$numとして設定されます
&-#{$name} {
「&-#{$name} {」は、$marginsの最初のキーのsmを使用して「&-sm {」となり、結果として「.u-fs-sm」が作成されます
font-size: #{Rem(nth($values, $num))} !important;
「nth($values, $num)」では、nth関数で、$values、つまり「(14, 13, 12)」のうち、$numの値の順番(最初は「1」)にある値を取得し、Rem関数でremの値に変換しています
結果として「font-size: 1.4rem !important;」という記述が作成されます
下記が展開イメージとなります
// all
.u-fs-sm {
font-size: 1.4rem !important;
}
// lg
@media 'screen and (max-width: 1024px)' {
.u-fs-sm {
font-size: 1.3rem !important;
}
}
// md
@media 'screen and (max-width: 820px)' {
.u-fs-sm {
font-size: 1.2rem !important;
}
}
・・・
ピクセルごとの設定
次にピクセル単位の設定を行います
下記のループ部分は、上記と同じです。2番目のブロックについて解説します
.u-fs {
@each $breakpoint, $query in $break-points {
@include mq($breakpoint) {
@for $i from 10 through 32 {
@if $breakpoint=='all' {
&-#{$i} {
font-size: Rem($i) !important;
}
} @else {
&-#{$breakpoint}-#{$i} {
font-size: Rem($i) !important;
}
}
}
}
}
}
今回は、10~32の数値で設定しています
@for $i from 10 through 32 {
「@for $i from 0 through 180」が0~180までの数値をループし$iに0から順に数字を代入しています
@if $breakpoint=='all' {
上記同様allの場合の振り分けをしています
下記が展開イメージです
// all
.u-fs-10 {
font-size: 1rem !important;
}
// lg
@media 'screen and (max-width: 1024px)' {
.u-fs-lg-10 {
font-size: 1rem !important;
}
}
// md
@media 'screen and (max-width: 820px)' {
.u-fs-md-0 {
font-size: 1rem !important;
}
}
・・・
font-weight
$font-weights: (
thin: 100,
extra-light: 200,
light: 300,
regular: 400,
medium: 500,
semibold: 600,
bold: 700,
extra-bold: 800,
black: 900,
);
上記配列「$font-weights」を展開していきます
.u-fs {
@each $breakpoint, $query in $break-points {
@include mq($breakpoint) {
@each $key, $weight in $font_weights {
@if $breakpoint=='all' {
&-#{""+$key} {
font-weight: $weight !important;
}
} @else {
&-#{$breakpoint}-#{""+$key} {
font-weight: $weight !important;
}
}
}
}
}
}
上記ブロックの真ん中の部分を解説していきます
@each $key, $weight in $font_weights {
$font_weightsをeach文で展開していますが、ここでは、最初は「$key」に「thin」が、「$weight」には「100」が入ることになります
@if $breakpoint=='all' {
allの場合の振り分けをしています
下記が展開イメージです
// all
.u-fw-thin {
font-weight: 100 !important;
}
// lg
@media 'screen and (max-width: 1024px)' {
.u-fw-lg-thin {
font-weight: 100 !important;
}
}
// md
@media 'screen and (max-width: 820px)' {
.u-fw-md-thin {
font-weight: 100 !important;
}
}
・・・
まとめ
以上でfont-sizeとfont-weightのユーティリティーの完成となります
全設定が吐き出されてしまうと膨大な量になってしまいますが、弊社では、vite+@fullhuman/postcss-purgecssなどを使って、余計なclassは入らないようにしていますので、そういった工夫も必要になるかと思います
コーディングの省力化に貢献できれば幸いです
文責:フライング・ハイ・ワークス代表 松田 治人(まつだ はるひと)
会社では、Laravelを中心としたエンジニアとして働いており、これまでに50本以上のLaravelによるWebアプリケーションの構築や東京でホームページ制作をしています。
エンジニアとして弊社で働きたい方、お仕事のご相談など、お待ちしております。
WEBサイト・ホームページの制作をご検討の方
フライング・ハイ・ワークスの紹介
フライング・ハイ・ワークスは、東京のホームページ制作・Web制作会社・システム開発会社です。東京都及びその近郊(首都圏)を中心として、SEO対策を意識したPC及びスマホのサイトをワンソース(レスポンシブ対応)で制作します。
実績
デザイナーチームは、グラフィックデザインやイラストの制作も得意としており、著作権を意識しない素材の提供が可能です。システム・コーディングチームでは、Laravelなどを使用したスクラッチからのオリジナルシステム開発を始め、WordPressのカスタマイズを得意としております。
また、SEOやランディングページ(LP)、広告向けバナーなどを他社様でやっていた作業の引継ぎでも問題ありません。制作実績は多数ございますので、お客様に合わせたご提案が可能です。
500点以上のフライング・ハイ・ワークスの制作実績ページをご覧ください。