勉強の為にシェアしました。
htmlでimportみたいなことってできるの?
例えば、あるサイトを作ろうとしたときに、phpやhtmlファイルを複数作ったとして、bodyのheaderとfooterは全ページ共通の場合、それぞれのファイルにそれをいちいち書くのは面倒だし、変更も一括でしたいですよね?
そういうときってどのような解決方法がありますか?
phpを使ってechoする方法も考えましたが、なんともスマートでない気がする…
そういうときってどのような解決方法がありますか?
phpを使ってechoする方法も考えましたが、なんともスマートでない気がする…
追記:たくさんのご回答ありがとうございます。一ヶ月前ほどにhtmlやcss,phpを学び始めたばかりで何ができて何ができないのか全然わからず、曖昧な質問の仕方になってしまいました、すみません。
html単体でも他の言語のように簡単にimportできるものかと思っていましたが、どうやら難しそうなので、phpのincludeで利用するのが一番自分の想定していた使い方に近かったのでベストアンサーとさせていただきます。
html単体でも他の言語のように簡単にimportできるものかと思っていましたが、どうやら難しそうなので、phpのincludeで利用するのが一番自分の想定していた使い方に近かったのでベストアンサーとさせていただきます。
+4
「HTML Importsってものがあったけど普及前に廃止されたので覚えなくていい」ってことを覚えておく。
もう使えない技術を半端に古い情報に騙されて使い出すのは初心者がやりがちな間違い。
https://developer.mozilla.org/ja/docs/Web/Web_Components/HTML_Imports
https://qiita.com/ka-miyata/items/63e41e4105d7aeb44d6c
2013の情報見ても全く役に立たない。
https://www.html5rocks.com/ja/tutorials/webcomponents/imports/
もう使えない技術を半端に古い情報に騙されて使い出すのは初心者がやりがちな間違い。
https://developer.mozilla.org/ja/docs/Web/Web_Components/HTML_Imports
https://qiita.com/ka-miyata/items/63e41e4105d7aeb44d6c
2013の情報見ても全く役に立たない。
https://www.html5rocks.com/ja/tutorials/webcomponents/imports/
htmlから別のhtmlを読み込むなんて簡単にできそうなことが実はできない。
一番簡単なのはPHP使う方法なので最初はこれでいい。
PHPでも単純なincludeからWordPressのテーマ、フレームワークと徐々に洗練されていくので自分のレベルに合わせて選ぶ。
PHPでも単純なincludeからWordPressのテーマ、フレームワークと徐々に洗練されていくので自分のレベルに合わせて選ぶ。
投稿
score 5223
+3
投稿
score 5201
-
>「bodyのheaderとfooterは全ページ共通の場合、それぞれのファイルにそれをいちいち書くのは面倒だ」
→なら可変部分だけechoすればviewは1ファイルで済むじゃない
が私の回答です。
スマートだと思ったんだけどなあ(コード量も) -
PHPが最もスマートだという私の主観。
-
JavaScriptでもできるんですね、jsに関してはほぼ知識がないので今回はPHPでひとまず実装することにしました。いずれ戻ってきてまた見てみます。
+2
コンテンツをパーツに分けて管理したい要件と読みました。
方法は色々ありますが、出力に静的なものを想定しているのであれば、静的サイトジェネレーターで作成するのがお手軽です。
投稿
score 18458
-
その要件であってます。
管理したいパーツは静的なものです。ツールのようなものに頼らずhtmlのみで実現できないのでしょうか?
今はphpで長い文字列としてheader部分をまとめて変数に入れておいて、それを各ファイルでechoする、という形で管理していますが… -
質問のままを回答すると、以下の2点
SSI
https://ja.wikipedia.org/wiki/Server_Side_Includes
Web Components の最近の仕様と開発手法
https://qiita.com/ka-miyata/items/63e41e4105d7aeb44d6c
ただし、薦めないです。
+2
PHPでもテンプレート的に組めばいいと思います。
全コントローラーから最後に読み込ませて可変部分だけ渡してそこだけechoすると良いです。
全コントローラーから最後に読み込ませて可変部分だけ渡してそこだけechoすると良いです。
雑な例(動作未確認)
tmp.php
tmp.php
<html>
<title>hoge[ページ<?=$title?>]</title>
<body>
<p><?=$hello?></p>
</body>
</html>
a.php
$title='a';
$hello='こんにちは';
require_once 'tmp.php';
b .php
$title='b';
$hello='ニーハオ';
require_once 'tmp.php';
テンプレートエンジン(Smarty,Twigなど)使えばもっとそれっぽく簡潔な記述でできます。
-
同じ構造のページの作成には変数を利用してテンプレート的にやるのが効果的そうですね、ありがとうございます。
-
frodo821さんの回答との違いをご理解の上でコメントいただいているのでしたら良いのですけど。
+1
以下のHTMLパーツ2つが、それぞれHTMLファイルとして/partsディレクトリ直下にあるとします。
<!-- /parts/header.html -->
<p>ここは、共通ヘッダーです。<a href="/parts/header.html">このhtmlファイル</a>を読み込んで表示しています</p>
<!-- /parts/footer.html -->
<p>ここは、共通フッターです。<a href="/parts/footer.html">このhtmlファイル</a>を読み込んで表示しています</p>
各ページにFilament GroupのScott JehlさんのHTMLインクルード手法を使って、以下のように取り込みます。
<!-- /index.html -->
<!DOCTYPE html>
<html lang="ja">
<head><title>テスト</title></head>
<body>
<iframe src="/parts/header.html" onload="this.before((this.contentDocument.body||this.contentDocument).children[0]);this.remove()"></iframe>
<p>ここは、ページ固有のコンテンツです。</p>
<iframe src="/parts/footer.html" onload="this.before((this.contentDocument.body||this.contentDocument).children[0]);this.remove()"></iframe>
</body>
</html>
ブラウザで表示させChromeデベロッパーツールのElementsタブなどで現在のDOM状態を確認すると、以下のようになっていると思います。
<!-- /index.html -->
<!DOCTYPE html>
<html lang="ja">
<head><title>テスト</title></head>
<body>
<p>ここは、共通ヘッダーです。<a href="/parts/header.html">このhtmlファイル</a>を読み込んで表示しています</p>
<p>ここは、ページ固有のコンテンツです。</p>
<p>ここは、共通フッターです。<a href="/parts/footer.html">このhtmlファイル</a>を読み込んで表示しています</p>
</body>
</html>
この手法だとJSがOFFになっていても通常のiframeにフォールバックします。
また共通部分の内容を変えただけで変更がないメインコンテンツ部分のブラウザ側キャッシュが無駄になることもありません。
その他メリット・デメリットについては上で挙げたリンク先の記事をご覧ください。
要件に合うようでしたらご検討ください。
投稿
score 507
0
質問者さんが使っているフレームワークは何ですか? 例えば、ASP.NET ならマスターページという機能があって、やりたいこと (複数ページで共通のヘッダーとフッターを使う) は容易に実現できます。質問者さんが使うフレームワークもしくは開発環境 (オーサリングソフト?) にそう言う機能がないか探してはいかがです?
投稿
ASP.NET総合1位
0
自分もあまり詳しくないのですが、
HTMLだけで完結したいのであれば、
<iframe>タグで似たようなことは可能かと思います。
(正しい使い方かどうかはわかりませんが)
HTMLだけで完結したいのであれば、
<iframe>タグで似たようなことは可能かと思います。
(正しい使い方かどうかはわかりませんが)
しかし、一般的にはサーバーサイド言語のフレームワーク(Laravelやexpressなど)、その他使っているツール(WordPressなど)の機能で実現するものだと思います。
各フレームワークやツールのドキュメントを読むと、大体そういう機能は載ってると思います。
各フレームワークやツールのドキュメントを読むと、大体そういう機能は載ってると思います。
その機能を主軸としてググりたいなら、「使ってる機能の名前」+「テンプレート」とググると見つかると思います。
「テンプレート」だけだと色んな意味や機能がヒットしてしまうので、このワードが最適解かどうかはわからないです。
もっと適切な探し方を思いつく方がいたら、コメントいただければ幸いです。
「テンプレート」だけだと色んな意味や機能がヒットしてしまうので、このワードが最適解かどうかはわからないです。
もっと適切な探し方を思いつく方がいたら、コメントいただければ幸いです。
投稿
score 685
0 件のコメント:
コメントを投稿