第4章 高度な機能を覚えてSassを使いこなそう
4-1 スタイルの継承ができる@extend
@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;
}
.btnBase {
text-align: center;
margin: 0 0 10px;
a {
display: block;
padding: 10px 20px;
background: #999;
color: #fff;
&:hover {
background: #ccc;
color: #333;
}
}
}
.imgL {
float: left;
margin-right: 15px;
}
@import "extend";
ul.btnList {
li {
@extend .btnBase;
}
}
.item {
width: 300px;
.photo {
@extend .imgL;
margin-bottom: 10px;
}
.text {
overflow: hidden;
.btn {
@extend .btnBase;
text-align: left;
}
}
}
.btnBase, ul.btnList li, .item .text .btn {
text-align: center;
margin: 0 0 10px;
}
.btnBase a, ul.btnList li a, .item .text .btn a {
display: block;
padding: 10px 20px;
background: #999;
color: #fff;
}
.btnBase a:hover, ul.btnList li a:hover, .item .text .btn a:hover {
background: #ccc;
color: #333;
}
.imgL, .item .photo {
float: left;
margin-right: 15px;
}
.item {
width: 300px;
}
.item .photo {
margin-bottom: 10px;
}
.item .text {
overflow: hidden;
}
.item .text .btn {
text-align: left;
}
同じルールセット内で、複数継承する
// @extend
.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;
}
@extend の連鎖
.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;
}
@extend が使えるセレクタ
// クラスセレクタ
.class {
color: blue;
}
// タイプセレクタ
small {
color: blue;
}
// IDセレクタ
#selectorID {
color: blue;
}
// 連結セレクタ
.pd.bd {
color: blue;
}
// 属性セレクタ
input[type="text"] {
color: blue;
}
// 擬似クラス
a:hover {
color: blue;
}
// 擬似要素
p:first-line {
color: blue;
}
@extend が使えない例
// 子孫セレクタ
.item p {
margin-bottom: 15px;
}
// 子セレクタ
#main > article {
margin-bottom: 50px;
}
// 隣接セレクタ
h2 + h3 {
margin-top: 0;
}
// 間接セレクタ
h3 ~ h3 {
margin-top: 30px;
}
@extend 専用のプレースホルダーセレクタ
// @extend 専用のプレースホルダーセレクタ
%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 内では @extend は使用できない
%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;
}
}
.btn {
@extend %btnBase !optional;
}


