第5章 現場で使える実践Sassコーディング

5-2 ブラウザ対応で使える

Sassで使えるCSSハックと使えないCSSハック

html > /**/ body p {
	margin: 100px;
}
p {
	/margin: 100px;
}
// IE6 用のハック
* html #main { background: blue; }
#main { _background: blue; }

// IE7 用のハック
*:first-child + html #main { background: blue; }

// IE6, 7 用のハック
#main { *background: blue; }

// IE7, 8, 9 用のハック
#main { background: blue\9; }

// IE9 用のハック
:root #main { background: blue\9; }

// Firefox 用のハック
#main, x:-moz-any-link { background: red; }
@-moz-document url-prefix( ) {
	#main { background: red; }
}

// Chrome、Safari 用のハック
@media screen and (-webkit-min-device-pixel-ratio : 0 ) {
	#main { background: green; }
}

Sassの意外な罠!?
セレクタが4,095個を超えるとIE6~9で認識されない

table { ... }
p.note,
#main .att { ... }
#wrap #main article p { ... }
#test { background-color: red; }
#test { background-color: red; }
#test { background-color: red; }
#test { background-color: red; }

...(略)...

#test { background-color: blue; }
#test { background-color: blue; }
#test { background-color: blue; }
#test { background-color: white; }
@import url('example-blessed3.css?z=0000000000000');
@import url('example-blessed2.css?z=0000000000000');
@import url('example-blessed1.css?z=0000000000000');

#test { background-color: white; }

@each を使ってベンダープレフィックスを自動で付与する

// 付与するベンダープレフィックス
$prefixList: -webkit-, -moz-, -ms-, -o-, null;

a {
	@each $prefix in $prefixList {
		#{$prefix}transition: all 0.3s linear;
	}
}
a {
  -webkit-transition: all 0.3s linear;
  -moz-transition: all 0.3s linear;
  -ms-transition: all 0.3s linear;
  -o-transition: all 0.3s linear;
  transition: all 0.3s linear;
}
// 付与するベンダープレフィックス
$prefixList: -webkit-, -moz-, null;

a {
	@each $prefix in $prefixList {
		#{$prefix}transition: all 0.3s linear;
	}
}

#main {
	padding: 20px;
	background: #efefef;
	@each $prefix in $prefixList {
		#{$prefix}border-radius: 5px;
		#{$prefix}box-shadow: 1px 1px 5px rgba(black, .3);
	}
}
a {
  -webkit-transition: all 0.3s linear;
  -moz-transition: all 0.3s linear;
  transition: all 0.3s linear;
}

#main {
  padding: 20px;
  background: #efefef;
  -webkit-border-radius: 5px;
  -webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.3);
  -moz-border-radius: 5px;
  -moz-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.3);
  border-radius: 5px;
  box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.3);
}
// mixin

@mixin transition($value) {
	@each $prefix in $prefixList {
		#{$prefix}transition: $value;
	}
}

@mixin border_radius($value: 3px) {
	@each $prefix in $prefixList {
		#{$prefix}border-radius: $value;
	}
}

@mixin box_shadow($value...) {
	@each $prefix in $prefixList {
		#{$prefix}box-shadow: $value;
	}
}

@mixin text_shadow($value...) {
	@each $prefix in $prefixList {
		#{$prefix}text-shadow: $value;
	}
}
a {
	@include transition(all 0.5s linear);
}

#main {
	padding: 20px;
	background: #efefef;
	@include box_shadow(1px 1px 5px rgba(black, .3));
	@include border_radius();

	h2 {
		font-size: 160%;
		@include text_shadow(0 1px 0 #fff, 0 -1px 0 #fff);
	}
}

面倒なCSS3のアニメーション指定をカンタンにする

@mixin keyframes($animaName) {
	@-webkit-keyframes $animaName {
		@content;
	}
	@-moz-keyframes $animaName {
		@content;
	}
	@-o-keyframes $animaName {
		@content;
	}
	@-ms-keyframes $animaName {
		@content;
	}
	@keyframes $animaName {
		@content;
	}
}
$prefixList: -webkit-, -moz-, -o-, null;

