> CSS・Sass > Sass(scss)の基本的な使い方~セレクタやプロパティ・メディアクエリのネスト
Sass(scss)の基本的な使い方~セレクタやプロパティ・メディアクエリのネスト

Sass(scss)の基本的な使い方~セレクタやプロパティ・メディアクエリのネスト

SassはCSSを効率的に記述するために開発されたメタ言語(拡張言語)です。
Sassについての基礎知識は下記の記事で紹介しています。

今回はScss(Dart Sass)での基本的な使い方と書き方で、セレクタ・プロパティ・メディアクエリのネスト(入れ子)について紹介します。

ネスト(入れ子)について

CSSではセレクタやプロパティ・メディアクエリを重複して書くことが多くあります。
Sassではセレクタやプロパティ・メディアクエリをネスト(入れ子)にすることでコードをシンプルにし、可読性を上げることができます。

セレクタのネスト

たとえば下記のようなCSSを作成したいとします。

CSSでの書き方

nav {
  background-color: #323232;
}
nav ul {
  list-style: none;
  padding: 0;
}
nav ul li {
  display: inline-block;
  margin-right: 10px;
}

素でcssを書こうとすると、navnav ulnav ul liのように、重複するセレクタを何度も記述しなければなりません。
Sassでは、セレクタをネスト(入れ子に)することで重複している部分を省略して記述することが可能です。

scssでの書き方

nav {
    background-color: #323232;

    ul {
        list-style: none;
        padding: 0;

        li {
            display: inline-block;
            margin-right: 10px;
        }
    }
}

navの{}の中にulの{}を記述し、更にulの{}の中にliの{}を記述することで、コンパイル時にnavnav ulnav ul liを生成します。
入れ子にしたプロパティの親子関係をわかりやすくするために、インデントを適切に設定しましょう。

'&'を使ったプロパティのネスト

通常、scssのプロパティのネストは、親セレクタと子セレクタを半角スペースで区切ってコンパイルします。
子セレクタの頭に&をつけて記述すると、親セレクタと子セレクタを繋げてコンパイルします。

CSSでの書き方

a {
    color: #007bff;
}
a:hover {
    text-decoration: underline;
}

input{
	font-size: 1.6rem;
}
input[type="text"]{
	padding: .5rem;
}

.block{
	margin: 1rem 0;
}
.block__element{
	text-align: center;
}	
.block__element--modifier{
	color: #cc0000;
}

a:hoverはスペースで区切らずに続けて記述する必要があります。
また、input[type="text"]も同様です。
クラス名を&を利用してネストすると、重複部分を省略して記述することができます。

scssでの書き方

a {
    color: #007bff;

    &:hover {
        text-decoration: underline;
    }
}

input{
    font-size: 1.6rem;
    
    &[type="text"]{
        padding: .5rem;
    }
}

.block{
    margin: 1rem 0;

    &__element{
        text-align: center;
        
        &--modifier{
            color: #cc0000;
        }
    }
}

a{}内で:hover用のネストを行う際に、:hoverの前に&をつけるとa:hoverとして出力されます。
:focus:first-childなどの疑似クラスの他、::before::afterなどの疑似要素、[type="text"]などの属性セレクタにも利用できます。

クラス名を指定する時に重複する部分を&で省略すると、コードを省エネで記述することができ、また可読性を上げることができます。

プロパティのネスト

たとえば下記のようなCSSを作成したいとします。

CSSでの書き方

.block {
    background-color: #f7f7f7;
    background-image: url('image.jpg');
    background-position: top center;
    background-repeat: no-repeat;
    background-size: contain;
}

.box {
    border-style: solid;
    border-width: 1px;
    border-color: #ccc;
}

.box p{
    font-weight: bold;
    font-size: 16px;
    font-family: 'Arial', sans-serif;
    text-align: center;
    text-decoration: underline;
}

.box ul{
    list-style: none;
    list-style-type: square;
}

