
【CSS】SCSSの基礎
目次
SCSSの入れ子構造
入れ子構造(ネスト構造) とは、親要素の中に子要素のスタイルを書くことで、
階層構造を視覚的にわかりやすくする SCSSの特徴です。
例:ネストあり
- .card {
- background: #fff;
- padding: 20px;
- .title {
- font-size: 18px;
- font-weight: bold;
- }
- .text {
- color: #555;
- }
- }
↑をCSSに変換
- .card {
- background: #fff;
- padding: 20px;
- }
- .card .title {
- font-size: 18px;
- font-weight: bold;
- }
- .card .text {
- color: #555;
- }
◆ネストの利点(メリット)
1. 親子関係が見やすい
• .card の中の .title や .text が直感的にわかる。
2. 構造が自然に反映される
• HTMLの階層と同じようにSCSSが書ける。
3. 記述が短くなる
• 親クラスを何度も書かなくてよい。
ネストの注意点・デメリット
•ネストが深くなりすぎると危険
- .header {
- .nav {
- ul {
- li {
- a {
- span {
- color: red;
- }
- }
- }
- }
- }
- }
↑をCSSに変換
- .header .nav ul li a span {
- color: red;
- }
保守性が悪くなり、セレクタも重く なります。
◆ 推奨ルール
• ネストは 2〜3階層まで に抑える。
• コンポーネント単位で分けて、責任を分離する。
よく使うネスト構文
& アンパサンド(親セレクタの再利用)
- .button {
- color: #000;
- &:hover {
- color: #fff;
- background: #000;
- }
- &.is-active {
- border: 1px solid blue;
- }
- }
↑をCSSに変換
- .button {
- color: #000;
- }
- .button:hover {
- color: #fff;
- background: #000;
- }
- .button.is-active {
- border: 1px solid blue;
- }
SCSS(Sass)の変数設定
SCSS(Sass)の変数は、値を再利用可能にして、スタイルの保守性を高めるための非常に便利な機能です。
色、フォントサイズ、余白、ブレークポイントなど、さまざまな値を変数として定義できます。
基本構文
- $変数名: 値;
- $primary-color: #3498db;
- $font-stack: 'Helvetica Neue', sans-serif;
- $padding-base: 16px;
使用方法
- body {
- font-family: $font-stack;
- background-color: $primary-color;
- padding: $padding-base;
- }
よく使う変数の例
- // カラーパレット
- $color-primary: #1abc9c;
- $color-secondary: #2ecc71;
- $color-accent: #e74c3c;
- $color-text: #333;
- $color-bg: #f9f9f9;
- // フォントサイズ
- $font-size-base: 16px;
- $font-size-large: 20px;
- $font-size-small: 12px;
- // スペーシング
- $spacing-sm: 8px;
- $spacing-md: 16px;
- $spacing-lg: 32px;
- // ブレークポイント
- $breakpoint-sm: 576px;
- $breakpoint-md: 768px;
- $breakpoint-lg: 992px;
- $breakpoint-xl: 1200px;
実用サンプル
- $color-primary: #007bff;
- $font-size-base: 16px;
- $padding-base: 1rem;
- .button {
- background-color: $color-primary;
- color: white;
- font-size: $font-size-base;
- padding: $padding-base;
- border: none;
- border-radius: 4px;
- &:hover {
- background-color: darken($color-primary, 10%);
- }
- }
SCSS変数のメリット
1.保守性の向上
一箇所の変更で全体に影響を与えられる
2.デザインの一貫性
色やフォントなどを統一できる
3.チーム開発で便利
命名規則に沿えば他の人でも直感的に理解しやすい
FLOCSS や BEM と組み合わせた SCSS の変数管理方法
FLOCSS(ファイル構成ルール)とは
FLOCSS(Folder + Layout + Object + Component + Project)では、次のようにファイルを分けて管理します。
- /scss/
- ├── foundation/ // 基本設定(変数やmixinなど)
- ├── layout/ // ヘッダーやフッターなどのレイアウトパーツ
- ├── object/
- │ ├── component/ // UIコンポーネント(ボタンなど)
- │ ├── project/ // プロジェクト固有のモジュール
- │ └── utility/ // ヘルパークラス(margin調整など)
- └── style.scss // メインの読み込みファイル
BEM(命名規則)について
BEMは、クラス名を以下の形式で管理します。
BEMにおける –(ダブルハイフン)と __(ダブルアンダースコア)は、
それぞれ役割がまったく違うので、しっかり区別することが重要です。
◆ __(ダブルアンダースコア):Element(要素)
• 「Blockの中の構成要素」を表します。
• Blockが親で、Elementはその部分的なパーツ。
• ElementはBlockがなければ存在できないものです。
- .card {} // Block
- .card__title {} // Element(カードの中のタイトル)
- .card__image {} // Element(画像)
◆ –(ダブルハイフン):Modifier(修飾子)
• BlockやElementの状態やバリエーションを表します。
• 色違い・サイズ違い・アクティブ状態など。
• 基本構造に意味のある変化を加えるものです。
- .button {} // Block
- .button--large {} // Modifier(大きいサイズのバリエーション)
- .button--secondary {} // Modifier(色の違い)
◆ 組み合わせた例
- <div class="card card--featured">
- <h2 class="card__title">タイトル</h2>
- <img class="card__image" src="..." />
- </div>
• .card → Block
• .card__title → Element(タイトル部分)
• .card–featured → Modifier(特別な装飾付き)
◆ 覚え方のコツ
__アンダースコア・・・部品(構成要素)
–ハイフン・・・バリエーション(状態変更)
- .card__title--large {} // ElementにもModifierをつけられる
FLOCSS + BEM における変数の管理方法
1. foundation/_variables.scss にすべての変数をまとめる
- // colors
- $color-primary: #3498db;
- $color-secondary: #2ecc71;
- $color-text: #333;
- $color-white: #fff;
- $color-bg: #f5f5f5;
- // font sizes
- $font-size-base: 16px;
- $font-size-sm: 14px;
- $font-size-lg: 20px;
- // spacing
- $space-xs: 4px;
- $space-sm: 8px;
- $space-md: 16px;
- $space-lg: 32px;
- // breakpoints
- $breakpoint-sm: 576px;
- $breakpoint-md: 768px;
- $breakpoint-lg: 992px;
2. foundation/_mixin.scss で共通処理を定義(例:メディアクエリ)
- // colors
- @mixin mq($breakpoint) {
- @if $breakpoint == sm {
- @media (min-width: $breakpoint-sm) { @content; }
- } @else if $breakpoint == md {
- @media (min-width: $breakpoint-md) { @content; }
- } @else if $breakpoint == lg {
- @media (min-width: $breakpoint-lg) { @content; }
- }
- }
3. _button.scss(component)で変数を使ったBEMスタイル
- // object/component/_button.scss
- .button {
- display: inline-block;
- font-size: $font-size-base;
- padding: $space-sm $space-md;
- background-color: $color-primary;
- color: $color-white;
- border-radius: 4px;
- text-align: center;
- &--secondary {
- background-color: $color-secondary;
- }
- &--large {
- font-size: $font-size-lg;
- padding: $space-md $space-lg;
- }
- &:hover {
- opacity: 0.8;
- }
- }
4. style.scss ですべてを読み込む
- // style.scss
- @import "foundation/variables";
- @import "foundation/mixin";
- @import "layout/header";
- @import "layout/footer";
- @import "object/component/button";
- @import "object/project/home";
命名&変数のルール
◆ 色
命名ルール例:$color-primary
補足:役割に基づく命名が基本
◆ サイズ
命名ルール例:$font-size-base
補足:_base, _sm, _lg など
◆ 余白
命名ルール例:$space-sm
補足:スケール単位で統一
◆ BEMクラス名
命名ルール例:.block__element–mod
補足:FLOCSS内の各componentで使用
SCSSの@importとは?
- @import 'filename';
•拡張子 .scss や _(アンダースコア)は省略可能。
•SCSSファイルを分割して管理でき、1つにまとめて読み込めます。
◆ ファイル構成
- /scss
- ├── _variables.scss
- ├── _mixins.scss
- └── main.scss
- // main.scss
- @import 'variables';
- @import 'mixins';
- body {
- background-color: $main-bg;
- }
★ 今までの@importはもう古い!これからは@use使う!
これまでは@importでファイルを読み込んでいましたが、Sass公式では今後使わないように!と言っています。
@useの使い方
SCSSファイルを読み込む新しい書き方です。
- @use 'ファイル名';
読み込んだファイルの中身を「ファイル名.変数名」で使う
- // _variables.scss
- $main-color: #ff6600;
- // main.scss
- @use 'variables';
- body {
- color: variables.$main-color;
- }
variables.$main-color みたいに「どのファイルの変数か」分かるように書くのがルールです。
@forwardも使う!
これは、「他のファイルの中身をまとめて渡す」ために使います。
FLOCSSのように、たくさんファイルがあるときに便利!
ファイルの構成
- scss/
- ├── foundation/
- │ ├── _variables.scss
- │ ├── _reset.scss
- │ └── _index.scss ← ここにまとめる!
- └── main.scss
① _variables.scss
- $main-color: #007acc;
② _reset.scss
- * {
- margin: 0;
- padding: 0;
- }
③ _index.scss ← ここに@forwardを使ってまとめる!
- @forward 'variables';
- @forward 'reset';
④ main.scss ← ここで@useするだけでOK!
- @use './foundation/index' as foundation;
- body {
- color: foundation.$main-color;
- }
「foundation」という名前でまとめて読み込める。
まとめ
機能:@use
目的:読み込む
書き方:@use ‘ファイル名’;
ポイント:名前空間が必要!
機能:@forward
目的:まとめて渡す
書き方:@forward ‘ファイル名’;
ポイント:インデックスファイルで使う
このやり方で書く利点
•ファイルがスッキリ整理できる
•変数の場所が分かりやすい
•エラーが減る!
SCSSのリスト機能とループ処理(@each)を使って、同じパターンのクラスを自動生成する方法
- $colors: red, blue, green;
- @each $color in $colors {
- .text-#{$color} {
- color: $color;
- }
- }
↑をCSSに変換
- .text-red {
- color: red;
- }
- .text-blue {
- color: blue;
- }
- .text-green {
- color: green;
- }
解説
① $colors: red, blue, green;
これはSassのリスト(配列のようなもの)です。
変数 $colors に red, blue, green の3つの色を格納しています。
② @each $color in $colors { … }
これはループ構文です。
リストの中身を1つずつ $color に代入して、ブロックの中の処理を繰り返します。
③ .text-#{$color}
ここで使われている #{$color} は「変数の値を展開する(=文字列の中に埋め込む)」という意味です。
.text-#{$color}は、それぞれ:
• .text-red
• .text-blue
• .text-green
というクラス名に変換されます。
④ color: $color;
これも $color に代入された値を使って、color: red; などに展開します。
Sass(SCSS)の @mixin と @includeについて
@mixinとは?
- @mixin border-radius {
- border-radius: 8px;
- }
これは「共通して使いたいスタイルをまとめておく場所」です。
HTMLでいう「部品の型」みたいなものです。
@includeとは?
「@mixinを呼び出して使う」ものです。
- .box {
- @include border-radius;
- }
これは、さきほど作った @mixin の中身(border-radius: 8px;)を、
.box の中で呼び出して使うことを意味します。
つまりこういう関係
- @mixin → 型(レシピ)
- @include → 呼び出し(料理する)
実用的な例:引数を使っての応用
- // 1. 使い回したいスタイル(mixin定義)
- @mixin font($size, $weight) {
- font-size: $size;
- font-weight: $weight;
- }
- // 2. 必要な場所で呼び出し(include)
- .title {
- @include font(24px, bold);
- }
↑をCSSに変換
- .title {
- font-size: 24px;
- font-weight: bold;
- }
@mixin と @includeの利便性
• 同じスタイルを何度も書かなくてよくなる
• 値を引数で変えられるので柔軟に再利用できる
• 管理しやすく、修正も一か所で済む(メンテ性アップ)
よく使われる @mixin サンプル
① ボーダー・角丸
- @mixin rounded($radius: 4px) {
- border-radius: $radius;
- }
- .card {
- @include rounded(8px);
- }
ここで ($radius: 4px) と書いてありますが、
これは、「引数が渡されなかったときは 4px を使うよ」
という意味です。
↑をCSSに変換
- .card {
- border-radius: 8px;
- }
② フレックスボックス(中央寄せ)
- @mixin flex-center {
- display: flex;
- justify-content: center;
- align-items: center;
- }
- .container {
- @include flex-center;
- }
③ フォントスタイル
- @mixin font($size, $weight: normal, $line: 1.5) {
- font-size: $size;
- font-weight: $weight;
- line-height: $line;
- }
- .title {
- @include font(24px, bold);
- }
④ メディアクエリ(レスポンシブ対応)
- @mixin sp {
- @media (max-width: 767px) {
- @content;
- }
- }
- .header {
- font-size: 18px;
- @include sp {
- font-size: 14px;
- }
- }
@content は、mixinの中に「中身のCSSをはめ込む」特殊な機能です。
プロジェクト設計での使いどころ
FLOCSSでの活用例
• Foundation層に基本mixinをまとめる(例:_mixin.scss)
• **Object層(Componentなど)**で@includeして再利用
• Utility層と競合しないように、明確に役割を分ける
- // Foundation/_mixin.scss
- @mixin clearfix {
- &::after {
- content: "";
- display: table;
- clear: both;
- }
- }
- // Object/Component/_media.scss
- .media {
- @include clearfix;
- }
プロジェクトでよくある構成
- scss/
- ├── foundation/
- │ └── _mixin.scss ← mixinをまとめて定義
- ├── object/
- │ └── component/
- │ └── _button.scss ← includeして使う
- └── style.scss ← 全体の読み込み
- // style.scss
- @use "foundation/mixin";
- @use "object/component/button";