リセットCSSとは?基本の役割と不要なCSSの排除について

リセットCSSは、ブラウザごとに異なる初期スタイルを統一するためのCSSです。ブラウザにはそれぞれ標準で独自の余白やフォントサイズ、リストの点などのスタイルが設定されています。これらをリセットすることで、どの環境でも同じ見た目を実現しやすくなります。

なぜ不要なCSSを除外するのか?

リセットCSSは全ページで必ず読み込まれるため、必要以上に多くのスタイルを含めるとCSSファイルが肥大化します。結果としてページの読み込み速度に影響が出たり、保守性が下がる可能性があります。
不要なCSSを除外し、必要最低限のリセットに絞ることでパフォーマンス向上とメンテナンスのしやすさを両立するリセットCSSの作り方を紹介します。

自作CSSを作るメリットとデメリット

メリット

  • 必要最低限のスタイルだけを設定できるため、CSSファイルのサイズが小さくなり、ページの読み込み速度が向上します。
  • サイトの設計やデザインに合わせて柔軟にカスタマイズができるため、独自のスタイルルールを反映しやすくなります。
  • 不要なスタイルを省くことで、後からの修正やメンテナンスが楽になり、コードの可読性も高まります。
  • 自作する過程でCSSの理解が深まり、より効率的なスタイル設計が可能になるという学習効果もあります。

デメリット

  • ブラウザごとの細かな差異やバグを完全にカバーするのは難しく、特定の環境で見た目が崩れるリスクがあります。
  • CSS初心者の場合、リセットが不十分だったり、逆に過剰にリセットしてしまうなどのミスが起こりやすいです。
  • Eric Meyer’s ResetやNormalize.cssなどの有名なリセットCSSと比べて、広く使われているわけではないため、十分なテストや検証が行われていない可能性があります。
  • 他の開発者と共有する際にトラブルが起きることもあるため、チーム開発では注意が必要です。

軽量なリセットCSSを作るためのポイントと工夫

  1. 本当に必要なスタイルだけリセットする
    全部リセットすると無駄が増えるので、サイトで使う要素を見極める。
  2. 全要素を無差別にリセットしない
    例:*セレクタで一括リセットするとパフォーマンス低下や意図しない影響が出ることも。
  3. box-sizing: border-boxの設定
    ボックスのサイズ計算を簡単にし、レイアウト崩れを防ぐ。

ブラウザごとのデフォルトスタイルの違いと最適化対策

ブラウザによって標準スタイルは異なり、例えばFirefoxはbuttonの余白が多い、Chromeはリンクの下線の扱いが違うなどがあります。自作リセットCSSでは代表的な差異に対応し、以下のような対策が有効です。

button, input, select, textarea {
  font-family: inherit;
  font-size: 100%;
  margin: 0;
}
a {
  text-decoration: none;
  color: inherit;
}

これでフォーム要素やリンクの見た目の違いをある程度統一できます。

軽量化を意識した自作リセットCSSの実践例と活用法

以下はフォームなどを利用しない一般的なブログサイトを例に自作したCSSです。不要なCSSを極力除外し、最低限必要なものだけを選定しました。ご利用になる場合は、下部のミニファイされたCSSをそのままcommon.cssなどに貼り付けて使用してください。

当サイトで自作したリセットCSSのコード


/*
 * 全要素に対する基本のリセット
 * marginとpaddingを0に設定し、box-sizingをborder-boxにすることで、
 * 要素の幅と高さの計算にpaddingとborderを含めるようにします。
 * これにより、レイアウトの計算が直感的になります。
 */
