シリーズ ゼロからWebサイトを作ろう! 第9回 / 全10回

公開前の最終チェック ―
アクセシビリティとパフォーマンス

見た目が整い、SEOも設定できた。あとは「公開」のボタンを押すだけ――の前に、もうひと呼吸。すべての人にちゃんと届くサイトか、軽快に動くサイトか。今回はcafé SOELを"公開できる品質"に仕上げる、最後の最終チェックです。

前回のおさらい

📖 前回のおさらい
  • <meta name="description"> で検索結果の説明文を設定した
  • OGPタグを追加して、SNSでシェアされたときのカード表示を整えた
  • JSON-LD構造化データで、検索エンジンに「これはカフェです」と機械可読な形式で伝えた

前回は、人の目には見えない「サイトの履歴書」を整える回でした。検索エンジンやSNSに向けて、café SOELが何のサイトかを正しく伝えられるようになったはずです。

そして今回。ここまで積み上げてきたものを、最後にもう一度"全体の品質"という視点から見直します。誰にとっても使いやすいか、表示は軽快か、HTMLに壊れたところはないか。公開前の最終点検です。

今回のゴール

🎯 今回のゴール
  • aria属性とalt属性を見直し、スクリーンリーダーなど支援技術にも正しく情報が届く状態にする
  • loading="lazy" を追加して、画像の読み込みを効率化する
  • W3C のバリデーターと Lighthouse でサイトの品質をチェックする
  • JPG画像をWebPに変換して、ページを軽くする
👀 この回の完成イメージ
今回が実質的な"完成回"です。第9回の内容を反映したスナップショットは、完成形デモと同じ状態になります。先に仕上がりを確認したい方はこちらをどうぞ。
第9回の完成イメージを見る →

アクセシビリティとは — "すべての人"に届けるための設計

アクセシビリティ(Accessibility、略してa11y)は、直訳すると「到達しやすさ」。Webの文脈では、年齢、視覚、聴覚、運動機能、使っているデバイスや環境にかかわらず、誰もが情報にアクセスできる状態を指します。

たとえば、目の不自由な方はスクリーンリーダーという読み上げソフトでWebを利用します。画像のalt属性がなければ、そこに何が写っているかは誰にも伝わりません。マウスが使えない方はキーボードだけで操作します。<button> ではなく <div> でボタン風に作られていたら、フォーカスも当たらず、押すこともできません。

アクセシビリティ対応は「特別な人のための特別な対策」ではありません。晴れた日に外でスマホを見ている人、片手が塞がっている親御さん、通信環境の悪い場所にいる旅行者――状況によって、誰もが一時的に"何かが不自由な人"になります。アクセシブルなサイトは、結局のところ全員にとって使いやすいサイトなのです。

アクセシビリティは思いやりの技術。書くのは小さな属性ひとつでも、受け取る人にとっては大きな差になります。

そして嬉しいことに、私たちはすでに基礎の大半を終えています。第2回でセマンティックHTMLを意識し、第3回でaltを書いた。<button><a> を使い分け、見出し階層も守ってきた。今回やるのは、そこに少しだけ仕上げを加える作業です。

alt属性を見直す — "何が写っているか"ではなく"何を伝えているか"

まずは既存のalt属性を見直します。第3回ですべての画像にaltを入れましたが、あのときは「画像の内容をなんとなく説明する」段階でした。ここで一歩進めましょう。

altの書き方には、大事な原則があります。それは 「画像が持っている"役割"に合わせて書く」 ということ。同じ写真でも、文脈が違えばaltも変わるんです。

❌ やりがちなNG例
<img src="img/hero.jpg" alt="画像">
<img src="img/menu-coffee.jpg" alt="コーヒー.jpg">
<img src="img/logo.png" alt="ロゴ">
✅ 文脈に寄り添う書き方
<!-- ヒーロー画像:サイトの世界観を伝える役割 -->
<img src="img/hero.jpg"
     alt="大きな窓から自然光が差し込むcafé SOELの店内。木のテーブルと観葉植物が並ぶ開放的な空間">

<!-- メニュー画像:商品名とセットなので、写真が何かを補足する役割 -->
<img src="img/menu-coffee.jpg"
     alt="陶器のカップに注がれたハンドドリップコーヒー">

<!-- ロゴ画像:お店の名前を表す役割なので、店名そのものをaltに -->
<img src="img/logo.png" alt="café SOEL">