body:after {
	content: "";
	width: 100px;
	height: 50px;
	position: absolute;
	top: 25px;
	right: 10%;
	z-index: 0;
	background: url(../img/neko.png) no-repeat;
	@each $prefix in $prefixList {
		#{$prefix}animation-duration: 3.5s;
		#{$prefix}animation-timing-function: linear;
		#{$prefix}animation-iteration-count: 1;
		#{$prefix}animation-name: headerBGAnima;
	}
}
@include keyframes(headerBGAnima) {
	0% {
		opacity: 0;
		top: 350px;
		right: 78%;
	}
	50% {
		opacity: 1;
		top: 25px;
		right: 10%;
	}
	100% {
		top: 25px;
		right: 10%;
	}
}
body:after {
  content: "";
  width: 100px;
  height: 50px;
  position: absolute;
  top: 25px;
  right: 10%;
  z-index: 0;
  background: url(../img/neko.png) no-repeat;
  animation-duration: 3.5s;
  animation-timing-function: linear;
  animation-iteration-count: 1;
  animation-name: headerBGAnima;
  background: url(../img/neko.png) no-repeat;
}

@-webkit-keyframes headerBGAnima {
  0% {
    opacity: 0;
    top: 350px;
    right: 78%;
  }
  50% {
    opacity: 1;
    top: 25px;
    right: 10%;
  }
  100% {
    top: 25px;
    right: 10%;
  }
}

@-moz-keyframes headerBGAnima {
  0% {
    opacity: 0;
    top: 350px;
    right: 78%;
  }
  50% {
    opacity: 1;
    top: 25px;
    right: 10%;
  }
  100% {
    top: 25px;
    right: 10%;
  }
}

@-o-keyframes headerBGAnima {
  0% {
    opacity: 0;
    top: 350px;
    right: 78%;
  }
  50% {
    opacity: 1;
    top: 25px;
    right: 10%;
  }
  100% {
    top: 25px;
    right: 10%;
  }
}

@-ms-keyframes headerBGAnima {
  0% {
    opacity: 0;
    top: 350px;
    right: 78%;
  }
  50% {
    opacity: 1;
    top: 25px;
    right: 10%;
  }
  100% {
    top: 25px;
    right: 10%;
  }
}

@keyframes headerBGAnima {
  0% {
    opacity: 0;
    top: 350px;
    right: 78%;
  }
  50% {
    opacity: 1;
    top: 25px;
    right: 10%;
  }
  100% {
    top: 25px;
    right: 10%;
  }
}

IEの対応をしつつ「rem」を使ってフォントサイズを指定する

body {
	font-size: 12px;
	font-size: 0.75rem;
}
@mixin fz($size) {
	font-size: $size + px;
	font-size: ($size / 10) * 1rem;
}
html {
	font-size: 62.5%;
}

.item {
	@include fz(18);
}
.box {
	@include fz(26);
}
html {
  font-size: 62.5%;
}
.item {
  font-size: 18px;
  font-size: 1.8rem;
}
.box {
  font-size: 26px;
  font-size: 2.6rem;
}
@for $i from 8 through 40 {
	%fz#{$i} {
		font-size: $i + px;
		font-size: ($i / 10) * 1rem;
	}
}

html {
	font-size: 62.5%;
}
aside {
	@extend %fz18;
}
.item {
	@extend %fz18;
}
.box {
	@extend %fz26;
}
html {
  font-size: 62.5%;
}
aside, .item {
  font-size: 18px;
  font-size: 1.8rem;
}
.box {
  font-size: 26px;
  font-size: 2.6rem;
}

ブラウザのインスペクタでSCSSの位置(行数)を知る

sass --line-comments --watch sass
/* line 2, test.scss */
#main {
  width: 600px;
}
/* line 5, test.scss */
#main p {
  margin: 0 0 2em;
}
/* line 7, test.scss */
#main p em {
  color: #f00;
}
/* line 11, test.scss */
#main small {
  font-size: small;
}
sass --debug-info --watch sass
@media -sass-debug-info{filename{font-family:file\:\/\/\/Users\/impress\/sass\/test\.scss}line{font-family:\000032}}
#main {
  width: 600px;
}
@media -sass-debug-info{filename{font-family:file\:\/\/\/Users\/impress\/sass\/test\.scss}line{font-family:\000035}}
#main p {
  margin: 0 0 2em;
}
@media -sass-debug-info{filename{font-family:file\:\/\/\/Users\/impress\/sass\/test\.scss}line{font-family:\000037}}
#main p em {
  color: #f00;
}
@media -sass-debug-info{filename{font-family:file\:\/\/\/Users\/impress\/sass\/test\.scss}line{font-family:\0000311}}
#main small {
  font-size: small;
}
sass --sourcemap  --watch sass
#main {
  width: 600px;
}
#main p {
  margin: 0 0 10em;
}
#main p em {
  color: #f00;
}
#main small {
  font-size: small;
}

/*@ sourceMappingURL=test.css.map */
#main{width:600px}#main p{margin:0 0 10em}#main p em{color:#f00}#main small{font-size:small}
/*@ sourceMappingURL=test.css.map */