Sassの@mixinと@functionの基本を押さえたい

こんにちは、新人フロントエンジニアとして働いている者です。
Sassで自作の**<span>@</span>mixin**や**<span>@</span>function**を作ったことがなく、そろそろ勉強しないとやばいなと思ったので、ここでアウトプットします。
##<span>@</span>mixinって何だ？
<span>@</span>mixinは**よく利用するCSSのスタイルを定義して、他の場所でも使いまわせるようにする機能**のことです。
`@mixin　名前`で定義して`@include　名前`で呼び出します。

```scss
@mixin hoge {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 200px;
  height: 100px;
  margin-top: 20px;
  background-color: #000;
  color: #fff;
 }

.example1 {
  @include hoge;
}

```
###引数が使える
mixinでは引数が使えるので、関数的な使い方も可能です。
引数の初期値も`$引数名: 初期値`の形で設定できます。

```scss
@mixin hoge($bgColor: #000, $fontColor: #fff) {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 200px;
  margin-top: 20px;
  background-color: $bgColor;
  color: $fontColor;
 }

.example1 {
  @include hoge();
}

.example2 {
  @include hoge(green, black);
}
```

###可変長引数も使える
<span>@</span>mixinでは**可変長引数**も使えます。
値に`,`が含まれる場合には可変長引数の出番です。

```scss
//可変長引数を使う
@mixin hoge($font-family...) {
  font-family: $font-family;
}

.exmaple-text {
  @include hoge(Arial, Helvetica, sans-serif);
}

```

`()`で囲んで値を渡すという方法もあります。

```scss
@mixin hoge($font-family) {
  font-family: $font-family;
}

.example-text {
  //()で囲んで値を渡す
  @include hoge((Arial, Helvetica, sans-serif))
}
```

###実践
`@content`と変数を組み合わせて、メディアクエリを管理してみます。

- **map-get**...`map-get(map名, key名)`の組み合わせで、mapの中からkeyに対応した値が取り出せる。
- **<span>@</span>content**...mixinにコンテントブロックを渡せる。
- **#{}**...通常エラーになってしまう処理を書ける。**#{}**に入れたものを素のCSSとして扱って欲しい時に使う。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="poWYxxQ" data-user="hanatsuyo" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/hanatsuyo/pen/poWYxxQ">
  mixin example3</a> by Tsuyoshi Takeuchi (<a href="https://codepen.io/hanatsuyo">@hanatsuyo</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
## <span>@</span>functionってなんだ
<span>@</span>functionはその名のとおり、**自作関数を作れる機能**です。
<span>@</span>mixinと比べると使用頻度は減るかもしれませんが、コーディングの幅が広がるので覚えておいて損はないです。
###引数が使え、<span>@</span>returnで結果を返す
関数なので当たり前ですが、<span>@</span>mixin同様に引数が使えます。
`@関数名($引数名1:初期値, $引数名2:初期値)`というフォーマットで利用でき、`@return`で結果を返します。 
以下の例ではdouble関数を作って、受け取った値を2倍にしてpxで返しています。

```scss
@function double($px: 50) {
  @return $px * 2px; 
}

.example1 {
  height: double(200);
  // => 400px
}

.example2 {
  height: double();
  // => 100px
}
```
###可変長引数も使える
<span>@</span>mixin同様に可変長引数が使えます。
使い方は<span>@</span>mixinと同じです。　

```scss
//渡された値の合計値をpxで返す関数
@function my-sum($values...) {
  $sum: 0;
  @each $x in $values {
    $sum: $sum + $x;
  }
  @return $sum * 1px;
}

.example {
  width: my-sum(20, 30, 40);
  height: 100px;
}
```

また同様に`()`で囲むことで`,`で区切られた値を渡せます。

```scss
@function my-sum($values) {
  $sum: 0;
  @each $x in $values {
    $sum: $sum + $x;
  }
  @return $sum * 1px;
}

.example {
  //()で囲んで渡す
  width: my-sum((20, 30, 40));
  height: 100px;
}
```

###実践
実践として親要素に合わせて横幅をパーセントで計算してくれる関数を作ってみましょう。
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="YzrgdYM" data-user="hanatsuyo" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/hanatsuyo/pen/YzrgdYM">
  function example2</a> by Tsuyoshi Takeuchi (<a href="https://codepen.io/hanatsuyo">@hanatsuyo</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
##最後に
ざっと<span>@</span>mixinと<span>@</span>functionについてまとめてみました。
コーディングでよく使うような処理を<span>@</span>mixinや<span>@</span>functionとしてまとめておくと、開発効率の上昇につながります。
よく使う<span>@</span>mixinと<span>@</span>functionのスニペットを公開している方がいたので参考にしてみてください！
[よく使うSassのmixinとfunctionのスニペットをまとめてみた](https://zenn.dev/tak_dcxi/articles/2cc1828e9c1fe2)

最後まで読んでいただきありがとうございました


##参考サイト
[@contentを使って、@mixinにスタイルセットを渡す](https://qiita.com/annaaida/items/a0794a6d38fc1327085a)
[Sassの基礎、@mixin（ミックスイン）の使い方](https://blanche-toile.com/web/sass-mixin)
[Sassの変数とmixinで変更に強いメディアクエリをつくる](https://www.tam-tam.co.jp/tipsnote/html_css/post10708.html)
[よく使うSassのmixinとfunctionのスニペットをまとめてみた](https://zenn.dev/tak_dcxi/articles/2cc1828e9c1fe2)
[自作関数を定義する @function](https://book.scss.jp/code/c4/05.html)
[Sassで@mixinを作る時に知っておきたい基礎知識](https://qiita.com/nekoneko-wanwan/items/c8498a21ae0e2b2198be)
[関数を定義する](https://maku77.github.io/sass/function.html)