どうも!かけちまるです!
いきなりですが、HTMLでWebサイトを制作するときにheaderのような全ページで共通な部分をどのようにしているでしょうか?
HTMLごとにheaderを書いていると変更があったときにページ数が多いほど変更箇所が多くなってきますよね。
なので、headerを共通化して変更があっても変更箇所を1か所にしましょう。
この記事では、
がわかります。
Ajax通信を利用して共通化する方法もあります。
少し難易度は上がりますが、保守性はこちらの方が高いのでおすすめです。
簡単に説明すると外部HTMLをJavaScriptのload()
メソッドで読み込むことで共通化します。
まずは、階層構造から説明します。
この記事では仮に次のような階層構造を想定して解説します。
階層構造コピーindex.html(共通ヘッダーを読み込むHTML) header.html(共通用のヘッダー) css/ -style.css -reset.css images/
JavaScriptはindex.html
に記述するとします。header.html
には各HTMLで読み込ませたい共通ヘッダーを記述します。
そして、index.html
に
header.html
を読み込む場所load()
メソッドを記述し、header.html
を読み込むこの2つを記述することで共通化することができます。
具体的なコードは次の通りです。
HTMLコピー<body> <div id="header"><!-- ここにheader.htmlが読み込まれる --></div> <script> $(function(){ $('#header').load('./header.html'); // #headerにheader.htmlを読み込む }); </script> </body>
load()
メソッドで指定したファイルが読み込まれない時はどうすればいいのでしょうか?
load()
メソッドはjQueryを読み込まないと動作しません。
なので、jQueryを読み込みましょう。
jQueryダウンロード:https://jquery.com/download/
jQuery CDN:https://releases.jquery.com/
load()メソッド
はローカル環境では動作しないので、サーバーに上げて確認しないといけないのです。
でも、ローカルでも動作を確認したいと思います。
そんな時はVisual Studio Codeの拡張機能である「Live Server」というのを使うと簡単にローカルサーバーを立ち上げることができます。
「Live Server」の使い方はこちらの記事で解説しています。
Visual Studio Code以外のテキストエディタを使っている方はローカルサーバを立ち上げる拡張機能がないか調べるか、MAMPやXAMPPを使うことで解決すると思います。
※筆者はVisual Studio Codeしか使ったことがないのでVisual Studio Code以外のテキストエディタのことはよくわからないのです。すみません…
headerやfooterが共通化できることは便利なのですが読み込むHTMLの階層が変わってしまうと画像やリンクのパスが切れてしまいます。
例えば、階層構造が次のような場合を想定します。
header.html
で相対パスである./image/header_logo.svg
で画像を読み込むとします。header.html
をindex.html
で読み込むと画像は正常に読み込まれますが、階層が違うabout.html
でheader.html
を読み込むと画像が表示されなくなってしまいます。
階層構造コピーindex.html(共通ヘッダーを読み込むHTML) header.html(共通用のヘッダー) about/ -about.html(共通ヘッダーを読み込むHTML) css/ -style.css -reset.css images/ -header_logo.svg
そんな状態を解決する方法をご紹介します。
header.html
の画像やリンクのパスをすべて絶対パスで指定することでheader.html
の読み込む先のHTMLの階層が変わってもリンク切れが防げるようになります。
この方法のメリットとしては、対応が簡単というものです。
デメリットもあります。
次の階層だった時の場合を考えます。
階層構造コピーindex.html(共通ヘッダーを読み込むHTML) header.html(共通用のヘッダー) about/ -about.html(共通ヘッダーを読み込むHTML) css/ -style.css -reset.css images/ -header_logo.svg
header.html
で./images/header_logo.svg
を読み込みたいとします。inde.html
では、./images/header_logo.svg
で画像が正常に読み込まれます。about.html
では、../images/header_logo.svg
で画像が正常に読み込まれます。
なので、次のJavaScriptでURLを取得し処理を分岐する事でリンク切れを防ぐことができます。
JavaScriptコピーlet path = location.pathname.split("/")[1]; switch(path){ case 'index.html': $('img').attr('href', './images/header_logo.svg'); break; case 'about': $('img').attr('href', '../images/header_logo.svg'); break; default: $('img').attr('href', './images/header_logo.svg'); }
URLを取得する方法の詳細はこちらの記事で解説しております。
サイトの各ページに記述する部分を共通化することで保守性がグンッと上がります。
全ページに変更しに行かなければいけなかったのが共通化することで1か所を修正するだけでよくなります。
headerやfooterだけでなくサイドバーやバナーなどにも使えそうなので活用していただければと思います。
Ajax通信を利用して共通化する方法もあります。
少し難易度は上がりますが、保守性はこちらの方が高いのでおすすめです。
おわり
フィードバックを送信
記事についてのフィードバックはTwitterかお問い合わせフォームから受け付けております。