見出し画像

[Sass] 「@for」と「変数」を使うとmargin/paddingの管理が楽になります。

「marginの値をclassで決めておいて、HTMLにはclassを記述する」というスタイルのコーディングがあります。
具体的には

CSSで 「.mt-30px」というclassに「margin-top:30px」を設定し、

.mt-30px{
    margin-top: #{$step}px;
}

HTMLで「class="mt-30px"」指定すると上のマージンが30pxになる、という書き方です。

<li class="mt-30px">上のマージンを30pxにします</li>

好みの問題は一旦置いておいて、
この書き方は大規模サイトに向いています。
スタイルを統一しやすいからです。

この書き方のデメリット(解決します)

「.mt-30px」のようなクラスを用意するのですが、「.mt-40px」「.mt-50px」、、、と増えるとCSSを書くのが面倒です。
さらに、
上下左右にmarginを用意したい。。。
同じことをpaddingでもやりたい。。。

となるとCSSがどんどん大きくなります。メンテナンスも面倒です。

このデメリットをSassで解決します

手順は2ステップです。ひとつずつやっていきます。

[STEP1] @forでループ処理する

@for文は fromからthroughまでループ処理してくれます。

下のコードを説明します。

from 1 through 10 は「1から10まで(10回)ループする」という意味です。
$iというのは変数です。
(名前は何でも良いのですがループ処理だと$iがよく使われます)
ループを行うと$iには1から10の値が順番に入っていきます。
つまり「1、2、3、4、5、6、7、8、9、10」です。

次に$step: $i * 5; です。
「$stepという変数は$1に5をかけた値が入る」という意味です。
ですので、
$stepの値は5から50までの値が順番に入ります。
つまり「5、10、15、、、、45、50」です。

@for $i from 1 through 10 {
     $step: $i * 5;
}

[STEP2] ループ処理した値をmarginの値として使う

下のコードを説明します。

#{$step}$stepに入っている値を文字として使うよという意味です。

例えば $step の値が の場合、
「.mt-#{$step}px」は「.mt-5px」と同じです。
同様に、
「margin-top: #{$step}px」は「margin-top: 5px」と同じです。

ですので、下のコードをループ処理するだけで
「margin-top: 5px」〜「margin-top: 50px」
の指定が完了します。

@for $i from 1 through 10 {
    // step には550が入る
    $step: $i * 5;
    
    // .mt-5px 〜 .mt-50px を書く
    .mt-#{$step}px {
        margin-top: #{$step}px;
    }
}

下のコードのように
margin-bottom や left、rightもまとめて指定できます。

@for $i from 1 through 10 {
    // step には550が入る
    $step: $i * 5;
    
    // .mt-5px 〜 .mt-50px を書く
    .mt-#{$step}px {
        margin-top: #{$step}px;
    }
    .mb-#{$step}px {
        margin-bottom: #{$step}px;
    }
    .ml-#{$step}px {
        margin-left: #{$step}px;
    }
    .mr-#{$step}px {
        margin-right: #{$step}px;
    }
}

以上でコードの説明は終わりです。
Sassにはとても便利な機能があるのでぜひ使ってみてください。

[補足]

paddingを設定したい場合は上のコードのmarginをpaddingにします。
$step: $i * 10;にすれば10pxごとの指定が可能です。

[CodePen]

こちら

この記事が気に入ったらサポートをしてみませんか?