ポイントは、altを読み上げたときに意味が通じるかを想像してみること。目を閉じて、altだけを耳で聞くと想像してみてください。「画像」「ロゴ」では何も伝わらない。でも「café SOEL」なら、ロゴだとわかる。

💡 KANONのワンポイント
装飾のための画像(意味を持たない背景パターンなど)は、思い切って alt=""空にするのが正解です。スクリーンリーダーは空altの画像をスキップしてくれます。「altは何か書かなきゃ」と無理やり埋めると、かえって邪魔になることも。altは"読み上げるに値する情報があるか"で判断してください。

café SOELのサイトでは、第3回で書いたaltがすでに丁寧な内容になっています。今回はよりリアルな情景が伝わるように、具体性を少しだけ足す程度の調整で十分です。

ARIA属性でハンバーガーボタンに"意味"を添える

第6回で追加したハンバーガーメニューのボタン。見た目は3本線ですが、スクリーンリーダーにとっては「ただのボタン」です。何をするボタンなのか、今開いているのか閉じているのかが伝わりません。

ここで登場するのが ARIA属性。ARIA は Accessible Rich Internet Applications の略で、HTMLだけでは表現しきれない"状態"や"役割"を支援技術に伝えるための属性群です。

今回使うのは、基本中の基本の2つだけ。

1

aria-label — ボタンの名前を伝える

ハンバーガーボタンの中身は <span> の線だけで、テキストがありません。このままだとスクリーンリーダーは「ボタン」としか読み上げない。aria-label="メニューを開く" を付ければ、「メニューを開く、ボタン」と読み上げてくれます。

2

aria-expanded — "今、開いているか"を伝える

メニューが開いているのか閉じているのか。目で見ればすぐわかることも、支援技術には aria-expanded="true" / "false" で明示する必要があります。実際の切り替えは番外編EX2のJavaScriptで行いますが、今回は初期値として "false" を設定しておきます。

index.html — <button class="menu-toggle"> を更新
<button class="menu-toggle" type="button"
        aria-label="メニューを開く"
        aria-expanded="false"
        aria-controls="primary-nav">
  <span class="menu-toggle-bar"></span>
  <span class="menu-toggle-bar"></span>
  <span class="menu-toggle-bar"></span>
</button>

おまけで aria-controls="primary-nav" も添えました。「このボタンは id="primary-nav" の要素を操作するよ」という紐付けです。対応するナビ側にも id を足しておきましょう。

index.html — <nav> に id を追加
<nav class="nav" id="primary-nav" aria-label="メインナビゲーション">
  <ul class="nav-list">
    <!-- 以下は変更なし -->
  </ul>
</nav>
📌 覚えておこう
ARIAは「HTMLだけでは足りないときの補助」として使うのが正解です。<button> を使えばいい場面で <div role="button"aria-... と書くのは本末転倒。"最初に正しいHTMLを選ぶ。そのうえで足りないところにARIAを添える" — この順序だけ守ってください。

loading="lazy" — 画像の読み込みを賢くする

次は、目に見えないけれど体感速度に効くチューニングです。

ブラウザは標準では、ページを開いた瞬間にすべての画像を一気に読み込もうとします。でも、café SOELのサイトはそこそこ長いページ。フッターのそばにある画像まで最初から読み込むのは、ちょっともったいない。

そこで使うのが loading="lazy" 属性。「この画像は、ユーザーが近づいてきてから読み込めばいいよ」とブラウザに伝える、たったひとつの属性です。

img要素に loading="lazy" を追加
<img src="img/menu-coffee.jpg"
     alt="陶器のカップに注がれたハンドドリップコーヒー"
     width="800" height="800"
     loading="lazy">

ここにひとつ、大事なルールがあります。ヒーロー画像には loading="lazy" を付けないということ。

ヒーロー画像はページを開いた瞬間に画面に映る、いわば"第一印象"。この画像だけは最優先で読み込んでほしいので、lazyの対象から外します。ファーストビューに入るか入らないか — これが判断の基準です。

café SOELの場合、lazyを付けるのは以下の画像です:

  • img/concept.jpg(コンセプトセクション)
  • img/menu-coffee.jpgmenu-latte.jpgmenu-cake.jpgmenu-sandwich.jpg(メニュー4枚)
  • img/interior-01.jpginterior-02.jpg(ギャラリー)
  • img/exterior.jpg(ギャラリー・アクセスで2回使用)

