最近の実装に合わせたHTMLテンプレート、基本のコードとすべての要素の役割も解説
Post on:2021年4月27日
最近の実装に合わせた、Webページ用のHTMLテンプレートを紹介します。
レスポンシブ用のHTML、ソーシャルメディア用のHTMLをはじめ、高速表示に欠かせないrel="preload"なども含まれています。IEなどの古いブラウザはプログレッシブエンハンスメントで対応しています。
HTMLテンプレートはすべての要素の役割を各行ごとに解説しているので、自分に不必要なものを削除したり加えたりすることもできます。
My current HTML boilerplate
by Manuel Matuzović
下記は各ポイントを意訳したものです。
※当ブログでの翻訳記事は、元サイト様にライセンスを得て翻訳しています。
- はじめに
- HTMLのテンプレート(最終形)
- HTMLのテンプレートを1行ずつ解説
- ページのタイトルと説明文、外部ファイル
- ソーシャルメディア用のHTML
- アイコンとアドレスバー
- もう必要ないと思われるタグ、たまに必要になるタグ
はじめに
この記事では、HTMLドキュメントの基本構造に使用するすべての要素と、その理由を解説します。
通常、新しいプロジェクトを始めるときは、最後に実装したサイトのHTML構造をコピーしたり、HTML5 Boilerplate(翻訳版: HTMLの基本テンプレート)からHTMLをコピーしているかもしれません。私はこれから新しいプロジェクトを始めるわけではありませんが、職場で使用しているサイトの構造を文章化する必要がありました。そのため、単にコピペするだけでなく、HTMLドキュメントの基本構造すべてを理解しなければなりませんでした。構造の調査と組み立てにかなりの時間を費やしたので、それをこの記事で共有したいと思います。
HTMLのテンプレート(最終形)
下記のHTMLが、最終形です。
【訳者注】言語を日本語(ja, ja_JP)に変更しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<!DOCTYPE html> <html lang="ja" class="no-js"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width"> <title>ページのタイトル</title> <script type="module"> document.documentElement.classList.remove('no-js'); document.documentElement.classList.add('js'); </script> <link rel="stylesheet" href="/assets/css/styles.css"> <link rel="stylesheet" href="/assets/css/print.css" media="print"> <meta name="description" content="ページの説明文"> <meta property="og:title" content="ページのタイトル"> <meta property="og:description" content="ページの説明文"> <meta property="og:image" content="https://mywebsite.com/image.jpg"> <meta property="og:image:alt" content="画像の説明文"> <meta property="og:locale" content="ja_JP"> <meta property="og:type" content="website"> <meta name="twitter:card" content="summary_large_image"> <meta property="og:url" content="https://mywebsite.com/page"> <link rel="canonical" href="https://mywebsite.com/page"> <link rel="icon" href="/favicon.ico"> <link rel="icon" href="/favicon.svg" type="image/svg+xml"> <link rel="apple-touch-icon" href="/apple-touch-icon.png"> <link rel="manifest" href="/my.webmanifest"> <meta name="theme-color" content="#FF00FF"> </head> <body> <!-- コンテンツ --> <script src="/assets/js/xy-polyfill.js" nomodule></script> <script src="/assets/js/script.js" type="module"></script> </body> </html> |
HTMLのテンプレートを1行ずつ解説
HTMLのテンプレートを1行ずつ解説します。まずは、一般的なタグから。
1 |
<!DOCTYPE html> |
以前はDOCTYPE宣言にはいろいろな記述がありましたが、現在ではこれだけです。これが唯一無二です。他に選択肢がないにもかかわらず、互換性の理由から記述する必要があります。
参考: MDN
1 |
<html lang="ja" class="no-js"> |
lang属性はHTMLの中でも最も重要な属性の一つで、多くのことを担っています。詳細については、lang属性の使用についてやlang属性:ブラウザが嘘をつく、甘い小さな嘘をつくをご覧ください。
html要素に適用され、ページの自然言語を定義します。例えば、英語ならen、ドイツ語ならde、日本語ならjaのように言語を識別するためのタグ(BCP47)で定義された形式の「言語タグ」を1つ記述します。
参考: MDN
no-jsのクラスは、JavaScriptをサポートしていないブラウザで特定のコンポーネントにスタイルを適用する場合に備えたものです。このクラスはJavaScriptをサポートし実行するブラウザでは無視されます。
1 |
<meta charset="UTF-8"> |
charset属性は、ドキュメントの文字エンコードを宣言します。この属性を記述しないと、ブラウザによっては特定の文字が正しく表示されないことがあります。
例えば、Safariでcharset属性を記述せずに私の名前(Manuel Matuzović)を表示すると、正しく表示されません。
このHTMLはページタイトルの文字化けを避けるために、<title>より上に記述する必要があります。
1 |
<meta name="viewport" content="width=device-width, initial-scale=1"> |
metaタグにviewportを定義すると、レスポンシブWebデザインに必要なビューポートの幅を変更できます。width-device-widthは、ビューポートの幅をスクリーンの幅に設定します。initial-scaleは、ページが最初に読み込まれたときのズームレベルを制御します。
initial-scale=1は、iOS 9のSafariのみで必要であると読んだような気がしますが、その記事が見つかりませんでした。
viewportのmetaタグは、ドキュメントが適切にレンダリングされるように、そのドキュメントのできるだけ早い段階に記述する必要があります。
参考: HEAD
iOS 9.3以降、shrink-to-fit=noは不要になりました。
- Time to remove the shrink-to-fit=no band aid?
- Using the viewport meta tag to control layout on mobile browsers
ページのタイトルと説明文、外部ファイル
1 |
<title>ページのタイトル</title> |
ページのタイトルは、サイト内でそのページだけの唯一でユニークなものを使用します。ブラウザのタブ、検索エンジンの結果、ブックマークして保存したときなど、さまざまな場所に表示されます。
1 2 3 4 |
<script type="module"> document.documentElement.classList.remove('no-js'); document.documentElement.classList.add('js'); </script> |
JavaScript moduleは、プログレッシブエンハンスメントです、ブラウザがJavaScript moduleをサポートしているということは、modules, ES6の構文, fetchなど、モダンJavaScriptをサポートしていることになります。私はほとんどのJavaScriptをこれらのブラウザにのみ提供しており、JavaScriptがアクティブなときにコンポーネントのスタイルが異なる場合は、CSSでjsクラスを使用しています。
1 |
<link rel="stylesheet" href="/assets/css/styles.css"> |
サイトで共通に使用するCSSです。
参考: モダンブラウザに適したCSSリセットのまとめ
1 |
<link rel="stylesheet" href="/assets/css/print.css" media="print"> |
印刷用のCSSです。
参考: I totally forgot about print style sheets
1 |
<meta name="description" content="ページの説明文"> |
説明文もタイトルと同様に検索エンジンの結果などに表示されるため、ユニークなものにします。長さは自由ですが、検索エンジンでの表示は、155-160文字になります。
ソーシャルメディア用のHTML
FacebookやTwitterなど、ソーシャルメディア用のHTMLです。
1 |
<meta property="og:title" content="ページのタイトル"> |
titleと同様に、ページのユニークなタイトルを記述します。TwitterやFacebookなどのソーシャルメディアのURLスクレーパーによって使用されます。
1 |
<meta property="og:description" content="ページの説明文"> |
こちらも同様に、ユニークな説明文を記述します。TwitterやFacebookなどのソーシャルメディアのURLスクレーパーによって使用されます。
1 |
<meta property="og:image" content="image.jpg"> |
ソーシャルメディアやチャットアプリなど、URLが取得されて共有する際に表示される画像です。
理想的なのは重要なコンテンツが2:1の比率の長方形の中央に配置された正方形の画像です。これにより、長方形や正方形の画像を含むカードでも画像が美しく見えるようになります。
参考: Facebook, Twitter, Instagram, TikTokなど、各ソーシャルメディアで最適な画像・動画サイズのまとめ
1200pxの正方形の画像は、下記のように表示されます。
Twitterでの表示
WhatsAppでの表示
Twitterのルール:
カード画像は、アスペクト比2:1、最小300x157または最大4096x4096ピクセルに対応しています。画像のサイズは5MB以下であること。JPG、PNG、WEBP、GIF形式に対応しています。
参考: Twitter Developer Docs: Cards
1 |
<meta property="og:image:alt" content="画像の説明文"> |
画像の説明文を記述します。画像が純粋に装飾的で、意味のある情報を提供していない場合はこのmetaタグを使用しないでください。スクリーンリーダーはaltテキストを提供しない場合、画像を無視します。
1 |
<meta property="og:locale" content="ja_JP"> |
これはOpen Graphプロパティのオプションですが、記述が推奨されています。ページで使用する言語を定義します。
1 |
<meta property="og:type" content="website"> |
website, article, video.movieなど、コンテンツの種類を記述します。Open Graphページに必須のプロパティです。
参考: Object Types
1 |
<meta property="og:url" content="https://mywebsite.com/page"> |
ページの正規URLを記述します。OpenGraphページに必須のプロパティです。
参考: The Open Graph protocol
1 |
<meta name="twitter:card" content="summary_large_image"> |
このmetaタグは、Twitterで共有したときに画像のカードがどのように表示されるかを定義します。Webサイトには、summaryとsummary_large_imageの2つのオプションがあります。
参考: Twitter Summary Card with Large Image
summary_large_imageを定義した場合の表示
summaryを定義した場合の表示
画像が2つのオプションで見栄えがよいことを確認するために、正方形の画像を使用しています。summary_large_imageではカードの上下のピンクの部分が切り取られて表示されていることが分かります。
アイコンとアドレスバー
1 |
<meta name="theme-color" content="#FF00FF"> |
theme-colorは、ページやその周辺のユーザーインターフェースの表示をカスタマイズするためのCSSのカラーをブラウザに提供します。
サポートされているブラウザ: Chrome, BraveとSamsung Internet on Android
定義したカラーが適用されます。
1 |
<link rel="icon" href="/favicon.ico"> |
従来のブラウザ用の32×32pxのファビコンです。Webサイトのルートにファビコンファイル(favicon.ico)をアップロードします。
1 |
<link rel="icon" href="/favicon.svg" type="image/svg+xml"> |
最近のブラウザはほとんどがSVGファビコンに対応しています。favicon.svgの利点は、ラスター画像ではなくベクター画像なので、拡大縮小しても見栄えが良いことと、SVGにHTMLやCSSを追加できるので、ダークモードに対応できることです。
参考: SVGファビコンのカラーをダークモード時にCSSで変更できるの知ってた?
SVGファビコンのカラーをダークモード時に変更するには、.svgを編集します。
<svg>要素内に<style>を加え、fillプロパティでカラー値を定義します。ダークモード用のカラーは、メディアクエリでprefers-color-scheme: darkを使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <style> path { fill: #212121; <!-- ライトモード時のカラー --> } @media (prefers-color-scheme: dark) { path { fill: white; <!-- ダークモード時のカラー --> opacity: 0.5; } } </style> <path d="M24,13.2V10.8H20.191a10.6,10.6,0,0,0-.228-1.44A10.145,10.145,0,0,0,22.2,3H19.8a7.738,7.738,0,0,1-.939,3.706,6.873,6.873,0,0,0-2.9-2.516,4.121,4.121,0,0,0-7.926,0,6.892,6.892,0,0,0-2.9,2.516A7.748,7.748,0,0,1,4.2,3H1.8A10.145,10.145,0,0,0,4.037,9.36a10.6,10.6,0,0,0-.228,1.44H0v2.4H3.845a11.117,11.117,0,0,0,.279,1.326A10.156,10.156,0,0,0,1.8,21H4.2a7.732,7.732,0,0,1,.985-3.783C6.746,20.245,9.372,22.8,12,22.8s5.254-2.555,6.815-5.583A7.732,7.732,0,0,1,19.8,21h2.4a10.156,10.156,0,0,0-2.324-6.474,11.117,11.117,0,0,0,.279-1.326Zm-17.4-3a1.8,1.8,0,1,1,.527,1.273A1.8,1.8,0,0,1,6.6,10.2ZM12,18a2.4,2.4,0,1,1,1.7-.7A2.4,2.4,0,0,1,12,18Zm3.6-6a1.8,1.8,0,1,1,1.273-.527A1.8,1.8,0,0,1,15.6,12Z"/> </svg> |
これで、ライトモード時はブラックに、ダークモード時はホワイトになります。
1 |
<link rel="apple-touch-icon" href="/apple-touch-icon.png"> |
Appleデバイスのホーム画面に表示される180×180pxのアイコンです。
1 |
<link rel="manifest" href="/my.webmanifest"> |
Androidデバイスの場合、.webmanifestファイルが必要です。このファイルは、ホーム画面とPWAのスプラッシュ画面に必要なアイコンが配置されている情報をブラウザに提供します。
参考: How to Favicon in 2021: Six files that fit most needs
1 2 3 4 5 6 7 |
{ "name": "matuzo.at", "icons": [ { "src": "/icon-192.png", "type": "image/png", "sizes": "192x192" }, { "src": "/icon-512.png", "type": "image/png", "sizes": "512x512" } ] } |
1 |
<link rel="canonical" href="https://mywebsite.com/page"> |
linkタグのcanonicalを使用して、複数のURLで公開されているページのオリジナルソースを指定することで、コンテンツの重複によるSEOの問題を防ぐことができます。
1 |
<script src="/assets/js/xy-polyfill.js" nomodule></script> |
moduleをサポートしていないブラウザを対象としたJavaScriptを提供する場合は、nomodule属性を追加します。これにより、スクリプトは従来のブラウザ、つまりIE11でのみ実行されます。
1 |
<script src="/assers/js/script.js" type="module"></script> |
type="module"のJavaScriptは、moduleをサポートするブラウザでのみ実行されます。これは、nomodule属性の反対です。
もう必要ないと思われるタグ、たまに必要になるタグ
以下は、絶対に必要なものではありませんが、私が実装するほとんどのサイトに必要なものです。最後に、もう必要ないと思われるタグやたまに必要になるタグを追加しておきます。
何かを逃しているタグがあれば、Twitterまたはメールで教えてください。
もう必要ないと思われるタグ
1 |
<meta name="msapplication-TileColor" content="#efefef"> |
Andrey Sitnikによると、これは最近のバージョンのWindowsでは不要になりました。
1 |
<meta http-equiv="X-UA-Compatible" content="ie=edge"> |
IE11以降、ドキュメントモードは非推奨になり、一時的な場合を除いて使用できなくなりました。IE11からは、ドキュメントモードとしてedgeモードが推奨されています。edgeモードは、ブラウザが最新の標準規格を最大限にサポートしています。
参考: 推奨されていないドキュメント モードと Internet Explorer 11
1 |
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#36b1bf"> |
Safari 12以降、固定されたタブのアイコンを個別に変更する必要がなくなりました。
たまに必要になるタグ
1 |
<link rel="preload" href="font.woff2" as="font" type="font/woff2"> |
ページを読み込む際の早い段階で特定のリソースを確実に利用できるようにするには、preloadを使用します。
参考: サイトを高速化したらロード時間は1.6秒に、Lighthouseは100を獲得、その際に実施した手順を解説
参考: スマホ対応の優れもの!クリック・タップの直前にページを先読み、高速表示する超軽量スクリプト
- Preloading content with rel="preload"
- Preload, Prefetch And Priorities in Chrome
- Prefetching, preloading, prebrowsing
1 |
<link type="application/atom+xml" rel="alternate" href="/feed.xml" title="ページのタイトル"> |
サイトのRSS Feedを定義します。
1 |
<meta name="format-detection" content="telephone=no"> |
電話番号の自動検出とフォーマットを無効にします。
1 |
<meta name="twitter:dnt" content="on"> |
Twitterがパーソナライズの目的でサイトの情報を使用することを禁止します。
<head>要素とその子要素について詳しく知りたい場合は、下記をご覧ください。
sponsors