フロントエンドエンジニア養成所

ブラウザ間のCSSの差異を無くす

ウェブサイトを閲覧するブラウザ(Google Chrome、Safari、Microsoft Edge、FireFoxなど)は、 それぞれ固有のユーザーエージェントスタイルシート(UAスタイルシート)と呼ばれるスタイルシートを持っています。 そのため、HTMLにCSSが書かれていなくても、HTMLタグには各ユーザーエージェントスタイルシートのデフォルトのスタイルが適用されます。 つまり、htmlファイルを開くと最低限のデザインが最初から適用されているということです。

例えば、見出しを表すhタグであれば、大見出しに当たるh1タグはデフォルトで最も大きな文字で表示されます。逆に見出しの中で最も小さいh6タグはhタグの中で最も小さい文字で表示されます。

index.htmlを以下のように修正し、実際の挙動を見てみましょう。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>サンプルサイト</title>
</head>
<body>
<!-- ここから -->
  <h1>サンプル</h1>
  <h2>サンプル</h2>
  <h3>サンプル</h3>
  <h4>サンプル</h4>
  <h5>サンプル</h5>
  <h6>サンプル</h6>
<!-- ここまで修正 -->
</body>
</html>

Alt text

CSSを書かなくてもある程度見た目を整えてくれるUAスタイルシートは便利です。

例えば先ほどの~タグは、見出しの重要度に応じて自動的に文字サイズが変わります。これは、タグの意味に合った便利なデフォルトスタイルです。

しかし、このUAスタイルシートはブラウザごとに内容が異なるため、次のような問題が起こります。

  • ブラウザごとに異なるUAスタイルシートがあるため、同じHTMLでも表示にズレが生じてしまう
  • 自分でコーディングしたCSSがUAスタイルシートにより、想定通りの挙動とならない場合、UAスタイルシートを都度打ち消さなければならない

これらの問題を解決するため、リセットcssとnormalize.cssといったCSS初期化スタイルが使われます。

リセットcssとは?

リセットcssはブラウザ間の差異をなくすため、各ブラウザのUAスタイルシートの一部を打ち消すCSSです。

normalize.cssとは?

normalize.cssもブラウザ間の差異をなくすためのCSSですが、リセットCSSとはアプローチが異なります。リセットCSSは各ブラウザのUAスタイルシートの一部を打ち消すアプローチですが、normalize.cssはUAスタイルシートを極力活かしつつ、ブラウザ間の差異のみを埋めるアプローチをとります。

実装について

作成するサイトでは、リセットcssを使用します。

またリセットcssは、Modern CSS Resetというリセットcssを使用します。

sample-siteフォルダの配下にcssフォルダを作成しましょう。

リセットcssはcssフォルダの配下に配置します。

sample-site
├── index.html
├── css
├──├── reset.css

このサイトに記載のコードをコピーし、reset.cssファイルに貼り付けます。

reset.css

/* Box sizing rules */
*,
*::before,
*::after {
  box-sizing: border-box;
}

/* Remove default margin */
body,
h1,
h2,
h3,
h4,
p,
figure,
blockquote,
dl,
dd {
  margin: 0;
}

/* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */
ul[role='list'],
ol[role='list'] {
  list-style: none;
}

/* Set core root defaults */
html:focus-within {
  scroll-behavior: smooth;
}

/* Set core body defaults */
body {
  min-height: 100vh;
  text-rendering: optimizeSpeed;
  line-height: 1.5;
}

/* A elements that don't have a class get default styles */
a:not([class]) {
  text-decoration-skip-ink: auto;
}

/* Make images easier to work with */
img,
picture {
  max-width: 100%;
  display: block;
}

/* Inherit fonts for inputs and buttons */
input,
button,
textarea,
select {
  font: inherit;
}

/* Remove all animations, transitions and smooth scroll for people that prefer not to see them */
@media (prefers-reduced-motion: reduce) {
  html:focus-within {
   scroll-behavior: auto;
  }
  
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

index.htmlでreset.cssを読み込みます。

index.html

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>サンプルサイト</title>
    <link rel="stylesheet" media="all" href="css/reset.css" /> <!-- この行を追加 -->
</head>
<body>
  <h1>サンプル</h1>
  <h2>サンプル</h2>
  <h3>サンプル</h3>
  <h4>サンプル</h4>
  <h5>サンプル</h5>
  <h6>サンプル</h6>
</body>
</html>

ブラウザで表示すると以下のように表示されます。

Alt text

見出しの重要度に応じた文字のサイズ感に変化はありませんが、行間が整い、意図しない余白が解消されています。

目立ちにくい差異が多いものの、reset.cssが適用されたことで確実に見栄えと保守性は向上しています。

実際の表示での違いは、触ってみるとその効果が実感できるはずです。

このサイトを運営している人

運営者の写真

はじめまして。このサイトを運営しているsidsydです。

エンジニアをしたり、日本酒サイト「酒道」を運営したりしております。

▶ 運営者情報ページへ