第5章 現場で使える実践Sassテクニック
5-5 PostCSSでSassをさらに便利にする
PostCSS とは
npm install --save-dev gulp-postcss
var gulp = require('gulp');
var sass = require('gulp-sass');
var sassGlob = require('gulp-sass-glob');
var sourcemaps = require('gulp-sourcemaps');
var plumber = require('gulp-plumber');
var notify = require("gulp-notify");
var postcss = require('gulp-postcss'); //①「gulp-postcss」を読み込み
.pipe(postcss([autoprefixer()]))
ベンダープレフィックスを自動付与する
インストールと設定
npm install --save-dev autoprefixer
var gulp = require('gulp');
var sass = require('gulp-sass');
var sassGlob = require('gulp-sass-glob');
var sourcemaps = require('gulp-sourcemaps');
var plumber = require('gulp-plumber');
var notify = require("gulp-notify");
var postcss = require('gulp-postcss');
var autoprefixer = require('autoprefixer'); //①「autoprefixer」を読み込み
gulp.task('sass', function() {
return gulp.src('./sass/**/*.scss')
.pipe(plumber({errorHandler: notify.onError(
"Error: <%= error.message %>")}))
.pipe(sourcemaps.init())
.pipe(sassGlob())
.pipe(sass({outputStyle: 'expanded'}))
.pipe(postcss([autoprefixer()])) //②「sass」の後に指定
.pipe(sourcemaps.write())
.pipe(gulp.dest('./css'));
});
.box {
display: flex;
justify-content: space-between;
background: linear-gradient(to bottom, white, black);
transition: all .5s;
}
.box {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: justify;
-ms-flex-pack: justify;
justify-content: space-between;
background: -webkit-gradient(linear, left top, left bottom, from(white), to(black));
background: linear-gradient(to bottom, white, black);
-webkit-transition: all .5s;
transition: all .5s;
}
対象ブラウザを設定する
.pipe(postcss([autoprefixer(autoprefixer({browsers: ['last 1 versions']})]))
.box {
display: -webkit-box;
display: flex;
-webkit-box-pack: justify;
justify-content: space-between;
background: linear-gradient(to bottom, white, black);
transition: all .5s;
}
.pipe(postcss([autoprefixer(autoprefixer({browsers: ['last 1 versions, ie 10']})]))
.pipe(postcss([autoprefixer(autoprefixer({browsers: ['> 2%']})]))
画像名だけで画像のパスやサイズを取得する
インストールと設定
npm install --save-dev postcss-assets
var gulp = require('gulp');
var sass = require('gulp-sass');
var sassGlob = require('gulp-sass-glob');
var sourcemaps = require('gulp-sourcemaps');
var plumber = require('gulp-plumber');
var notify = require("gulp-notify");
var postcss = require('gulp-postcss');
var autoprefixer = require('autoprefixer');
var assets = require('postcss-assets'); //①「postcss-assets」を読み込み
gulp.task('sass', function() {
return gulp.src('./sass/**/*.scss')
.pipe(plumber({errorHandler: notify.onError(
"Error: <%= error.message %>")}))
.pipe(sourcemaps.init())
.pipe(sassGlob())
.pipe(sass({outputStyle: 'expanded'}))
.pipe(postcss([assets({ //②「sass」の後に指定
loadPaths: ['images/'] //③「loadPaths」に画像ディレクトリを指定(本書ではimages)
})]))
.pipe(postcss([autoprefixer()]))
.pipe(sourcemaps.write())
.pipe(gulp.dest('./css'));
});
画像パスを取得する
.image {
background-image: resolve('logo.png');
}
.image {
background-image: url('/images/logo.png');
}
.pipe(postcss([assets({
loadPaths: ['images/', './icons', './banners'] //③「loadPaths」に画像ディレクトリを指定(本書ではimages)
})]))
.image {
background-image: resolve('logo.png');
background-image: resolve('star.svg');
background-image: resolve('campaign.jpg');
}
.image {
background-image: url('/images/logo.png');
background-image: url('/icons/star.svg');
background-image: url('/banners/campaign.jpg');
}
.pipe(postcss([assets({
loadPaths: ['images/', './icons', './banners'],
relative: true //「relative: true」を追加
})]))
.image {
background-image: url('../images/logo.png');
background-image: url('../icons/star.svg');
background-image: url('../banners/campaign.jpg');
}
.pipe(postcss([assets({
loadPaths: ['images/', './icons', './banners'],
baseUrl: 'http://example.com/wp-content/themes/' //「baseUrl」を追加
})]))
.image {
background-image: url('http://example.com/wp-content/themes/images/logo.png');
background-image: url('http://example.com/wp-content/themes/icons/star.svg');
background-image: url('http://example.com/wp-content/themes/banners/campaign.jpg');
}
画像サイズを取得する
.image {
width: width('logo.png'); //①横幅を取得
height: height('logo.png'); //②縦幅を取得
background-size: size('logo.png'); //③縦横を取得
}
.image {
width: 284px;
height: 200px;
background-size: 284px 200px;
}
.imagex2 {
width: width('logo.png', 2);
height: height('logo.png', 2);
background-size: size('logo.png', 2);
}
.imagex2 {
width: 142px;
height: 100px;
background-size: 142px 100px;
}
画像をインライン化する
.image {
background-image: inline('logo.png');
}
.image {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAWIhgX+1...(略)...njh/P/U7OX3MieEOt6hjCO9QDqh74fxSlH5cNdLBCAAAAAElFTkSuQmCC');
}
CSSプロパティの記述順を自動でソートする
npm install --save-dev css-declaration-sorter
var gulp = require('gulp');
var sass = require('gulp-sass');
var sassGlob = require('gulp-sass-glob');
var sourcemaps = require('gulp-sourcemaps');
var plumber = require('gulp-plumber');
var notify = require("gulp-notify");
var postcss = require('gulp-postcss');
var autoprefixer = require('autoprefixer');
var assets = require('postcss-assets');
var cssdeclsort = require('css-declaration-sorter'); //①「css-declaration-sorter」を読み込み
gulp.task('sass', function() {
return gulp.src('./sass/**/*.scss')
.pipe(plumber({errorHandler: notify.onError("Error: <%= error.message %>")}))
.pipe(sourcemaps.init())
.pipe(sassGlob())
.pipe(sass({outputStyle: 'expanded'}))
.pipe(postcss([cssdeclsort({order: 'smacss'})])) //②「sass」の後に指定
.pipe(postcss([assets({
loadPaths: ['./images']
})]))
.pipe(postcss([autoprefixer()]))
.pipe(sourcemaps.write())
.pipe(gulp.dest('./css'));
});
.test {
color: #C55;
display: flex;
justify-content: space-between;
border: 0;
background: #eee;
transition: all .5s;
animation: none;
}
.test {
display: flex;
justify-content: space-between;
border: 0;
background: #eee;
color: #C55;
animation: none;
transition: all .5s;
}
並び替えオーダーの種類
.pipe(postcss([cssdeclsort({customOrder: 'mycustom.json'})]))
バラバラになったメディアクエリをまとめてコード量を削減してスッキリさせる
npm install --save-dev css-mqpacker
var gulp = require('gulp');
var sass = require('gulp-sass');
var sassGlob = require('gulp-sass-glob');
var sourcemaps = require('gulp-sourcemaps');
var plumber = require('gulp-plumber');
var notify = require("gulp-notify");
var postcss = require('gulp-postcss');
var autoprefixer = require('autoprefixer');
var assets = require('postcss-assets');
var cssdeclsort = require('css-declaration-sorter');
var mqpacker = require('css-mqpacker'); //①「css-mqpacker」を読み込み
gulp.task('sass', function() {
return gulp.src('./sass/**/*.scss')
.pipe(plumber({errorHandler: notify.onError("Error:<%= error.message %>")}))
.pipe(sourcemaps.init())
.pipe(sassGlob())
.pipe(sass({outputStyle: 'expanded'}))
.pipe(postcss([mqpacker()])) //②「sass」の後に指定
.pipe(postcss([cssdeclsort({order: 'smacss'})]))
.pipe(postcss([assets({
loadPaths: ['./images']
})]))
.pipe(postcss([autoprefixer()]))
.pipe(sourcemaps.write())
.pipe(gulp.dest('./css'));
})
.list {
width: 380px;
@media screen and (min-width: 768px) {
width: 50%;
}
@media screen and (min-width: 480px) {
width: 100%;
}
}
.banner {
width: 800px;
@media screen and (min-width: 768px) {
width: 500px;
}
@media screen and (min-width: 480px) {
width: 100%;
}
}
.list {
width: 380px;
}
@media screen and (min-width: 768px) {
.list {
width: 50%;
}
}
@media screen and (min-width: 480px) {
.list {
width: 100%;
}
}
.banner {
width: 800px;
}
@media screen and (min-width: 768px) {
.banner {
width: 500px;
}
}
@media screen and (min-width: 480px) {
.banner {
width: 100%;
}
}
.list {
width: 380px;
}
.banner {
width: 800px;
}
@media screen and (min-width: 768px) {
.list {
width: 50%;
}
.banner {
width: 500px;
}
}
@media screen and (min-width: 480px) {
.list {
width: 100%;
}
.banner {
width: 100%;
}
}