.card{
    padding-top: 5px;
    padding-right: 10px;
    padding-bottom: 5px;
    padding-left: 10px;
    margin-top: 5px;
    margin-right: 10px;
    margin-bottom: 5px;
    margin-left: 10px;
}

CSSでは語頭が同じプロパティを何度も書かなきゃいけないことがあって発狂しそうになります。
Sassではハイフン(-)前の単語をネストして複数のプロパティをまとめて記述することができます。

scssでの書き方

.block {
    background: {
        color: #f7f7f7;
        image: url('image.jpg');
        position: top center;
        repeat: no-repeat;
        size: contain;
    }
}

.box {
    border: {
        style: solid;
        width: 1px;
        color: #ccc;
    }
}

.box p{
    font: {
        weight: bold;
        size: 16px;
        family: 'Arial', sans-serif;
    }
    text: {
        align: center;
        decoration: underline;
    }
}

.box ul{
    list: {
        style: none;
        style-type: square;
    }
}

.card{
    padding: {
        top: 5px;
        right: 10px;
        bottom: 5px;
        left: 10px;
    }
    margin: {
        top: 5px;
        right: 10px;
        bottom: 5px;
        left: 10px;
    }
}

まとめられるプロパティは、たとえば下記の通りです。

  • background-系
  • border-系
  • font-系
  • text-系
  • list-系
  • padding-系
  • margin-系
  • flex-系
  • transition-系
  • animation-系
  • column-系
  • outline-系

まとめられるプロパティはまとめちゃって、ソースの可読性を上げてみましょう。

メディアクエリのネスト

レスポンシブデザインに必須のメディアクエリの設定は、@mediaルールごとに記載箇所が分離して管理しづらいことがあると思います。
Sassではセレクタ内にメディアクエリをネストすることができるので、記述をまとめて管理しやすくなります。

CSSでの書き方

.container {
    width: 100%;
    max-width: 1400px;
}

@media (min-width: 768px) {
    .container {
        max-width: 1000px;
    }
}

@media (min-width: 768px) {
    .container {
        max-width: none;
    }
}

メディアルールごとにセレクタとプロパティを書かなければならないので、重複が多い状態です。

scssでの書き方

.container {
    width: 100%;
    max-width: 1400px;

    @media (max-width: 768px) {
        max-width: 1000px;
    }

    @media (max-width: 768px) {
        max-width: none;
    }
}

セレクタ内にメディアルールをネストできるので、セレクタを何度も書く必要がありません。

最後に

ネストはSassの代名詞とも言える代表的な便利機能です。
ネストを使いこなして省エネで読みやすいコーディングをしてみましょう。

この記事が気に入ったらシェアしてください

関連記事

Sassの繰り返し処理|@whileの使い方と実用例まとめ

Sassの繰り返し処理|@whileの使い方と実用例まとめ

Sassの繰り返し処理|@eachの使い方と実用例まとめ

Sassの繰り返し処理|@eachの使い方と実用例まとめ

Sassの繰り返し処理|@forの使い方と実用例まとめ

Sassの繰り返し処理|@forの使い方と実用例まとめ

Sassの繰り返し処理を整理しよう!@for/@each/@whileの違いと使い分けガイド

Sassの繰り返し処理を整理しよう!@for/@each/@whileの違いと使い分けガイド

Sassで配列を使おう|マップ内の値を検索する(カスタム関数の実装例)

Sassで配列を使おう|マップ内の値を検索する(カスタム関数の実装例)

Sassで配列を使おう|マップ(連想配列)を徹底的に使いこなす!

Sassで配列を使おう|マップ(連想配列)を徹底的に使いこなす!

Comment Form

コメント投稿はこちらをクリックしてください
  • コメントを入力してください。
登録フォーム
Name
Mailaddress
URL
Message
Postkey
(スパム対策に、投稿キー を半角で入力してください。)