この用語をシェア
概要
Sass(Syntactically Awesome Style Sheets)は、CSSに変数、ネスト、ミックスイン、関数などのプログラミング機能を追加するCSSプリプロセッサです。2006年にHampton Catlinが考案し、Natalie Weizenbaumらによって言語仕様と実装が発展してきました。もともとの実装はRuby製でしたが、現在はGoogleが開発を主導するDart言語実装「Dart Sass」が公式のリファレンス実装となっています。
SassはCSSそのものではなく「CSSにコンパイルされる別の言語」である点が最大の特徴です。ブラウザはSassのファイルを直接解釈できないため、開発時に記述した.scssや.sassファイルをビルドツールでCSSファイルに変換(コンパイル)してから配信します。この一手間と引き換えに、変数・条件分岐・ループ・モジュール分割といった、素のCSSだけでは実現しづらい「プログラミング的な書き方」が可能になります。
記法は2種類あります。中括弧とセミコロンを使いCSSとの互換性が高いSCSS記法(拡張子.scss)と、インデントで階層を表現し中括弧・セミコロンを省略するSass記法(インデント記法、拡張子.sass)です。実務ではCSSからの移行のしやすさや既存資産との親和性から、SCSS記法を採用するプロジェクトが大半を占めています。本ページのサンプルコードも特に断りがない限りSCSS記法で統一しています。
仕組み:どうやってCSSになるのか
Sassの処理フローは大きく3段階です。(1) .scss/.sassファイルを記述する、(2) Sassコンパイラ(Dart Sassなど)が構文解析してCSSの構文木に変換する、(3) 通常のCSSファイル(.css)として出力し、HTMLからは他のCSSファイルと同様に<link>タグで読み込む、という流れです。ブラウザ・サーバーはコンパイル後のCSSしか関知しないため、Sass自体はランタイムに一切依存しない「ビルド時のみの技術」である点が設計上のポイントです。
コンパイルの実行方法は主に3つあります。1つ目はコマンドラインからsass input.scss output.cssのように直接呼び出す方法、2つ目はwebpackのsass-loaderやViteの組み込みサポートのようにビルドツールのパイプラインに組み込む方法、3つ目はエディタ拡張機能(VS CodeのLive Sass Compiler等)でファイル保存時に自動コンパイルする方法です。近年の新規プロジェクトではViteやwebpackなど既存のバンドラーに統合するケースが主流になっています。
基本的な使い方
Sassの主要な機能を使った基本的な記述例です:
// 変数の定義
$primary-color: #3498db;
$secondary-color: #2ecc71;
$font-stack: 'Helvetica, Arial, sans-serif';
$border-radius: 8px;
// ミックスインの定義
@mixin button-style($bg-color, $text-color: white) {
background-color: $bg-color;
color: $text-color;
padding: 12px 24px;
border: none;
border-radius: $border-radius;
cursor: pointer;
transition: all 0.3s ease;
&:hover {
background-color: darken($bg-color, 10%);
transform: translateY(-2px);
}
}
// ネストと親セレクタ参照
.navbar {
background-color: $primary-color;
padding: 1rem 0;
.container {
max-width: 1200px;
margin: 0 auto;
.nav-links {
display: flex;
list-style: none;
li {
margin-right: 2rem;
a {
color: white;
text-decoration: none;
font-family: $font-stack;
&:hover {
text-decoration: underline;
}
}
}
}
}
}
// ミックスインの使用
.btn-primary {
@include button-style($primary-color);
}
.btn-secondary {
@include button-style($secondary-color, #333);
}
主な機能
- 変数:色、フォント、サイズなどの値を変数として定義し再利用可能
- ネスト:CSSセレクタを階層構造で記述し、HTML構造に近い形で整理
- ミックスイン:再利用可能なスタイルブロックを定義し、引数も渡せる
- 継承:@extendディレクティブで他のセレクタのスタイルを継承
- 演算:数値計算、色操作、文字列操作が可能
- 条件分岐・ループ:@if、@for、@while、@eachで制御構造を記述
- 関数:カスタム関数の定義と組み込み関数の利用
- モジュールシステム:
@use/@forwardによるファイル分割と名前空間管理
具体例・ユースケース
Sassが実務でどのように使われるかを、代表的な3つの場面で見てみます。
1. レスポンシブ対応をミックスインで共通化する
ブレークポイントの記述をコンポーネントごとにベタ書きすると、値のズレや修正漏れが起きやすくなります。ミックスインに閉じ込めておけば、ブレークポイントの変更が1箇所で完結します。
$breakpoints: (sm: 576px, md: 768px, lg: 1024px);
@mixin mq($name) {
@media (min-width: map-get($breakpoints, $name)) {
@content;
}
}
.card {
padding: 1rem;
@include mq(md) {
padding: 2rem;
display: flex;
}
}
2. デザインシステムのトークンをファイル分割して管理する
色・余白・タイポグラフィなどのデザイントークンを_variables.scss等の部分ファイル(パーシャル、ファイル名の先頭に_を付ける)にまとめ、@useで必要なファイルから読み込むのが定石です。これにより、数百ファイル規模のCSSでも「どこで何を定義しているか」が追いやすくなります。
// _tokens.scss
$color-brand: #1B365D;
$space-unit: 8px;
// button.scss
@use 'tokens';
.btn {
background: tokens.$color-brand;
padding: tokens.$space-unit * 2;
}
3. ループで大量のユーティリティクラスを生成する
余白やグリッド幅など機械的に増えるクラスは@eachや@forで生成すると、記述量とヒューマンエラーの両方を減らせます。Bootstrapの.mt-1〜.mt-5のようなクラス群も、内部的にはこの手法で生成されています。
@each $size, $value in (1: 4px, 2: 8px, 3: 16px) {
.mt-#{$size} { margin-top: $value; }
.mb-#{$size} { margin-bottom: $value; }
}
このように、Sassは「単発のスタイル調整」よりも「規則性のあるスタイルを大量に、一貫したルールで作る」場面で真価を発揮します。逆に、数ページ程度の小規模サイトでは、ビルド環境を用意するコストに見合わないこともあります。
メリット・デメリット
メリット
- 開発効率向上:変数やミックスインにより重複コードを削減
- 保守性向上:変数を使うことで一括変更が容易になる
- コードの整理:ネスト機能により構造化されたコードが書ける
- 再利用性:ミックスインや関数で共通スタイルを効率的に管理
- 数学的操作:計算機能により動的なサイズ調整が可能
- 豊富な関数:色操作、文字列操作などの組み込み関数が充実
- 大規模プロジェクト対応:ファイル分割とインポート機能でスケーラブル
デメリット・注意点
- ビルド環境が必須:コンパイル工程が増えるため、静的HTMLのみの小規模サイトでは構成がやや重くなる
- 過度なネストの罠:ネストを深くしすぎると出力されるCSSのセレクタ詳細度(Specificity)が上がり、後から上書きしづらいCSSになりがち
- デバッグの間接性:ブラウザの開発者ツールに表示されるのはコンパイル後のCSSであり、元のSassの行番号とはズレることがある(ソースマップの併用で軽減可能)
- ネイティブCSSとの機能重複:CSS変数(Custom Properties)やCSSネイティブネストの普及により、Sassでしか実現できない機能の範囲は年々狭まっている
- チーム内の設計ルールが必要:ミックスインや変数を無秩序に増やすと、逆に「どこで何が定義されているか分からない」状態に陥りやすい
混同されやすい用語・類似技術との違い
CSSプリプロセッサ/後処理ツールの分野は名称が似ているものが多く、混同されがちです。代表的な技術との違いを整理します。
| 技術 | 位置づけ | Sassとの違い |
|---|---|---|
| SCSS | Sassの記法の1つ | 別技術ではなく、Sassが持つ2つの構文(.sass/.scss)のうちCSS互換のもの。「SassかSCSSか」を対立概念のように語るのは誤り |
| Less | 競合するCSSプリプロセッサ | JavaScriptで実装されコンパイルがやや軽量。ただし関数・条件分岐・モジュールシステムの表現力はSassの方が豊富とされ、Bootstrap 4以降もLessからSassへ移行した経緯がある |
| PostCSS | CSSの後処理(変換)基盤 | プリプロセッサではなく、プラグインでCSSを変換する仕組み。Autoprefixer等のプラグインを使うのが一般的で、Sassと競合するというより併用されることが多い(例:Sassでコンパイル→PostCSSでベンダープレフィックス付与) |
| CSS Modules | クラス名のスコープ分離手法 | 変数やミックスインではなく「クラス名の衝突を防ぐ」ことが目的。SassとCSS Modulesはレイヤーが異なるため併用も可能(.module.scss) |
| CSS-in-JS(styled-componentsなど) | JavaScript内にスタイルを記述する手法 | コンポーネント単位でスタイルをJS側に持つ設計思想で、ビルド時ではなくランタイムに評価されるものも多い。Sassはあくまで「CSSを生成するだけ」でJSとの結合は前提としない |
| Tailwind CSS | ユーティリティファーストのCSSフレームワーク | 「独自クラスを設計して書く」Sassに対し、Tailwindは「用意された小さなクラスをHTML側に並べる」思想。設計哲学が異なるため単純な優劣ではなく、プロジェクトの好みやチーム文化で選ばれる |
| CSSネイティブ機能(Custom Properties/ネスト) | ブラウザが標準で解釈するCSS機能 | CSS変数はSassの変数と異なり実行時(ランタイム)に値を変更できる(例:メディアクエリやJSでの動的書き換え)。Sassの変数はビルド時に値が確定し出力後は変更できない、という決定的な違いがある |
特に「Sass変数」と「CSSカスタムプロパティ」の違いは実務で誤解されやすいポイントです。Sassの$colorはコンパイル時に文字列置換される静的な値であるのに対し、CSSの--colorはDOM上でカスケード(継承・上書き)され、メディアクエリの内側やJavaScriptから動的に変更できます。テーマ切り替え(ライト/ダークモード)のような実行時の値変更が必要な場面ではCSSカスタムプロパティを使い、ビルド時に確定する共通値の管理にはSass変数を使う、という使い分けが現実的です。
実務での採用ポイント・エコシステム
Sassは以下の技術と組み合わせて使用されます:
- CSS:Sassコンパイル後の出力対象となるスタイルシート言語
- SCSS:CSS互換の記法を持つSassの拡張構文
- Dart Sass:現在の公式リファレンス実装。npmでは
sassパッケージとして配布 - PostCSS / Autoprefixer:Sassでコンパイルした後にベンダープレフィックスを自動付与する後処理ツール
- Vite / webpack(sass-loader):モジュールバンドラーとしてSassのコンパイルをビルドパイプラインに統合
- Bootstrap:ソースコードがSassで書かれているCSSフレームワーク。カスタマイズ時は変数の上書きでテーマ調整が可能
- Compass、Bourbon、Susy:Sass向けのミックスインライブラリ・グリッドシステム。近年はCSS Gridの普及や機能内蔵化により利用は縮小傾向
大規模なSassコードベースでは、ファイル構成の指針として「7-1パターン」(base/・components/・layout/・pages/・themes/・abstracts/・vendors/の7フォルダ+1つの集約ファイルという構成)が広く参考にされています。厳密に7フォルダすべてを使う必要はありませんが、「変数・関数などの抽象定義」「個別コンポーネント」「レイアウト」を分離するという考え方自体は、中規模以上のプロジェクトで採用する価値があります。
採用を検討すべき場面としては、(1) デザインシステムやコンポーネントライブラリを複数チームで共有し変数管理を一元化したい、(2) Bootstrapなど既存のSassベースフレームワークをカスタマイズして使う、(3) 色や余白の計算ロジック(明度調整、比率計算など)をCSSの記述の中で完結させたい、といったケースが挙げられます。逆に、静的なランディングページ1枚を作るだけの案件や、React/VueなどでCSS-in-JSやCSS Modulesを既に採用しているプロジェクトに後から導入するメリットは薄いことが多いです。
2025〜2026年の最新動向
実装面の一本化が完了。かつて存在したRuby Sass、C/C++実装のLibSass(node-sass経由で広く使われていた)は既に開発が終了しており、現在はDart SassがSassの唯一の公式実装となっています。新規プロジェクトでnode-sassを選ぶ理由は実質的になく、npmパッケージもsass(Dart Sassをコンパイルしたもの)を使うのが標準です。
@importの非推奨化が進行中。Sass公式は従来のファイル分割手段であった@importルールを非推奨とし、@use/@forwardによるモジュールシステムへの移行を進めています。既存の大規模プロジェクトでは@importがまだ多く残っていますが、新規コードでは@useを使うことが事実上の標準的な作法になっています。
CSSネイティブ機能との機能重複が進む。CSSカスタムプロパティ(変数)はモダンブラウザで広く利用可能になり、さらにCSSネイティブのネスト構文も主要ブラウザでのサポートが進んでいます。これにより「変数とネストだけが目的ならSassでなくても書ける」場面が増え、Sass導入の主な動機は、ミックスイン・関数・条件分岐・モジュール分割といった「CSSネイティブにはまだ存在しない機能」に絞られつつあります。
フロントエンドのスタイリング手法が多様化。React/Vueエコシステムでは、CSS Modules、Tailwind CSS、CSS-in-JSなど代替のスタイリング手法が広く定着しており、新規に立ち上げるSPAプロジェクトでSassを第一候補に選ぶ比率は以前より下がっている、というのが実務上の肌感です。一方で、Bootstrapを使う案件、レガシーな大規模CSS資産を持つ企業サイト、デザインシステムのトークン管理など「CSS中心の大規模プロジェクト」では引き続き現役の選択肢です。
総じて、Sassは「新技術に置き換えられつつある過去の技術」というより、「適用範囲がCSSネイティブ機能でカバーしにくい高度な用途に収束しつつある成熟した技術」と捉えるのが実態に近い評価と言えます。
関連用語
- CSS - Sassのコンパイル先となるスタイルシート言語
- SCSS - SassのCSS互換記法
- Tailwind CSS - ユーティリティファーストの代替アプローチ
- Bootstrap - Sassで実装されている代表的なCSSフレームワーク
- Webpack - sass-loaderでSassのコンパイルを統合できるモジュールバンドラー
外部リンク
よくある質問(FAQ)
Q. Sassとは?
CSSプリプロセッサです。変数・ネスト・ミックスイン・関数・条件分岐といったプログラミング的な機能を追加し、コンパイルすると通常のCSSファイルが出力されます。
Q. SassとSCSSは何が違いますか?
別の技術ではなく、Sassが持つ2種類の記法の名称です。中括弧・セミコロンを使いCSSと互換性が高いのがSCSS記法(.scss)、インデントで階層を表すのがSass記法(.sass)です。実務ではSCSS記法が主流です。
Q. SassとLessの違いは何ですか?
どちらもCSSプリプロセッサですが、SassはRuby由来で条件分岐・ループ・モジュールシステムなど機能が豊富、Lessは元々JavaScriptベースでより軽量です。Bootstrapが4系でLessからSassへ移行するなど、機能面での支持はSassに傾いた経緯があります。
Q. Sass変数とCSSカスタムプロパティ(CSS変数)はどちらを使うべきですか?
ビルド時に確定していい共通値(ブレークポイント、余白の基準値など)はSass変数、ダークモード切り替えのように実行時に値を変えたいものはCSSカスタムプロパティが向いています。両者は競合するものではなく併用が一般的です。
Q. node-sassとDart Sass、どちらを使えばいいですか?
node-sass(LibSassベース)は開発が終了しているため、新規プロジェクトではnpmのsassパッケージ(Dart Sass)を使うのが標準です。
Q. 2025〜2026年時点の最新動向は?
CSSネイティブのネスト・カスタムプロパティの普及により、変数やネストだけを目的とした導入の必要性は低下傾向です。一方でミックスイン・関数・モジュールシステムなど高度な機能は引き続き有用で、Bootstrapを使う案件や大規模なデザインシステムでは現役の技術です。実装はDart Sassに一本化されており、@importから@use/@forwardへの移行が推奨されています。
