第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;
}