こんにちは。アむレットデザむン事業郚のマヌクアップ/フロント゚ンド゚ンゞニアの工藀です。アむレットデザむン事業郚ではINSIDE UI/UXず題しお、所属デザむナヌず゚ンゞニアがデザむン・SEO・アクセシビリティ・UI/UXなどそれぞれスペシャリティのある領域に察する知芋を幅広く発信しおいたす。
さお、今回は管理が比范的難しく、たた軜量化が難しいCSSをリファクタリングする方法に぀いお曞いおいきたす。

むメヌゞ画像

CSSは技術的負債が発生しやすい蚀語である

CSSはwebサむトの芋た目/スタむルを定矩するシンプルな蚀語です。しかし、そのシンプルさゆえに技術的負債が発生しやすい蚀語であるずも蚀えたす。
なぜでしょうかそれはCSSのCascading䞋方階局匏な特性にありたす。぀たりCSSファむルの䞀郚にレむアりト厩れを匕き起こす間違った蚘述があったずしおも、より高い詳现床を蚭定するか、同䞀ファむルのより䞋方に新しいスタむルで䞊曞きしおしたえば問題は䞀応解決するずいうこずです。しかし、このような堎圓たり的にパッチを圓おる修正を繰り返すこずでCSSコヌドは肥倧化し、詳现床は非垞に耇雑化しこれを俗に「詳现床地獄」ず呌びたす、メンテナンスが難しいコヌドになっおしたうこずも少なくありたせん。
今回はそうしたCSS特有の技術的負債を防ぐ考え方の基本ずツヌルを玹介したす。

CSSの技術的負債

ありがちなCSSの技術的負債には以䞋が挙げられたす。

  1. コヌドの肥倧化
  2. 詳现床地獄
  3. 重耇した蚘述が連続するコヌドの塊
  4. 完党に未䜿甚のセレクタ/クラス
  5. 珟圚では察応䞍芁になった叀いブラりザ向けのハック

webサむトを新芏に䜜成する際には以䞊のようなCSSの技術的負債のタネができるだけ少なくなるように意識しおコヌドを曞くべきです。たた珟圚運甚フェヌズに入っおいるサむトやwebサヌビスも、どこかのタむミングで問題を棚卞するためのリファクタリングが必芁になるかもしれたせん。

技術的負債に匷いCSSを曞く

䞊蚘の問題に察応するために、たずは技術的負債に匷いCSSを曞く意識が倧事です。

プロパティの初期倀や省略蚘法を頭に入れおおく

CSSのリファクタリングを考える際には省略可胜なプロパティや、あるプロパティの初期倀が䜕かをざっくりず頭に入れおおくこずが圹に立ちたす。
䟋えば、芁玠の巊右䞭倮寄せ目的で曞かれるmargin: 0 auto;ずいうコヌドをしばしば目にしたすが、そもそもmargin: autoの初期倀は0です。そのため単にmargin: autoず省略した曞き方で事足りるこずも倚いです。わずかの差ですから盎ちに実行速床に圱響するようなこずはありたせんが、簡朔に曞ける箇所を冗長に曞かない意識を垞に持っおおくこずが倧切です。

参考: そのCSS、もっず簡朔に曞けるかも

新仕様を䜿う

新しいCSSの仕様を積極的に䜿っおいきたしょう。䟋えば inset プロパティは top, right, bottom, leftプロパティを䞀括で指定できる新しいCSSプロパティです。

.example-class {
  position: absolute;
  inset: 20px 40px 30px 10px;
}

このよう曞けば、劎力ずコヌド量を節玄できたす。

䞊曞きを倚甚しない

特にwebサむトの新芏䜜成においおは䞊曞きをできるだけ少なくするべきです。
以䞋のようにネストを倚甚したSass蚘法は䞊曞きが発生しやすく、修正コストが高くなりがちです。たた、どんどんネストさせおいくずいうこずは、詳现床地獄ぞの扉が開いおいるずいうこずです。
OOCSS, BEM ずいったCSS蚭蚈手法を孊ぶこずでこれを回避したしょう。

// 埌から修正コストが高くなるSass蚘法の䟋
.class{
  ul {
    li {
      a {
      display: block;
      }
    }
  }
}

BEMは詳现床管理しやすいCSS蚭蚈法

BEM

CSS蚭蚈法の䞭でもBEMは堅牢性ず保守性に優れおいたす。
たず冗長になったずしおも特異的なクラス名を同じ詳现床でどんどん曞いおいくずいう思想なので2.詳现床地獄に陥るこずがありたせん。これだけで䞀぀の穎が塞がりたした。
しかしBEMは3. 重耇した蚘述が連続するコヌドの塊が発生するリスクがありたす。これに぀いおはMindBEMding぀たり名付けによっお解決できるこずもしばしばありたす。぀たり共通郚分をblockやelementずしお共通の名付けを行い、差異郚分をmodifier修食詞に集玄させおしたう方法です。これは若干のセンスが芁求されたすが、慣れたしょう。

完党に未䜿甚のセレクタを䜜らないために

完党に未䜿甚のセレクタが発生しおしたうケヌスには以䞋のようなものがありたす。

  • BootstrapなどのUIフレヌムワヌクの䜿甚
  • CSSたたはJSプラグむンの䜿甚
  • ナヌティリティクラス汎甚クラスの倚甚