*, *::before, *::after {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

/*
 * HTML要素のテキストサイズ調整とカラースキームの設定
 * -webkit-text-size-adjust: 100%; は、モバイルブラウザでのテキストサイズ自動調整を無効にします。
 * color-scheme: dark light; は、ユーザーのOS設定に応じてブラウザのデフォルトUI(フォーム部品など)を
 * ダークモードまたはライトモードに適応させます。
 */
:where(html) {
  -webkit-text-size-adjust: 100%;
  color-scheme: dark light;
}

/*
 * 特定のHTML要素のスタイルリセット
 * ボーダー、フォント、背景をデフォルトからリセットし、親要素から継承させることで、
 * 一貫した見た目を実現し、後のスタイリングを容易にします。
 */
:where(div, span, a, p, img, ul, li, h1, h2, h3, section, article, nav, header, footer, main, table, tr, td, th, video, audio, iframe) {
  border: 0;
  font: inherit;
  background: transparent;
}

/*
 * リスト要素のリセット
 * ul(順序なしリスト)とli(リストアイテム)のデフォルトのリストスタイル(点や数字など)を削除します。
 */
:where(ul, li) {
  list-style: none;
}

/*
 * テーブル要素のリセット
 * border-collapse: collapse; は、テーブルのセル間のボーダーを結合します。
 * border-spacing: 0; は、セル間の間隔を削除します。
 */
:where(table) {
  border-collapse: collapse;
  border-spacing: 0;
}

/*
 * アンカー要素(リンク)のリセット
 * text-decoration: none; は、リンクの下線を削除します。
 * color: inherit; は、親要素から文字色を継承させます。
 * cursor: pointer; は、カーソルをポインターに変更し、クリック可能であることを示します。
 */
:where(a) {
  text-decoration: none;
  color: inherit;
  cursor: pointer;
}

/*
 * アンカー要素のホバー・フォーカス時のスタイル
 * リンクにカーソルが当たった時やフォーカスされた時に、透明度を下げて視覚的なフィードバックを提供します。
 */
:where(a:hover, a:focus) {
  opacity: 0.7;
}

/*
 * メディア要素のリセットとレスポンシブ対応
 * max-width: 100%; は、画像や動画などが親要素の幅を超えないようにします。
 * height: auto; は、アスペクト比を維持しながら高さを自動調整します。
 * display: block; は、これらの要素がインライン要素として扱われることで生じる、
 * 下部の余白(ベースラインとのずれ)を解消します。
 */
:where(img, video, audio, iframe) {
  max-width: 100%;
  height: auto;
  display: block;
}

/*
 * body要素の基本スタイル
 * line-height: 1.5; は、行の高さを設定し、テキストの可読性を高めます。
 * font-family は、ウェブサイトで使用するフォントを設定します。"Noto Sans JP"を優先し、
 * システムフォント、そして汎用的なサンセリフフォントへと続きます。
 * -webkit-font-smoothing: antialiased; は、WebKit系のブラウザでフォントのレンダリングを滑らかにします。
 */
:where(body) {
  line-height: 1.5;
  font-family: "Noto Sans JP", system-ui, sans-serif;
  -webkit-font-smoothing: antialiased;
}

ミニファイした自作リセットCSS(ご自由にカスタマイズして使用してください)

/* Source: https://bukiusagi.net/ */
*,*::before,*::after{margin:0;padding:0;box-sizing:border-box}:where(html){-webkit-text-size-adjust:none;color-scheme:dark light}:where(div,span,a,p,img,ul,li,h1,h2,h3,section,article,nav,header,footer,main,table,tr,td,th,video,audio,iframe){margin:0;padding:0;border:0;font:inherit;background:transparent}:where(ul,li){list-style:none}:where(table){border-collapse:collapse;border-spacing:0}:where(a){text-decoration:none;color:inherit;cursor:pointer}:where(a:hover,a:focus){opacity:.7}:where(img,video,audio,iframe){max-width:100%;height:auto;display:block}:where(body){line-height:1.5;font-family:"Noto Sans JP",system-ui,sans-serif;-webkit-font-smoothing:antialiased}

このように必要な要素だけをリセットし、基本のスタイルだけに絞るとファイルサイズも小さくなり読み込み速度が向上します。
活用法としては、プロジェクトごとに微調整しながら、自分にとって最適なリセットCSSを作り込むことが大切です。

CSSにおける:where()とは?

CSSの:where()疑似クラスは、複数のセレクターをグループ化し、詳細度(specificity)をゼロにできる非常に便利な機能です。これにより、CSSの保守性を高め、上書きの管理を容易にします。

なぜ:where()が便利なのか?

通常のCSSでは、セレクターの種類や数によって詳細度が決まります。たとえば、pよりdiv pの方が詳細度が高く、#idセレクターはクラスセレクターより詳細度が高いです。詳細度が高いスタイルは、低いスタイルよりも優先されて適用されます。

しかし、:where()を使うと、その中に記述されたどんなに複雑なセレクターであっても、詳細度が0として扱われます。これは、リセットCSSやユーティリティクラスを作成する際に非常に強力なメリットとなります。

リセットCSSの落とし穴と軽量化で注意すべきポイント

  • 過剰なリセットで意図しないデザイン崩れが起きることがある。
    例えば画像やフォーム要素のスタイルを全部リセットすると、元々の便利なブラウザ機能を失う可能性があります。
  • *セレクタを多用しすぎるとサイト全体のパフォーマンスが落ちることがある。
  • メンテナンス性の低下に注意。
    リセットCSSは全体に影響するため、軽量化を優先しすぎて必要なリセットが抜けるとブラウザ差異が再発生します。