img/hero.jpg と、ヘッダー/フッターのロゴ img/logo.png には付けません。ロゴはファーストビューに入っているうえ軽量なので、普通に読み込ませればOKです。

💡 KANONのワンポイント
loading="lazy" は主要ブラウザで広くサポートされている、ブラウザネイティブの機能です。むかしはJavaScriptのライブラリを入れて実現していたんですが、今はこの属性ひとつで済む。便利になりました。昔話ついでに言うと、widthheight をHTMLに書いておくのもパフォーマンス的に大事です。ブラウザが画像の比率を先に知れるので、読み込み中にレイアウトがガタッとずれるのを防げます。café SOELのサイトはすでに全ての画像にwidth/heightを書いてあるので、その点はバッチリです。

HTMLバリデーション — 壊れたコードは書いていないか

ここまで書いたHTMLに、うっかりタグの閉じ忘れや属性の書き間違いがあるかもしれません。人間の目でチェックするには限界がある。そんなときに頼るのが、W3Cが運営している無料のバリデーターです。

1

W3C Markup Validation Service にアクセス

https://validator.w3.org/ を開きます。

2

HTMLを直接貼り付けてチェック

「Validate by Direct Input」タブを選び、index.html の中身を丸ごと貼り付けて Check を押します。サイトをまだ公開していない段階なら、この方法がいちばん手軽です。

3

エラーと警告を確認する

赤いエラー(Error)はできる限りゼロにします。黄色い警告(Warning)は、ケースバイケース。「無視してもいい警告」と「直すべき警告」があるので、メッセージをよく読んで判断してください。

