@for(フォー)は、繰り返しの命令文で、@forを使うことで指定した開始数値から終了数値まで、
1ずつ増えながら処理を繰り返す命令文です。また、@forの構文には2つの利用方法があります。
through構文は、指定した数値を含んだ繰り返し処理を実行します。
@for $value from 1 through 3 {
.sample_#{$value}{
margin-bottom:1px * $value;
}
}
コンパイル後
.sample_1{
margin-bottom:1px;
}
.sample_2{
margin-bottom:2px;
}
.sample_3{
margin-bottom:3px;
}
to構文は、指定した数値を含まずに繰り返し処理を実行します。
@for $value from 1 to 3 {
.sample_#{$value}{
margin-bottom:1px * $value;
}
}
コンパイル後
.sample_1{
margin-bottom:1px;
}
.sample_2{
margin-bottom:2px;
}
利用箇所のマークアップ状況や処理方法により、どちらを使用するかはかわるかと思いますが、through構文の方が、開始数値から終了数値以下を繰り返すので、直感的でわかりやすいかと思います。
それでは、実装方法を紹介させていただきます。
例として、下記のようなリストタイプのデザインをコーディングする場合、通常のCSSであれば、
それぞれのタグに画像を指定する事でコーディング対応はまったく可能ですが、少々行数が増えて
めんどいですね。
@forで繰り返し処理をするにあたり、書き出すルールとして、画像ファイル名は同じにして
画像ファイル名の最後に数字で連番化します。
これで画像の準備は完了です。
それではマークアップをしていきます。例えば先ほどのデザインをマークアップすると以下のようになります。
<ol>
<li><p>音楽</p></li>
<li><p>お気に入り</p></li>
<li><p>写真・素材</p></li>
<li><p>ソーシャル</p></li>
<li><p>お友だち</p></li>
<li><p>タグ一覧</p></li>
</ol>
これでマークアップは完了です。
それではコーディングをしていきます。アイコンは疑似要素に入れちゃいます。
ol{
display: flex;
flex-wrap: wrap;
justify-content: space-between;
& li{
width: 30%;
margin-bottom: 4.5rem;
display: flex;
align-items: center;
@for $i from 1 through 6 {
&:nth-child(#{$i}) {
&::before {
content: '';
display: inline-block;
width: 5rem;
height: 5rem;
background: url("../images/list-icon0#{$i}.png") top left no-repeat;
background-size: contain;
}
}
}
& p{
display: flex;
align-items: center;
}
}
}
これでSassコーディングは完了です。
for文の変数{$i}に、ループ処理が連番で入るので、この処理を利用して、連番付けをした画像ファイル名と同じになるよう、疑似要素で読み込ませているファイル名に、{$i}を利用し、background処理にて読み込ませます。
これでコーディングは完了、各画像を各リストにコーディングするより、グッと行数も減り、簡略化できたかと思います。
いかがでしたでしょうか。今回はfor文を使用して、それぞれのリストに別々の画像を表示させる処理を紹介させていただきました。
画像ファイル名は揃える必要があります。
アイコンの画像サイズがバラバラで個々にサイズ変更を当てないといけないという場合は、コーディング解決よりも、すべてのアイコンを同じサイズでトリミングして使うと効率的で、各端末の表示崩れにならずに済みます。
以上となります。できる限りわかりやすく伝えようとしても書いて伝えるのは難しいです。
コードや記事の書き方について気になるところがあれば、アドバイスいただけると嬉しいです。
要件定義からブラッシュアップ/実装運用まで一貫して担当。また内部対策を中心に、GTM・GA4・Looker Studioと分析・改善案の策定も進めています。北緯43度マルチエンジニア