第4章 高度な機能を覚えてSassを使いこなそう
4-1 スタイルの継承ができるエクステンド(@extend)
エクステンドの基本
.box { margin: 0 0 30px; padding: 15px; border: 1px solid #ccc; } // .box で使ったスタイルを継承 .item { @extend .box; }
.box, .item { margin: 0 0 30px; padding: 15px; border: 1px solid #ccc; }
同じルールセット内で、複数継承する
// エクステンド .notes { color: #d92c25; font-weight: bold; text-align: center; } .bd { border-top: 1px solid #900; border-bottom: 1px solid #900; } // 複数継承 .item { small { display: block; padding: 10px; @extend .notes; @extend .bd; } }
.notes, .item small { color: #d92c25; font-weight: bold; text-align: center; } .bd, .item small { border-top: 1px solid #900; border-bottom: 1px solid #900; } .item small { display: block; padding: 10px; }
エクステンドの連鎖
.att { color: red; font-weight: normal; } .attBox { // .att を継承 @extend .att; padding: 15px; border: 1px solid red; } .notes { // .att が継承されている、.attBox を継承(連鎖) @extend .attBox; }
.att, .attBox, .notes { color: red; font-weight: normal; } .attBox, .notes { padding: 15px; border: 1px solid red; }
エクステンドが使えるセレクタ
エクステンドが使える例
// クラスセレクタ .class { ... } // タイプセレクタ small { ... } // IDセレクタ #selectorID { ... } // 連結セレクタ .pd.bd { ... } // 属性セレクタ input[type="text"] { ... } // 擬似クラス a:hover { ... } // 擬似要素 p::first-line { ... }
エクステンドが使えない例
// 子孫セレクタ .item p { ... } // 子セレクタ #main > article { ... } // 隣接セレクタ h2 + h3 { ... } // 間接セレクタ h3 ~ h3 { ... }
エクステンド専用のプレースホルダーセレクタ
// エクステンド専用のプレースホルダーセレクタ %boxBase { padding: 15px; border: 1px solid #999; } // プレースホルダーセレクタを継承 .item { @extend %boxBase; margin-bottom: 20px; } section { @extend %boxBase; margin-bottom: 60px; }
.item, section { padding: 15px; border: 1px solid #999; } .item { margin-bottom: 20px; } section { margin-bottom: 60px; }
@media 内ではエクステンドは使用できない
%btnBase { display: inline-block; padding: 5px 10px; background: #eee; } @media all and (orientation:landscape) { a { @extend %btnBase; } }
@media all and (orientation: landscape) { a { display: inline-block; padding: 5px 10px; background: #eee; } }
@media all and (orientation:landscape) { %btnBase { display: inline-block; padding: 5px 10px; background: #eee; } a { @extend %btnBase; } }
@media all and (orientation:landscape) { %btnBase { display: inline-block; padding: 5px 10px; background: #eee; } a { @extend %btnBase; } } .btn { @extend %btnBase; }
@media all and (orientation: landscape) { a, .btn { display: inline-block; padding: 5px 10px; background: #eee; } }
警告を抑止する !optional フラグ
.btn { @extend %btnBase !optional; }