【CSS】デザインを良くするちょっとした資料集

# はじめに
こんにちは、GxPの杉山です。
こちらはグロースエクスパートナーズ Advent Calendar 2022の12日目の記事です。

普段はがっつりバックエンドを開発していますが、実はプログラミングの中でCSSに触っている時が一番楽しいと感じるCSS大好きエンジニアです。
今回はそんな私がきれいなデザインを作るのに効果的なおすすめのプロパティをご紹介します。
# mix-blend-mode: 色をブレンドできる
https://developer.mozilla.org/ja/docs/Web/CSS/mix-blend-mode

<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="OJEqrOW" data-editable="true" data-user="Xmagnum2" 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/Xmagnum2/pen/OJEqrOW">
  Untitled</a> by Xmagnum2 (<a href="https://codepen.io/Xmagnum2">@Xmagnum2</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

`mix-blend-mode`を設定すると、その要素の色が他の要素の影響を受けるようになります。
画像の上に文字を表示するときやjavascriptで動的に背景色を変えていくときに文字色が潜らないようにするときによく使います。

# backdrop-filter: ガラスの質感を表現できる
https://developer.mozilla.org/ja/docs/Web/CSS/backdrop-filter

<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="abKMMMK" data-editable="true" data-user="Xmagnum2" 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/Xmagnum2/pen/abKMMMK">
  backdrop-filter</a> by Xmagnum2 (<a href="https://codepen.io/Xmagnum2">@Xmagnum2</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

`backdrop-filter`を設定すると、擦りガラスのようなblurをかけることができます。
写真の上に少し透過させた白い要素をかぶせてそれに対して使用すると非常に効果的です！

# position: sticky;: 任意の要素内だけで位置を固定できる
https://developer.mozilla.org/ja/docs/Web/CSS/position

<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="eYKXoWK" data-editable="true" data-user="Xmagnum2" 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/Xmagnum2/pen/eYKXoWK">
  position: sticky;</a> by Xmagnum2 (<a href="https://codepen.io/Xmagnum2">@Xmagnum2</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

`position: sticky`を使用すると、任意の要素内だけで位置を固定し、その要素外では`position: relative`のような挙動になります。
いままではjavascriptでスクロール幅を取得し、それに応じてcssのpositionを操作するなどの複雑な制御を行う必要がありましたが、それをこの機能は設定するだけで可能にしてしまいます。

# all: unset;: スタイルの初期化ができる
https://developer.mozilla.org/ja/docs/Web/CSS/all

<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="LYraKzm" data-editable="true" data-user="Xmagnum2" 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/Xmagnum2/pen/LYraKzm">
  all: unset;</a> by Xmagnum2 (<a href="https://codepen.io/Xmagnum2">@Xmagnum2</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

CSSで高度なデザインを行おうとすると、デフォルトで設定されているプロパティが余計になってきます。
そうしたときは最初に`all: unset;`を設定することでButtonタグやaタグなどにもとから設定されているスタイルが初期化されます。
`all: inital;`というのもありますが、font-sizeなど全体で継承されるはずのものまで初期化されるため、継承する設定は残してくれるunsetがおすすめです！

# scroll-snap-type: スクロールにスナップを効かせる
https://developer.mozilla.org/ja/docs/Web/CSS/scroll-snap-type

<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="ExRJYjY" data-editable="true" data-user="Xmagnum2" 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/Xmagnum2/pen/ExRJYjY">
  scroll-snap-type</a> by Xmagnum2 (<a href="https://codepen.io/Xmagnum2">@Xmagnum2</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

`scroll-snap-type`を設定すると、その配下にある要素に対してのスクロールにスナップが効くようになります。
また、スナップ位置を調整するscroll-snap-alignや一要素ごとにスナップを強制するscroll-snap-stopなども併せて利用するとより柔軟なデザインを構築できます。
`scroll-snap-type`だけでなく、`scroll-snap-align`を子要素に設定しないと機能しないので注意してください。
PCで閲覧する場合には効果は薄いですが、モバイルでの操作でその真価を発揮するプロパティです！

# おわりに
一般的にCSSはBootstrapやMUI、VuetifyなどのCSSフレームワークにほとんどを任せて、拡張するというのが業務上の主流だと思います。
それはユーザーが使いやすいと思うものを作るためにはUI構成が非常に重要だからです。
フレームワークを使うと使いやすさという面で洗練されたUI構成になり、UIの良いサービスができます。

逆に、特設サイトやフライヤーなど、UIよりもデザインが重要度を上回るとき、フレームワークを使うことはあまりありません。
今回紹介したものはそれぞれが個性的で、フレームワークにはデザイン的に合わないことが多いですが、そうしたフルスクラッチで構築するデザインに活用することができるものです。
そしてCSSにはまだまだ変数や演算用の関数など多種多様な機能が用意されているので、この記事がデザインの引き出しを増やす糧になれば幸いです！！