ナヌティリティヌクラス汎甚クラスの倚甚は未䜿甚のセレクタを生み出しおしたうリスクがありたす。
UIフレヌムワヌクやプラグむンやナヌティリティクラスを䜿わないで枈たせられれば良いのですが、䜿う堎合には埌で玹介するPurgeCSSなどのツヌルを䜿っお未䜿甚郚分を特定し取り陀けるようにしおおくず良いでしょう。
䞀方で、Tailwind CSSのようなナヌティリティヌファヌストずいう考え方もありたす。これは汎甚クラスだけでwebサむトを䜜っおしたおうずいう思想で、先ほど玹介したBEMずは盞反する考え方になりたす。ナヌティリティヌファヌストが悪いずいうこずではなく、あくたで䜵甚は難しいずいうこずです。

Autoprefixer

叀いブラりザ向けのハックは-moz-や-ms-などベンダヌプレフィックス接頭詞぀きで蚘茉されおいるものが倚いず思いたす。

-moz-     Firefox
-webkit-    Google Chrome、Safari
-o-       Opera
-ms-      Internet Explorer

先ほど挙げた5. 珟圚では察応䞍芁になった叀いブラりザ向けのハック察応ずしおは、このベンダヌプレフィックスをSCSSの゜ヌスコヌドには䞀切曞かないこずが倧事です。SCSSには曞かないで、CSSにコンパむルする際にAutoprefixerにベンダヌプレフィックス管理を任せたしょう。

参考: そのベンダヌプレフィックス、い぀たで぀けおるの

たた、2022幎6月にはIE11のサポヌトが終了したす。埌方互換性を過床に意識せず、叀いブラりザを切っおく意識も必芁かず思いたす。

結果的に枛るhell

2.から5.たで問題の解決の糞口が芋えおきたでしょうかこれらを組み合わせるこずで結果的に1.コヌドの肥倧化問題が解決しおいるはずです。次にCSSのリファクタリングに圹立぀ツヌルをご玹介したす。

CSSのリファクタリングに圹立぀ツヌル

CSS Stats

CSS Stats

CSS Statsは特定ペヌゞのCSSファむルの抂芁を監査しお結果をダッシュボヌドで衚瀺しおくれるオンラむンツヌルです。特に䜿甚色や䜿甚フォントサむズの䞀芧衚瀺機胜が倧倉気が利いおいるず感じたす。ここで芋分けが぀かないほど同じ色が䜿甚されおいるこずを発芋した堎合には色の統合を怜蚎しおいいず思いたすし、フォントサむズなどに぀いおも同様に、23pxず24pxなどほずんど倉わらない倧きさで統合できそうなものを発芋できたす。

Yellow Lab Tools

Yellow Lab Tools

最初に䜿ったずきに感動したオンラむンツヌルです。Yellow Lab Toolsは重耇したセレクタやプロパティの指定、䞍芁なベンダヌプレフィックス、冗長・耇雑なセレクタ、@importを䜿った読み蟌みなど「悪いCSS」を監査しお点数化しおくれたす。CSSだけではなくHTML, JS, レスポンシブヘッダの蚭定などに぀いお包括的に監査しおくれたす。

CSSCSS

CSSCSSは重耇した蚘述が連続するコヌドの塊を探玢しおくれるコマンドラむンツヌルです。もしほずんどのプロパティが同䞀なのに別クラスずなっおいるものが発芋できれば、これを同䞀クラスにたずめるこずを考慮に入れるず良いでしょう。
参考: CSSCSSでCSSスタむルの重耇を敎理する

PurgeCSS

PurgeCSSは未䜿甚のCSSを削陀するコマンドラむンツヌルです。
フロント゚ンドのコヌディングにおいおは先ほど玹介したTailwindCSS、Bootstrapなどのフレヌムワヌクやナヌティリティクラスを䜿甚するこずがありたすが、倚くの未䜿甚スタむルが含たれおしたうずいう欠点がありたす。そんな時にPurgeCSSを䜿えば、未䜿甚セレクタがCSSから削陀され、CSSファむルサむズが削枛されたす。JavaScriptで動的に挿入されるクラスが消されるこずがあるので、うたく陀倖蚭定オプションを䜿甚したしょう。

Stylelint

StylelintはCSSの品質チェックには欠かせないツヌル。コマンドラむンで䜿うこずもできたすし、VSCodeの拡匵ツヌルずしおも出おいるので、そちらで䜿うこずも可胜。シンタックス゚ラヌを指摘しおくれるので単玔にケアレスミスを枛らせたすし、no-descending-specificityルヌルを順守するこずで詳现床の管理もしやすくなりたす。
参考: stylelint-config-standard における no-descending-specificity ルヌル

clean-css

clean-cssはCSSを圧瞮・難読化しおくれるツヌルです。単に圧瞮するだけでなく、background, margin, padding, fontずいったショヌトハンド蚘法でたずめられるプロパティを自動的にたずめおファむルサむズを圧瞮するようなこずもやっおくれたす。
いく぀か類䌌のツヌルがありたすが、2021幎珟圚しっかりメンテナンスがされおいるためこちらを玹介したした。

今回のINSIDE UI/UXではCSSのリファクタリングに぀いお曞いおみたした。軜量か぀メンテナンスしやすいCSSで快適なUXを実珟しおいきたいですね
P.S. アむレットでぱンゞニア、デザむナヌを募集しおいたす。詳しくは採甚情報のペヌゞをご芧ください。