[改]画像一枚だけの別ドメインページをiframeで読み込みレスポンシブに対応:メモ

悩み
悩み

バッドノウハウかもシリーズ。以前に「画像一枚だけの別ドメインページをiframeで読み込みレスポンシブに対応:メモ」という記事を書きましたが、それの改良版です。

改良といっても、以前とは少し違う用途という感じですが。

構築環境
JavaScriptjQuery

前提と実現したいこと

前提は以下の通り。以前の記事とほぼ同じです。

  • iframeで画像が1枚だけあるページを読み込む
  • iframeをラッピングする要素がない
  • 画像のサイズは固定で1サイズでiframewidth属性が指定されている
  • 読み込むのは別ドメインのページ
  • IE8以下は切り捨て

実現しいたことは以下の通りです。

  • スマホサイズ用に基本サイズなしでレスポンシブ対応

以前の目的は、PCサイズの時点で統一した固定幅に縮小する必要があり、それをレスポンシブで伸縮させるようにしました。
今回は固定の幅はなく、最初からレスポンシブ対応のみです。

コード

構造は以下を想定しています。


<div class="contents">
 <p>テキスト</p>
 <iframe></iframe>
 <p>テキスト</p>
</div>

コンテンツの大枠として.contentsというdivがあり、その中にpタグなどの要素があります。ブログ記事の中にiframeがあるような状態です。

続いて、作成したコードです。


<script type="text/javascript">
jQuery(function($){
  //iframeをdiv.wrapでラッピング
  $('.contents iframe').wrap('<div class="wrap"></div>');
  function divide(num){
  //小数点第4位を切り捨て
      var  num1 = num * 10000;
      num1 =  Math.round(num1) / 10000;
      return num1;
    }
  $(window).on('load resize orientationchange', function(){
  //リサイズやロードの度に.wrapを探して処理
    $('.wrap').each(function(){
    //現在のiframeのwidth属性を取得
      var iframeWidth = $(this).find('iframe').attr('width');
    //現在のiframeのheight属性を取得
      var iframeHeight = $(this).find('iframe').attr('height');
    //コンテンツ部分の大枠の幅を取得
      var baseWidth = $('.contents').width();
      //枠のwidthと現在のサイズとの差を割合で算出し小数点4位で切り捨て
      var thisWidth = baseWidth / iframeWidth;
      var ratio = divide(thisWidth);
      //元のサイズよりも拡大しないように、倍率が1以上の時は1を設定
      if (ratio > 1){
        var ratio = 1;
      }
      //iframeのheightにwidthと同じ倍率をかけて高さを決定
      var setIframeHeight = iframeHeight * ratio;
      //レスポンシブでサイズを揃える
      $('iframe[width="' + iframeWidth + '"]').css({'transform':'scale('+ ratio +')','-webkit-transform':'scale('+ ratio +')','-moz-transform':'scale('+ ratio +')','-ms-transform':'scale('+ ratio +')+','transform-origin':'0 0'});
      //iframeをラッピングした要素に幅と高さを指定し、はみ出た部分を隠す
      $(this).css({'height': setIframeHeight +'px','width': baseWidth +'px','overflow':'hidden'});
    });
  });
});
</script>

今回はcssに追記が不要なようにjQueryで値をすべて設定しています。

結び

前回の試行錯誤があったため、多少はスムーズにいきました。が、やはりすんなりとはいかない部分もあったりで。

なお、上記のコードはiframeであればなんでもかんでも作用してしまいます。
実際に使う際には、必要なiframeを絞り込むためにiframesrc属性などを利用したり、前提からずれますがiframeは必ずなにかでラッピングしておくほうが誤動作がありません。

蛇足

「iframe レスポンシブ」などのワードで検索してでてくるサイトの中には、「コレですべてのiframeに対応!」のようなタイトルと内容の記事がありますが、個人的には記述に疑問のある所が散見されます。

具体的な手法としては、cssを用いてpaddingの%指定を活かし、縦横比を保持しつつ縮小するというタイプの内容です。

こういう記事に例示されているのはYouTubeばかりであり、YouTubeだからこそできているに過ぎないように思います。同種の仕組みを持つものでもなければ縮小されません。

基本的にiframeは呼び出し先からの要素の操作ができませんし、なによりimg要素ではないため横幅100%にしたところで、中身が拡大縮小するはずもなく…。
結果として単にはみ出た部分が隠れるという応急処置になります。

「cssで縦横比を保持する」にしても、YouTubeが16:9の比率であることが前提の方法であり、他の比率には対応できません。比率の数だけクラスと記述が必要になるはずです。

もちろん、YouTubeだけとはいえcssのコピペで対応できるのは素晴らしいことだと思いますが。

1人がこの記事を評価

役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。

連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。

コメント欄