この記事は
普段CSSでコーディングしているけど、
Scssも便利らしいし勉強しなきゃなあと思ってる人向けの記事だよ!!
わたしも初めからScssを使ってたわけではないので、使ってみるまでいまいち便利さがわからなかったんだが、
今はもう逆にCSSでどうやって書いてたかよく覚えてないぞ・・・(´-ω-`)うぬぅ
Scssって何?
Sass は Syntactically Awesome Style Sheets (構文的に素晴らしいスタイルシート) の略で、CSSを便利に使えるように拡張した言語です。
-SASS (scss) の基本的な使い方/Web Design Leaves
CSSとだいたい一緒だけど、色々できてめちゃ便利になったのがSassって感じだな。
あれ?Sass?Scssじゃないの?
SassとScssはだいたい一緒だけど、ちょっと違う。
で、CSSから入ってるひとなら絶対Scssのが親しみやすい。
違いはあとで説明するけど、簡単に言うとCSSの書き方と似ている方がScssで、
もっと書き方が簡略化されているのがSassって感じだ。
(SassとScssの違いに飛ぶ)
WebでScssが試せるぞ
Scssは、コンパイルして一回CSSとして出力させてからHTMLに読み込ませるっていう仕組みなので、そもそもコンパイルできる環境ができてないと使えないのだけど、構築ができてなくても実際にどんな風に書けるのか試せるサイトが存在するので紹介。
環境ができてないけど勉強したいって人はひとまずこの辺で試してみるといいと思うぞ。
・SassMeister | The Sass Playground!
書いたScssを即時でコンパイルして出来上がったCSSも右側に表示してくれるサイト。
・CodePen
登録後、CSSの設定のところで「Scss」を選択すると、Scss記述でも書けるようになるサイト
Scssの書き方
じゃあ実際にどんな風に書くのかを見ていこう!
で、HTMLをこう書いたとする。
<div class="container">
<div class="inner">
<p class="title">コンテナのタイトル</p>
<p class="text">コンテナのテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
</div>
<div class="inner">
<p class="title">コンテナのタイトル</p>
<p class="text">コンテナのテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
</div>
<div class="inner">
<p class="title">コンテナのタイトル</p>
<p class="text">コンテナのテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
</div>
</div>
CSSで書いてみるとこんな感じ?
body {
background: #65B7B7;
}
.container {
display: flex;
margin: 0 auto;
width: 80%;
}
.inner {
background: #F5CE3F;
margin: 10px;
padding: 0 20px;
border-radius: 10px;
}
.title {
font-size: 26px;
font-weight: bold;
}
.text {
font-size: 14px;
}
これをScssにすると、こうなる。
body{
background:#65B7B7;
.container{
display:flex;
margin:0 auto;
width:80%;
.inner{
background:#F5CE3F;
margin:10px;
padding:0 20px;
border-radius:10px;
}
.title{
font-size:26px;
font-weight:bold;
}
.text{
font-size:14px;
}
}
}
そう、Scssはクラスの記述を入れ子にして書けるのだ!!!
こうすると、階層構造がとてもわかりやすいな!!!
&(アンパサンド)
を使う
でも、これだけだとまだ便利さがわからないよな。
次は、HTML上のクラスの名前を少し変えて書いてみる。
<div class="container">
<div class="container__inner">
<p class="container__title">コンテナのタイトル</p>
<p class="container__text">コンテナのテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
</div>
<div class="container__inner">
<p class="container__title">コンテナのタイトル</p>
<p class="container__text">コンテナのテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
</div>
<div class="container__inner">
<p class="container__title">コンテナのタイトル</p>
<p class="container__text">コンテナのテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
</div>
</div>
お?なんでアンスコ2個でつないでんの???ってなった人。
これはBEMというクラスの命名規則で、Scssと相性の良い規則なので覚えておいてほしいぞ。
(ハシビロコウが書いたBEM記事)
[HTML/SCSS]BEM設計をワイヤーフレームを使って解説してみる
で、こいつをScssで書くと、こうなる。
body{
background:#65B7B7;
}
.container{
display:flex;
margin:0 auto;
width:80%;
&__inner{
background:#F5CE3F;
margin:10px;
padding:0 20px;
border-radius:10px;
}
&__title{
font-size:26px;
font-weight:bold;
}
&__text{
font-size:14px;
}
}
そう、Scssは&(アンパサンド)
を使うことで、クラス名が一部省略できるのだ!
しかもBEMの規則に乗っ取って命名しておくと、
.container
の中にどんな子要素があるのか一目瞭然になる。
(ちなみにbody
も含めて入れ子にしてしまって良いんだけど、あんま入れ子やると階層が深くなってわかりづらいので離してます)
また、
a{
color:#fff;
}
a:hover{
color:#000;
}
とかの場合も、
a{
color:#fff;
&:hover{
color:#000;
}
}
こうやって入れ子にして書ける。
どこを:hover
した時なのか、わかりやすくなってよいよい。
もちろん、:before
・:after
も入れ子にして書けるから、
&:before
とか、&:after
っていう書き方もできる。
変数
Scssは変数を使うことができる。
たぶんいろいろやればすごい複雑なこともできるんだろうけど、今回はよく使ってる変数を紹介。
色の変数
ページ上で何度も使う色は、CSSだとそのたびにカラーコードをコピペしなきゃいけなくてめんどくさいよなぁ。
でも、Scssなら変数を一回書いてしまえばその必要がなくなるのだ。
色の変数の書き方は非常に簡単で、たとえば
$point:#6A71C4;
と書く($
の後の文字列はなんでもOK)。
ほんで、この色を使いたいタイミングがきた時に
color:$point;
とか
background:$point;
とかやるだけで、#6A71C4
の色が呼び出されるのだ。
font-family
も変数に
ページ内でたまに出てくるfont-family
がある場合は、
そいつも変数にしておくとお手軽に呼び出せるぞ。
$font_yu: 游ゴシック体, "Yu Gothic", YuGothic;
こうやって設定しておくと、
font-family:$font_yu;
こう書いた時に游ゴシック
が呼び出される。
便利〜〜〜〜〜〜〜
引数
Scssは、引数を使うこともできる。
→引数(アーギュメント)とは - IT用語辞典 e-Words
Scssの引数は、@mixin
で書いて@include
で呼び出せるぞ。
ここでは、わたしがよく使う@mixin
を紹介するぞ〜。
display:flex
display:flex
は、justify-content
とかalign-items
とか、ブラウザごとの記述とかが
いちいちめんどくさいので、@mixin
にして1行で呼び出せるようにしている。
こんな感じで。
@mixin flex($justify:space-between,$align:center) {
display: flex;
display: -webkit-flex;//Safari,Android,iOS対応
display: -ms-flexbox;//IE対応
justify-content: $justify;
-webkit-box-pack: $justify;//Safari,Android,iOS対応
-ms-flex-pack: $justify;//IE対応
align-items: $align;
-webkit-box-align: $align;//Safari,Android,iOS対応
-ms-flex-align: $align;//IE対応
}
@mixin
のあとに@mixin
の名前を、()
の中に初期値を設定。
{}
の中には呼び出したい記述を書いているよ。
で、今回の場合は$justify
と$align
ってのがjustify-content
とかalign-items
の値として入っているよな。
ここは、()
内で指定した値が呼び出されるので、指定を変えたいときは()
の中の値を指定すればよい。
ちなみにここで設定している()
内の値は初期値なので、
呼び出すときに
.hoge{
@include flex;
}
と書くと、コンパイルされるCSSは以下のようになるのだ。
.hoge{
display: flex;
display: -webkit-flex;
display: -ms-flexbox;
justify-content: space-between;
-webkit-box-pack: space-between;
-ms-flex-pack: space-between;
align-items: center;
-webkit-box-align: center;
-ms-flex-align: center;
}
これを例えば
.hoge{
@include flex($justify:flex-start,$align:baseline);
}
とかすると、コンパイルされるCSSは以下のようになるよ。
.hoge{
display: flex;
display: -webkit-flex;
display: -ms-flexbox;
justify-content: flex-start;
-webkit-box-pack: flex-start;
-ms-flex-pack: flex-start;
align-items: baseline;
-webkit-box-align: baseline;
-ms-flex-align: baseline;
}
なんとなくわかるかね?
position:absolute
これは自分の記事で度々紹介している@mixin
なのだけど、せっかくなのでまた載せておく。
position:absolute
も毎回行数が多くてめんどくさいので@mixin
にして呼び出しちゃいます。
@mixin absolute($top:null, $right:null, $bottom:null, $left:null){
position: absolute;
@if $top != null{
top: $top;
}
@if $right != null{
right: $right;
}
@if $bottom != null{
bottom: $bottom;
}
@if $left != null{
left: $left;
}
}
これは
$top
,$right
,$bottom
,$left
の値がnull
じゃないときは、
topには$top
の値を、rightには$right
の値を、bottomには$bottom
の値を、leftには$left
の値を入れてねっていう@mixin
ですな。
使うときはこんな感じ。
.hoge{
@include absolute($top:0,$left:0);
}
こうすると、コンパイルされるCSSは
.hoge{
position:absolute;
top:0;
left:0;
}
こうなる。1行で済むので記述量が減ってだいぶすっきりだな。
メディアクエリ
Scss使ってて一番「便利だな〜〜〜〜〜」と思うのは、これ使ってるときかもしれぬ。
レスポンシブ対応するページを作る際、メディアクエリを使うと思うのだけど、Scssでやるとこんな風な@mixin
が作れる。
$min_pc:769px;//デスクトップ(769px)以上
@mixin min_pc {
@media screen and (min-width: $min_pc) {
@content;
}
}
$min_pc
は変数だな。ここにはメディアクエリでよく使う769px
を入れたぞ。
@mixin
の中身にこれを当てはめると
@media screen and (min-width: 769px) {
@content;
}
となるな。
で、この@content
というのは、実行処理の@include
から@mixin
にスタイルセットを渡すことができる機能だぞ。
-@content : @mixinにスタイルセットを渡す | 集の一期一会
ちょっとなに言ってるかわからない人、わたしもよくわからないけど、つまり、
.hoge{
font-size:16px;
@include min_pc{
font-size:28px;
}
}
としたとき、コンパイルされるCSSはこうなるのだ。
.hoge {
font-size: 16px;
}
@media screen and (min-width: 769px) {
.hoge {
font-size: 28px;
}
}
メディアクエリもクラスに入れ子で書くことができるので、
どのクラスにどんなスタイルが当たっているのか確認するのが格段に楽になるぞ。
ブラウザハック
ブラウザハックもIEバグに苦しんでる時とかに使うよな。
これもメディアクエリと同じ感じで、@mixin
にしておくと便利だぞ。
/* IE10 以降にのみ適用される */
@mixin IE{
@media all and (-ms-high-contrast: none) {
@content;
}
}
/* Safariのみ適用される */
@mixin Safari{
@media screen and (-webkit-min-device-pixel-ratio:0) {
@content;
}
}
使い方はメディアクエリのときと同様、ハックしたい部分で@include
で呼び出せばおk。
SassとScssの違い
最後にSassとScssの違いを。
さっきの、
.container{
display:flex;
margin:0 auto;
width:80%;
&__inner{
background:#F5CE3F;
margin:10px;
padding:0 20px;
border-radius:10px;
}
&__title{
font-size:26px;
font-weight:bold;
}
&__text{
font-size:14px;
}
}
これは、Sassで書くと
.container
display: flex
margin: 0 auto
width: 80%
&__inner
background: #F5CE3F
margin: 10px
padding: 0 20px
border-radius: 10px
&__title
font-size: 26px
font-weight: bold
&__text
font-size: 14px
こうなる。
インデントで入れ子を全部管理しているような感じなので、インデントをずらすとバクッと表示崩れが起きる感じ。
シンプルな記述を好む人はこっちの方が使いやすいのかな?とか思うんだが、
私は{}
に慣れ親しんでしまってるので、断然Scssが好きだなぁ。
最後に
ちょっとでもScssの便利さが伝わって、「使えそう」とか「使ってみたい」とか思ってもらえたら嬉しいぞ!
じゃあの〜〜〜〜〜〜
すごくわかりやすくまとまっていて、Scss使ったことがなかったのでめちゃくちゃ勉強になります!
@Mitsuzara ありがとうございます〜〜〜!そう言っていただけてとても嬉しいです!!!