NTTドコモ様_dカーシェア
NTTドコモ様_dカーシェア
2014.04.24

Sassの@eachで同じスタイルをラクチンに管理をする方法

はやち

どうもです、はやちです✌(´ʘ‿ʘ`)✌
この春デザイナーからフロントエンジニアになりました。
新しい部署になり覚えることもたくさんありますが、落ち着いてがんばります( ∵ )

今回は、繰り返し処理を行える文@eachを使って繰り返しのスタイルを楽に管理する方法をご紹介致します。

画像を使い分けたい場合

以下のように、背景にアイコンを配置分けする方法をご紹介します( ˘ω˘)☝

list

HTML

HTMLではこのリストを使っていきたいと思います( ˘ω˘)☝

<section id="nav_image">
   <h1>画像を使い分ける場合</h1>
       <ul>
           <li class="icon_home"><a href="#">HOME</a></li>
           <li class="icon_about"><a href="#">ABOUT</a></li>
           <li class="icon_company"><a href="#">COMPANY</a></li>
           <li class="icon_contact"><a href="#">CONTACT</a></li>
       </ul>
</section><!-- / #nav_image-->

Sass

Sassでは以下のようになります( ˘ω˘)☝
カテゴリー名の配列を用意して、画像もicon_の後にそれぞれのカテゴリー名を入れて保存しておきます( ˘ω˘)☝

// カテゴリーの配列名
$namelist: home, about, company, contact;

#nav_image{
	ul{
		li{
			@each $name in $namelist{
				&.icon_#{$name}{
					a{
						background: url(../images/icon_#{$name}.png) no-repeat 12px 15px;
						&:hover{
							background: url(../images/icon_#{$name}.png) no-repeat #f4f6f6 12px 15px;
						}
					}
				}
			}
		}
	}
}

CSS

そしてコンパイルされたCSSはこのようになります( ˘ω˘)☝

#nav_image ul li.icon_home a {
  background: url(../images/icon_home.png) no-repeat 12px 15px;
}
#nav_image ul li.icon_home a:hover {
  background: url(../images/icon_home.png) no-repeat #f4f6f6 12px 15px;
}
#nav_image ul li.icon_about a {
  background: url(../images/icon_about.png) no-repeat 12px 15px;
}
#nav_image ul li.icon_about a:hover {
  background: url(../images/icon_about.png) no-repeat #f4f6f6 12px 15px;
}
#nav_image ul li.icon_company a {
  background: url(../images/icon_company.png) no-repeat 12px 15px;
}
#nav_image ul li.icon_company a:hover {
  background: url(../images/icon_company.png) no-repeat #f4f6f6 12px 15px;
}
#nav_image ul li.icon_contact a {
  background: url(../images/icon_contact.png) no-repeat 12px 15px;
}
#nav_image ul li.icon_contact a:hover {
  background: url(../images/icon_contact.png) no-repeat #f4f6f6 12px 15px;
}

色を使い分けたい場合

次に、背景色を分ける方法をご紹介いします( ˘ω˘)☝

list2

HTML

HTMLならこんな感じ( ˘ω˘)☝

<section id="nav_color">
  <h1>カラーを使い分ける場合</h1>
    <ul>
        <li class="color_home"><a href="#">HOME</a></li>
        <li class="color_about"><a href="#">ABOUT</a></li>
        <li class="color_company"><a href="#">COMPANY</a></li>
        <li class="color_contact"><a href="#">CONTACT</a></li>
    </ul>
</section><!-- / #nav_color -->

Sass

Sassでは新たに色専用の配列を用意してあげましょう( ˘ω˘)☝

index(カテゴリーの配列名, キーを取得したい値)、
nth(色の配列, インデックスキー)でそれぞれ値を取得します( ˘ω˘)☝

// カテゴリーの配列名
$namelist: home, about, company, contact;
// 色の配列名
$color: #1ABC9C, #3498DB, #E67E22, #F1C40F;

#nav_color{
	ul{
		li{
			@each $color_name in $namelist{
				$index_key: index($namelist, $color_name);
				&.color_#{$color_name}{
					a{
						background-color: nth($color, $index_key);
					}
				}
			}
		}
	}
}

CSS

そしてコンパイルされたCSSはこのようになります( ˘ω˘)☝

#nav_color ul li.color_home a {
  background-color: #1abc9c;
}
#nav_color ul li.color_about a {
  background-color: #3498db;
}
#nav_color ul li.color_company a {
  background-color: #e67e22;
}
#nav_color ul li.color_contact a {
  background-color: #f1c40f;
}

アイコンとホバーに背景カラーを入れた場合

アイコンとホバーに背景カラーを入れる方法をご紹介します( ˘ω˘)☝

list3

HTML

HTMLはこんな感じ( ˘ω˘)☝

<section id="nav">
 <h1>アイコンとホバーに背景カラーを入れた場合</h1>
 <ul>
   <li class="nav_home"><a href="#">HOME</a></li>
   <li class="nav_about"><a href="#">ABOUT</a></li>
   <li class="nav_company"><a href="#">COMPANY</a></li>
   <li class="nav_contact"><a href="#">CONTACT</a></li>
 </ul>
</section><!-- / #nav -->

Sass

色の配列はまた$colorsにまとめてしまいましょう。
backgrounに記述するとき背景色は$colorsだけなので楽ちんです( ˘ω˘)☝

// カテゴリーの配列名
$namelist: home, about, company, contact;
// 色の配列名
$color: #1ABC9C, #3498DB, #E67E22, #F1C40F;

#nav{
	ul{
		li{
			@each $navname in $namelist{
				$index_key: index($namelist, $navname);
				$colors:nth($color, $index_key);
				&.nav_#{$navname}{
					a{
						background: url(../images/icon_#{$navname}.png) no-repeat 12px 15px;
						&:hover{
							background:$colors url(../images/icon_#{$navname}_hover.png) no-repeat 12px 15px;
						}
					}
				}
			}
		}
	}
}

CSS

コンパイルされたCSSはこちらです( ˘ω˘)☝

#nav ul li.nav_home a {
  background: url(../images/icon_home.png) no-repeat 12px 15px;
}
#nav ul li.nav_home a:hover {
  background: #1abc9c url(../images/icon_home_hover.png) no-repeat 12px 15px;
}
#nav ul li.nav_about a {
  background: url(../images/icon_about.png) no-repeat 12px 15px;
}
#nav ul li.nav_about a:hover {
  background: #3498db url(../images/icon_about_hover.png) no-repeat 12px 15px;
}
#nav ul li.nav_company a {
  background: url(../images/icon_company.png) no-repeat 12px 15px;
}
#nav ul li.nav_company a:hover {
  background: #e67e22 url(../images/icon_company_hover.png) no-repeat 12px 15px;
}
#nav ul li.nav_contact a {
  background: url(../images/icon_contact.png) no-repeat 12px 15px;
}
#nav ul li.nav_contact a:hover {
  background: #f1c40f url(../images/icon_contact_hover.png) no-repeat 12px 15px;
}

今回実装したものはこちらでご確認いただけます( ˘ω˘)☞DEMO
Sassのサンプルもございます( ˘ω˘)☞SAMPLE

まとめ

いかがでしたでしょうか、パターンさえ覚えてしまえば、同じソースを書かなくてもSassソースがすっきりしますね。

今回はご紹介できませんでしたが、スプライトmixinと併用して@eachを組めば、より一層楽ちんになります!

私も今後使いこなせるように日々精進していきます( ˘ω˘)