JavaScript

iframe要素(Youtubeなど)のレスポンシブ対応

レスポンシブWebデザインを導入したサイトにYoutube(iframe要素)を埋め込むと自動リサイズされず、スマホで閲覧した際に画面からはみ出ることがないでしょうか?(下記キャプチャ参照)
本エントリーでは、iframe要素をレスポンシブ対応にする方法をご紹介します。

対策前(iframe要素が画面サイズ以上)

対策後(画面に収まるよう自動リサイズ)

iframe要素のレスポンシブ対応デモ

当社サイトの下記ページをご覧ください。
画面サイズに応じてYoutube(iframe要素)を自動リサイズしています。
http://www.informarc.co.jp/business/future/

基本的な仕組み(ポイント)

iframe要素をdiv要素でラップ
<div class="iframeWrap">
<iframe width="320" height="180" src="http://www.youtube.com/embed/xxxxxx"></iframe>
</div>
iframe要素を絶対配置

important宣言は削除可能ですが、iframe要素にインラインスタイルでwidth&heightが指定されている場合の対策で追加しています。

div.iframeWrap {
position: relative;
width: 100%;
}
div.iframeWrap iframe {
position: absolute;
top: 0;
left: 0;
width: 100% !important;
height: 100% !important;
}
親(div)要素にpaddingを設定

iframe要素のオリジナルサイズ(横幅&高さ)からアスペクト比を算出してpadding設定します。
padding-topでもpadding-bottomでもどちらでもOKです。
HD動画(16:9)の場合は、100 / 16 * 9 = 56.25% となります。

<div class="iframeWrap" style="padding-top: 56.25%;">
<iframe width="320" height="180" src="http://www.youtube.com/embed/xxxxxx"></iframe>
</div>

JSで親(div)要素追加とアスペクト比算出を自動化

上記のように直接HTMLを書き換えることで対応可能ですが、煩わしいアスペクト比算出を自動化します。
実際の運用ではclass名をトリガーにして適用するなどした方が使いやすいですが、今回はシンプルに基本ロジックのみご紹介します。
※jQuery等ライブラリ非依存

(function( window, document, undefined ) {
addEvent( window, 'load', function() {
var iframe = new fitIframe( document.getElementById( 'targetId' ) );
}, false );

var fitIframe = function( iframeElem ) {
this.iframe = iframeElem;
this.width  = iframeElem.width  ? iframeElem.width  : this.getWidth();
this.height = iframeElem.height ? iframeElem.height : this.getHeight();
this.aspectRatio = this.height / this.width;
this.wrap();
};
fitIframe.prototype = {
wrap: function() {
var parent = this.iframe.parentNode,
clone = this.iframe.cloneNode( true ),
wrapDiv = this.iframe.ownerDocument.createElement( 'div' ),
paddingTop = Math.floor( this.aspectRatio * 100 * 100 ) / 100;

// add wrapDiv properties 
wrapDiv.className = 'iframeWrap';
wrapDiv.style.paddingTop = paddingTop + '%';

// has parent element 
if( parent ){
wrapDiv.appendChild( clone );
parent.replaceChild( wrapDiv, this.iframe );

} else {
wrapDiv.appendChild( this.iframe );
}
},
getWidth: function() {
return this.iframe.offsetWidth;
},
getHeight: function() {
return this.iframe.offsetHeight;
}
};

function addEvent( elem, EventType, fn, useCapture ) {
if ( elem.addEventListener ) {
elem.addEventListener( EventType, fn, useCapture );
}
else if ( elem.attachEvent ) {
elem.attachEvent( 'on' + EventType, fn );
}
}
})( this, this.document );

親要素をfloatさせたレイアウトにも対応

下記のように親要素をfloatさせたレイアウトでも動作します。
※親要素(横幅60%)の範囲内で拡大表示

<div>
<div style="float: left; width: 60%;">
<iframe width="320" height="180" src="http://www.youtube.com/embed/xxxxxx"></iframe>
</div>

<div style="float: right; width: 35%;">
<p>動画サマリー</p>
</div>
</div>

今後の予定

  • 簡単に扱えるようプラグイン化(クラス名をトリガーにして適用など)
  • PCなど大画面環境下で、横幅50%表示等のオプションを追加(最大サイズを制限したい場合の利用を想定)
  • 対応サービスの充実・動作確認(現状はYoutubeとjsdo.itにて出力される埋め込みタグで動作確認)

HTML5を導入した制作の依頼・ご質問など、お気軽にお問合せください

※(株)インフォマークのお問合せフォームへ移動します。