Iframe

iframeの高さを取得し自動調整する

レスポンシブ Webデザインでは、iframeの高さが PCとスマホ・タブレットで結構変わってしまうことも多くて事前に高さを決め打ちで指定できません。

そこで、JavaScript(jQuery)を使って iframeの高さを自動的に設定してくれるスクリプトを探しました。

親ページと子ページのそれぞれで設定の必要な Tipsが多い中、 親ページの設定のみで動作するものを見つけて試したところ実に快適だったのでこのスクリプトを採用することにした。

HTMLで準備すること

高さを自動調整したい iframeの classに「autoHeight」を付けるだけです。

<iframe src="http://www.example.com/" class="autoHeight"></iframe>

iframeの高さを自動的に調整してくれるスクリプト

jQueryを読み込んだ状態で以下のスクリプトを実行します。

(function(window, $){
	$(window).on("load",function(){
		$('iframe.autoHeight').each(function(){
			var D = $(this).get(0).contentWindow.document;
			var innerHeight = Math.max(
				D.body.scrollHeight, D.documentElement.scrollHeight,
				D.body.offsetHeight, D.documentElement.offsetHeight,
				D.body.clientHeight, D.documentElement.clientHeight
				);
			$(this).removeAttr("height").css('height', innerHeight + 'px');
		});
	});
})(window, jQuery);

ページに配置された画像などの読み込みが完了した時点で iframeの高さを調整します。

同じページ内に複数の iframeがあっても、正常に高さを設定できます。

class="autoHeight" と書くだけで scrolling="no" frameborder="no" とかを書く必要なくとてもシンプルな優れものでした。

参考サイト

iframeに異なるドメイン(クロスドメイン)のコンテンツを読み込んで高さを自動調節する方法

wordpressでサイトを構築したときに掲示板をつけることになりました。 bbpressをはじめ何種類かのプラグインも試しましたが、不要な機能が多く使いづらいので、別サイトで簡易なcgi掲示板を構築してiframeで埋め込むことにしました。

wordpress側の負担を減らすためもあり、表示部がHTMLでサーバに負荷をかけず表示の軽い掲示板cgi(kent-webの SUN BOARD) を選びました。

表示幅を最大にしたり、スクロールバーを非表示にしたりというのは簡単にできたのですが、「高さを自動調整する」という課題に躓き、Googleで調べてTipsを見つけました。

iframe(親)に異なるドメインのページ(子)を読み込んで、親フレームにスクロールが出ないよう、iframeの高さを子ページの高さに自動調節する

親ページと子ページにそれぞれ下記をコピペするだけでうまく行きました。感謝!

wordpress (親) 側の設定

<html>
<head>
    <title></title>
    <script src="js/jquery.js"></script>
    <script>
        window.addEventListener('message', function(e) {
        var iframe = $("#fugapage");
        var eventName = e.data[0];
        var data = e.data[1];
        switch(eventName) {
            case 'setHeight':
                iframe.height(data);
                break;
            }
        }, false);
    </script>
</head>
<body>
    <iframe id="fugapage" src="http://fuga.com/" width="100%" height="auto" " frameborder="0" scrolling="no"></frame>
</body>
</html>

埋め込みたい別ドメインのページ (子)

fuga.com

<html>
    <head>
        <title></title>
        <script type="text/javascript">
        window.onload = function() {
            var height = document.getElementsByTagName("html")[0].scrollHeight;
            window.parent.postMessage(["setHeight", height], "*");
        }
        </script>
    </head>
    <body>
    ・・・
    </body>
</html>