初心者がRailsを勉強するブログ

Railsを0からお勉強するブログです。

初めてのSass

今回は、Sassを見ていこうと思います。

CSSプログラミング言語じゃないので、色々不便なところがありますよね。
DRYを守るのはほぼ不可能なレベル。
そこでSassですよ!ってな感じらしい。

中身を早く見たいのは山々ですが、先にCSSコンパイルするやり方を確認しましょう。
Sassのままじゃ動かないので、動作確認もできませんし。
こんな感じでやるみたい。

$ sass Sassファイル 吐き出すCSSのファイル名

これでSassファイルから指定した名前のCSSを吐くようです。試しに、

$ touch test.scss

と入力して空っぽのScssファイルを作成し、

$ sass test.scss test.css

とやると、空っぽのtest.cssができました。
これで、安心してSassを書けますね。

それでは、ここにある、Sassの基本を見て行きましょう。

このページにある内容で、書くのに関係ありそうなのは、

・変数
・ネスト
・パーシャル
・インポート
・ミックスイン
・継承
・演算子

ってとこでしょうか。一つずつ見て行きましょう。

変数

CSSで変数を使えるとか半端ないっす。超ありがてぇっす。
変数は頭に"$"をつけて定義するようです。

$base-color: #192bc1;

header {
  background-color: $base-color;
}

footer {
  background-color: $base-color;
}

カンマで書けっていうツッコミはごもっともです。

ネスト

ネストは地味にありがたいです。可読性が上がりますね。

header {
  background-color: darkblue;

  p {
    color: snow;
  }

  a {
    color: red;
  }
}

CSSでネストできなくて絶望していた頃が懐かしい。

パーシャルとインポート

_で始まるファイル名のSassファイルをインポートして、コンパイル時に合体してくれるようです。管理が簡単になりますな。
書き方は、@import '_を抜いたファイル名'でいくようです。

たとえば、modalのCSSだけを分けて書くと仮定すると、
_modal.scssとmain.scssを用意して、
modalの分だけ_modal.scssに書きます。

.modal {
  .modal-content {
    color: red;
  }

  .modal-body {
    color: black;
  }
}

で、他のスタイルをmain.scssに書きつつ、インポートします。

@import 'modal';

header {
  color: red;
}

_の扱いには注意しとかないと忘れそうです。
これも嬉しいですね。コンパイルしたら1つの合体したCSS吐くのもいいです。

ミックスイン

ミックスインって何のことかと思ったら、関数じゃないですか!
何これ超すごい。
@mixinで定義して、@includeで呼び出すみたいです。

@mixin emphasize-text() {
  font-weight: bold;
  font-style: italic;
}

p {
  color: blue;

  &:hover {
    @include emphasize-text();
  }
}

&はネストされている親セレクタ、ここではpです。

見た目でわかると思いますが、引数行けます。

@mixin set-blue-border($width) {
  border: $width solid blue;
}

p {
  @include set-blue-border(2px);
}

これは激アツですね。

継承

@extendで同じスタイルが当たるみたいです。これは…どうだろう。

h1 {
  color: white;
  background-color: maroon;
}

h2 {
  @extend h1
}

クラスとidをうまく振れば使わなくていい気がしています。
使いこなせれば便利になるのかなぁ。

演算子

SCSSは計算までできるとは…激萌えですな…
条件分岐ができれば完璧でしたな…

$h1-size: 10px

h1 {
  font-size: $h1-size;
}

p {
  font-size: $h1-size / 2px;
}

数値を計算できるのは、かなり可読性が上がると思います。
何に対するどんな数値なのかがわかるのは大きいです。


とりあえず、すぐに使えそうなのはこんな感じでしょうか。


それでは、CSSとSCSSでスタイルを当てて、比較してみましょう。
こんなのを作ります。ヘッダーとタイトルだけです。これ以上書くと、読んでられない文量に…
ロゴはArt Text 2 Liteでサクッと作りました。ファイル名はsass.pngです。

f:id:carmelokarimero:20140126101530p:plain


まずはhtmlを用意します。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Scssのテスト</title>
  <link rel="stylesheet" href="test.css">
</head>
<body>
  <header>
    <p>ヘッダー</p>
  </header>
  <h1>初めてのSass</h1>
</body>
</html>


それでは、スタイルを当てます。まずはCSSから。
この例では、簡単すぎてDRYは守れてますが、ちょっと色を変えてみたり、後からいじるのはめんどくさくなっています。
ファイル名はtest.cssです。

/* ページ全体の背景色をsnowにする */
body {
  background-color: snow;
}

/* ヘッダーを細いバーにして、スクロール時についてくるようにする */
header {
  background-color: darkblue;
  position: fixed;
  top: 0;
  left: 0;
  height: auto;
  width: 100%;
  color: snow;
}

header p {
  margin: 0;
}

/* h1の前にロゴを置いて、位置を変更 */
h1 {
  color: maroon;
  font-family: fantasy;
  margin: 1.5em;
}

h1:before {
  content: url("sass.png");
}


次に、Scssを書きます。
CSSと比べて、後からいじるのがかなり楽です。
色や大きさを変えるだけなら、変数の値を変えるだけでできます。
ScssのメンテナブルっぷりはCSSとは比較になっていませんね。

// 変数
// ページ全体
$page-background-color: snow;

// ヘッダー
$header-background-color: darkblue;
$header-color: snow;

// h1
$h1-color: maroon;
$h1-font: fantasy;
$h1-margin: 1.5em;
$h1-font-size: 2.25em;
$logo-img: "sass.png";


// ミックスイン
// ヘッダーをバーにする。
@mixin make-header-bar($background-color, $color) {
  background-color: $background-color;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: auto;
  color: $color;

  * {
    margin-top: 0;
    margin-bottom: 0;
  }
}

// ロゴを置く。
@mixin put-logo($img) {
  &:before {
    content: url($img);
  }
}


// スタイルを当てる
// ページ全体の背景色をセット
body {
  background-color: $page-background-color;
}

// ヘッダーをバーにする
header {
  @include make-header-bar($header-background-color, $header-color);
}

// h1にロゴを置いて、位置を変更
h1 {
  @include put-logo($logo-img);

  margin: $h1-margin;
  font-family: $h1-font;
  font-size: $h1-font-size;
  color: $h1-color;
}

書けたら、コンパイルします。

$ sass test.scss test.css


いかがだったでしょうか。
個人的には、今後CSSを書く気が失せるほど、Scssの方が優れていると感じました。
Railsが生成するScssファイルにCSSをそのまま書くのはもったいないですね。