Dart Sassを使う上で1番基本的なネストやアンパサンドの書き方|Dart Sass入門

Sassの前提知識
Sassは「Syntactically Awesome StyleSheet」の略で、直訳すると「構文的に素晴らしいスタイルシート」になります。
下記のような機能が使えて、最終的にSassをコンパイル(変換)してCSSにすることで、ブラウザでも問題なく読み込めて、なおかつ便利な機能が使えます。
- CSSを入れ子にできるネスト機能
- 変数機能(Sassが登場した当時はCSSの変数機能もまだ存在していなかった)
- mixinやextendなど、よく使う記述一式をグループ化して利用できる
これらの機能を使うことで、記述量を減らしたり、CSSの管理がしやすくなります。
現在はDart Sassが主流
Sassにもいろいろ種類がありますが、2022年現在は「Dart Sass」と呼ばれるものが主流になっています。
それ以外の種類については過去にまとめているので、ぜひそちらの記事をご覧ください。
Sassのコンパイル方法
ブラウザはSassを直接読み込めないので、最終的にCSSにコンパイルする必要があります。
コンパイル方法は数多くありますが、初心者の方はまずVisual Studio Codeの拡張機能を利用するのが簡単です。
- Visual Studio Codeの拡張機能を使う
- Webpackやgulpなどのツールを使う
- Preprosなどのアプリケーションを使う
基本的な書き方
ここから先は、Sassの特徴的な機能であるネストなどの基本的な書き方について紹介します。
ネスト(入れ子)
Sassでは波括弧の中に波括弧をネスト(入れ子)にできます。
.wrap{
.btn{
display: block;
}
}この場合は.wrapの中にある.btnにのみスタイルを適用する指定ができて、コンパイルすると下記のようになります。
.wrap .btn{
display: block;
}要素の中の要素を指定する、いわゆる「子孫セレクタ」になります。
ネストすることによって、何度も同じclass名を書く必要がなくなるのと、どのclassに内包しているのか分かりやすくなります。
アンパサンド
ネスト内で&(アンパサンド)記号を使うと、親セレクタの名前のすぐ後ろにくっつく形で変換されます。
具体的にコンパイル前と後を見比べると分かります。
.btn{
&-primary{
display: block;
}
}上記のように「&-primary」と記述した場合は、「&」の部分にその親である「.btn」が入ります。
.btn-primary{
display: block;
}疑似要素や疑似クラスと組み合わせることで、ホバーなどの管理が非常にしやすくなります。
.btn{
&-primary{
display: block;
&:hover{
// ホバー時のスタイル
}
&::before{
// 疑似要素のスタイル
}
}
}このように管理することで、どんなCSSが適用されるのかコードを見ただけで想像しやすくなります。
アンパサンドを使った直下セレクタの指定
>で区切ることで、特定要素の直下にある要素を指定できます。
これを直下セレクタと呼ぶのですが、これもアンパサンドを使ってSassで表現できます。
article{
& > p{
font-size: 15px;
line-height: 1.5;
}
}コンパイルすると下記のようになります。
article > p{
font-size: 15px;
line-height: 1.5;
}アンパサンドを使った隣接セレクタの指定
+で区切ると、特定要素の次にくる要素を指定できます。
これを隣接セレクタと呼び、Sassのアンパサンドで表現できます。
article{
& + footer{
border-top: 1px solid #ccc;
}
}コンパイルすると下記のようになって、<article>タグの次にくる<footer>にのみスタイルが適用されるようになります。
article + footer{
border-top: 1px solid #ccc;
}アンパサンドを使った間接セレクタの指定
~で区切ることで、特定の要素以降にある要素を指定できます。
これを間接セレクタと呼び、Sassのアンパサンドで表現できます。
h2{
& ~ p{
font-size: 13px;
}
}コンパイルすると下記のようになって、<h2>タグ以降にある<p>にスタイルが適用されるようになります。
h2 ~ p{
font-size: 13px;
}ちなみに、間接セレクタは同じ階層にある要素にしか適用されないので注意が必要です。
階層を深くしすぎないように注意する
なんでもかんでもネストしていくと、どんどん階層が深くなってしまい逆に見にくいコードになってしまいます。
また、たとえば.btn-primaryを探したいときにアンパサンドで区切られていると検索に引っかからないデメリットがあります。
ルールを決めておけば「&-primary」で検索して見つけることもできますが、同じように「&-primary」の記述をしていると他にも検索候補が表示されてしまいます。
どこまで区切った方がいいのか、後から探すときに困らないか考えつつ、バランスを考えて利用するようにしましょう。



SourceTreeでマージ時に「fatal: You have not concluded your merge (MERGE_HEAD exists).」と表示される場合の対処法
全角スペースを可視化してくれるVisual Studio Codeの拡張機能「zenkaku」
Visual Studio Codeで複数ファイルを編集するときにタブやペインの操作方法
横幅が広がったときの挙動が変わる!CSS Gridの「auto-fill」と「auto-fit」の違い
サイトのPocketに保存された回数や、あとで読まれた回数まで解析できるPocketのパブリッシャーツールの登録方法
Emmetで複数のタグを一括展開して、コーディングスピードをさらに上げる方法
Visual Studio Codeでファイル差分の比較を行う方法
gulp-plumberとgulp-notifyでgulpエラー時にデスクトップで通知がくるようにする
ダミーとして使うURLは適当に入力せず、決まったものを使うようにしよう
WordPressで作成した記事をSlackでシェアしたときに、抜粋文が長く表示される場合の対処法
iTerm2で「Use System Window Restoration Setting」を設定しているとアラートが表示されて機能しない
Google Chromeのサイト内検索(カスタム検索)機能を別のプロファイルに移行する方法
iPadで入力モードを切り替えずに数字や記号をすばやく入力する方法
iPhoneやiPadでYouTubeの再生速度を3倍速や4倍速にする方法
Keynoteで有効にしているはずのフォントが表示されない現象
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
AirPodsで片耳を外しても再生が止まらないようにする方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
GitHubの通知を見逃さない!通知に特化したアプリ「Gitify」
Keyboard Maestroの変数基礎
Neovimを使い始める最初の一歩として便利な「LazyVim」
ウェブサイトをmacOSアプリとしてラッピングする「Unite Pro」
Keyboard Maestroの「Macro Debugger」で複雑なマクロのデバッグを行う方法
無料版でも高機能なランチャーアプリ「Raycast」の基本機能と環境設定
OnyXでターミナルを使わずにmacOSの詳細設定を行う
軽量で高速なターミナルエミュレーター「Ghostty」の設定方法
Eagleで実現するクリエイティブ素材の簡単管理
かゆいところに手が届く「Supercharge」でMac環境を便利にカスタマイズする