第5章 現場で使える実践Sassテクニック

5-1 管理 / 運用・設計で使えるテクニック

ネストが深すぎると生じる問題を把握して、バランスを見ながら利用する

#wrap {
    #wrapInner {
        #page {
            #contents {
                #contentsInner {
                    #main {
                        section {
                            margin-bottom: 50px;
                            .item {
                                .image {
                                    float: left;
                                }
                                .text {
                                    overflow: hidden;
                                    p {
                                        margin: 0 0 1em;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
#wrap #wrapInner #page #contents #contentsInner #main section {
  margin-bottom: 50px;
}
#wrap #wrapInner #page #contents #contentsInner #main section .item .image {
  float: left;
}
#wrap #wrapInner #page #contents #contentsInner #main section .item .text {
  overflow: hidden;
}
#wrap #wrapInner #page #contents #contentsInner #main section .item .text p {
  margin: 0 0 1em;
}

サイトの基本設定を変数にして一元管理する

@charset "UTF-8";
// ===================================================================
// 設定
// ===================================================================

// ================================
// 幅関係の設定
// ================================
    // 全体
    $width-base: 1200px;

    // 最大幅
    $width-max: 1200px;

    // 最小幅
    $width-min: 300px;

    // メインエリアの幅
    $width-main: 800px;

    // サイドバーの幅
    $width-side: 360px;


// ================================
// フォント関係の設定
// ================================
    // ベースフォント
    $font-base: "メイリオ", "Meiryo", "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", verdana, Sans-Serif;

    // 明朝
    $font-serif: Georgia, YuMincho, "Yu Mincho", 游明朝体, "ヒラギノ明朝 Pro W6", "Hiragino Mincho Pro", "HGS明朝E", "MS P明朝", serif;


// ================================
// 色関係の設定
// ================================
    // サイトカラー
    $color-base: white;
    $color-main: #0062b2;
    $color-sub: #def1fa;

    // フォントカラー
    $color-font: #000;

    // リンクカラー
    $color-link: #ff8c28;
    $color-link_visited: #39f;
    $color-link_hover: #cc7020;
    $color-link_active: #00f;

    // ボーダーカラー
    $color-border: #d2d2d2;

// ================================
// ブレイクポイント
// ================================
    $breakpoints: (
        sp: "screen and (max-width:599px)",
        pc: "screen and (min-width:600px)",
    );

複数人で制作する場合は、各自のSass ファイルを用意する

// 制作者用のSassファイルをインポート
@import "_hirasawa";
@import "_morita";

コメントを活用してソースを分かりやすくする

@charset "UTF-8";
// ----------------------------------------------------
// style guide
// 基本的な考えは、FLOCSS( https://github.com/hiloki/flocss )ベース。
// 
// #命名規則
// BEMをベースに以下のルールで記載。
// block__element.-modifier
// Blockが複数単語になる場合は、「blockName」のようにキャメルケースにする。
// 大枠のレイアウトに属する場合のみ、id を許容する。#header など。
// 
// ----------------------------------------------------
@charset "UTF-8";
/*! ========================================
※※※※※※※※※※※※※※※※※※※※※※※※※※※
  このCSSファイルはSassから生成されていますので、
  編集しないようご注意ください。
※※※※※※※※※※※※※※※※※※※※※※※※※※※
========================================= */

大規模サイトで活用できる@import のネスト

#contents p {
  padding-bottom: 15px;
}
#uniqueID p {
  padding-bottom: 0;
}
#uniqueID {
    @import "_local.scss";
}
p {
    padding-bottom: 0;
}

.notes {
    font-weight: bold;
}
a {
    &:hover {
        text-decoration: none;
    }
}
.notes {
    &__item {
    margin: 10px;
    }
    .box & {
        padding: 0;
    }
}
#uniqueID a:hover {
  text-decoration: none;
}
#uniqueID .notes__item {
  margin: 10px;
}
.box #uniqueID .notes {
  padding: 0;
}

SASS 記法も使ってみよう

@mixin mgn($value: 10px) {
    margin: $value;
}

.list {
    @include mgn(5px);
    li {
        display: inline-block;
        a {
            font-size: 1.2rem;
            color: green;
        }
    }
}
=mgn($value: 10px)
    margin: $value

.list
    +mgn(5px)
    li
        display: inline-block
        a
            font-size: 1.2rem
            color: green

&(アンパサンド)を活用してBEM 的な設計を快適に

.navigation {
  width: 100%;
}
.navigation__item {
  color: #666;
}
.navigation__item_state_active {
  color: #000;
}
.navigation {
    width: 100%;
    &__item {
        color: #666;
        &_state_active {
            color: #000;
        }
    }
}
.info {
  margin-bottom: 50px;
}
.info__body {
  background: #fafafa;
  border: 1px solid #aaa;
}
.info--new .info__body {
  border: 1px solid #d75893;
}
.info {
    margin-bottom: 50px;
    &__body {
        background: #fafafa;
        border: 1px solid #aaa;
    }
    &--new {
        .info__body {
            border: 1px solid #d75893;
        }
    }
}
.info {
    margin-bottom: 50px;
    &__body {
        background: #fafafa;
        border: 1px solid #aaa;
    }
    &--new {
        .info {
            &__body {
                border: 1px solid #d75893;
            }
        }
    }
}
.info {
    $block: &;
    margin-bottom: 50px;
    &__body {
        background: #fafafa;
        border: 1px solid #aaa;
    }
    &--new {
        #{$block}__body {
            border: 1px solid #d75893;
        }
    }
}

@keyframes をルールセット内に書いて関係性をわかりやすくする

.example {
    @keyframes anima-example {
        0% {
            transform: translate(0%, -100%);
        }
        100% {
            transform: translate(0%, 0%);
        }
    }

    animation: anima-example 0.9s linear 500ms 1;
}
.example {
  animation: anima-example 0.9s linear 500ms 1;
}

@keyframes anima-example {
  0% {
    transform: translate(0%, -100%);
  }
  100% {
    transform: translate(0%, 0%);
  }
}

エクステンドはスコープを決めて利用する

.btn {
    display: inline-block;
    margin-bottom: 15px;
    padding: 10px;
}

.btn--blue {
    @extend .btn;
    background-color: blue;
}

.btn--red {
    @extend .btn;
    background-color: red;
}
.local-nav__list {
    @extend .btn;
    color: black;
    background-color: #ccc;
}
.local-nav__list {
    display: inline-block;
    margin-bottom: 15px;
    padding: 10px;
    color: black;
    background-color: #ccc;
}

EditorConfig とstylelint でコーディングルールを統一する

root = true //プロジェクトルートであることを示す

[*] //すべての言語の設定
indent_style = space //インデントの種類(spaceかtab)
indent_size = 2 //インデントのサイズ
end_of_line = lf //改行コード
charset = utf-8 //文字コード

stylelint でコードを解析しエラーを表示する

npm install --global stylelint
{
    "rules": {
        "indentation": 2, //インデントのサイズ
        "string-quotes": "double", //ダブルクォーテーションを指定
        "number-leading-zero": "never", //1未満の小数点に0を使わない
        "declaration-block-trailing-semicolon": "never", //セミコロン必須
        "declaration-colon-space-before": "never", //コロンの前にスペース禁止
        "declaration-colon-space-after": "always", //コロンの後にスペース必須
    }
}