⚠️ よくあるミス
バリデーションで出やすいエラーの代表例:
・タグの閉じ忘れ(</div> が足りない)
・属性値のクォート忘れ(class=hero ではなく class="hero"
・同じ id がページ内に複数ある
<ul> の直下に <li> 以外の要素がある
どれもサイトが"なんとなく動いてしまう"ので気づきにくいんですが、きちんと潰しておきましょう。

Lighthouseで"サイトの健康診断"を受ける

続いて、Google Chromeに標準搭載されているLighthouseというツールを使います。ページを自動で解析して、「パフォーマンス」「アクセシビリティ」「ベストプラクティス」「SEO」の4つの観点で100点満点のスコアを出してくれる、まさに健康診断のようなツールです。

1

デベロッパーツールを開く

Chromeで index.html を開いた状態で、右クリック →「検証」。または F12(Macは Cmd + Option + I)。

2

Lighthouseタブを選択

上部のタブから Lighthouse を選びます。「Mobile」か「Desktop」を選び、「Analyze page load」をクリック。しばらく待つと4つのスコアが表示されます。

3

スコアと指摘を読む

スコアの下には、具体的な改善提案が並んでいます。「alt属性のない画像があります」「画像のサイズが大きすぎます」など、具体的に教えてくれるので、ひとつずつ対応していきます。

▶ Live Demo — Lighthouseのスコアイメージ
72
PERFORMANCE
96
ACCESSIBILITY
100
BEST PRACTICES
100
SEO

実際に計測すると、こんな感じのスコアが出るはずです。アクセシビリティ、ベストプラクティス、SEOはほぼ満点。ただしパフォーマンス(ページの表示速度)はこの時点だとオレンジ寄り。理由はシンプルで、画像ファイルが大きすぎるからです。

ここで、次の仕上げに進みます。

JPGをWebPに変換して、ページを軽くする

第1回で配布した画像素材は、あえてJPG形式のままにしてありました。ここで「軽くする」体験を一度、自分の手でするためです。

ここで使うのが WebP(ウェッピー) という画像形式。Googleが開発したWeb向けの画像形式で、JPGと同じ見た目の品質を保ちながら、ファイルサイズを2〜4割ほど小さくできます。

仕組みは少し専門的ですが、ざっくり言えば「JPGより新しく、より賢い圧縮アルゴリズムを使っている」。主要ブラウザはすべてWebPに対応しているので、実務でもほぼデフォルトの選択肢になっています。

▶ Live Demo — ファイルサイズの比較イメージ
JPG
480 KB
WebP
168 KB

同じ画像をWebPに変換するだけで、これくらい軽くなります。画像10枚あれば、ページ全体で数MBの差。モバイル回線で見る読者にとっては、体感速度がまるで違います。

変換の手順

1

Squooshにアクセスする

Googleが公開している無料の画像最適化ツール Squoosh を使います。インストール不要、ブラウザだけで完結します。

2

JPGをドラッグ&ドロップ

hero.jpg をSquooshの画面にドロップ。右側のパネルで出力形式を WebP に選び、画質(Quality)を75〜80あたりに設定します。

3

変換してダウンロード

右下に「元のサイズ → 変換後のサイズ」が表示されます。何%軽くなったか確認したら、ダウンロードボタンで hero.webp を保存。同じ手順で全部の写真(.jpg ファイル)をWebPに変換します。ロゴ(.png)とファビコン(.svg)はそのままでOKです。

4

img/フォルダに配置して src を差し替え

変換した .webp ファイルを img/ フォルダに入れ、index.html のすべての src="img/xxx.jpg"src="img/xxx.webp" に書き換えます。

index.html — 画像パスの書き換え例
<!-- ↓ 変更前 -->
<img src="img/hero.jpg" alt="..." width="1920" height="1080">

<!-- ↓ 変更後 -->
<img src="img/hero.webp" alt="..." width="1920" height="1080">

OGP画像(img/ogp.jpg)は、WebPに変換しない方が安全です。SNSの中にはまだWebPを確実にサポートしていないものもあるので、OGPはJPGのままにしておきましょう。

🔰 初心者向け補足
「元のJPGは消していいの?」と不安になる方へ。消さずに img/ フォルダに残しておいて大丈夫です。今後、WebPに対応していない古いブラウザ向けに <picture> 要素でフォールバックさせたくなったときにも使えます。ただ現時点では、src.webp に差し替えるだけで、主要ブラウザでは十分正しく表示されます。

書き換えが終わったら、もう一度Lighthouseを走らせてみてください。さっきオレンジだったパフォーマンスのスコアが、ぐっと緑に近づいているはずです。数字が動くのは、素直に気持ちいいですよ。

最終チェックリスト

公開前に、ここまでの作業をもう一度確認しましょう。

✅ 公開前チェックリスト
  • すべての <img> に意味の通るalt属性が入っている
  • 装飾用の画像には alt="" が指定されている(該当があれば)
  • ハンバーガーボタンに aria-labelaria-expanded が付いている
  • ヒーロー以外の画像に loading="lazy" が付いている
  • 画像がWebPに変換され、src も書き換わっている
  • W3Cバリデーターでエラーが出ない
  • Lighthouseの4つのスコアがすべて80以上(理想は90以上)
  • ブラウザの幅を縮めても、モバイル・タブレット・PCで見た目が崩れない
  • キーボードのTabキーだけで全てのリンクとボタンにフォーカスできる

全部チェックが付いたら、café SOELのWebサイトは"公開できる品質"に到達したということです。

ここまでの完成形を確認しよう

保存してブラウザをリロードしてみてください。見た目は第8回とほとんど同じ。でもサイトの"中身"は、スクリーンリーダーにも、検索エンジンにも、モバイル回線の読者にも、ちゃんと届くものになっています。

👀 第9回の完成イメージ
第9回のスナップショットは、シリーズ最終形(完成形デモ)と同一です。並べて確認してみてください。
第9回の完成イメージを見る →
完成形デモを見る →

あなたの画面でも、同じように表示されていますか? Lighthouseのスコアも、手元で走らせて確認してみてくださいね。

ちなみにCSSは第7回から変わっていません。今回修正するのは index.html画像周りとボタンの属性のみ。変更箇所は少ないですが、サイトの品質は一段と上がっているはずです。

ゼロから作りはじめたサイトが、今、公開できる品質に到達しました。ここまで来たあなたは、もうWebサイトを"作れる人"です。

今回のまとめ

  • アクセシビリティは「特別な人のための対策」ではなく、すべての人にとっての使いやすさを高める設計思想
  • alt属性は"画像の役割"に合わせて書く。装飾画像には alt="" を使う
  • ハンバーガーボタンには aria-labelaria-expanded を付けて、スクリーンリーダーにも意味と状態を伝える
  • ファーストビュー外の画像に loading="lazy" を追加すると、初期表示が軽くなる
  • W3Cバリデーターでエラーを潰し、Lighthouseで4観点のスコアを健康診断する
  • JPGをWebPに変換するだけで、画像容量を2〜4割削減できる。SquooshならブラウザだけでOK
  • café SOELのサイトはここで"公開できる品質"に到達。次回はいよいよサーバーにアップして世界に公開する