iOS SafariでIFrameを応答可能にする方法は?


134

問題は、IFrameを使用してコンテンツをWebサイトに挿入する必要がある場合、最新のWebの世界では、IFrameも応答することが期待されていることです。理論的にはそれは単純です。単純にaiderを使用する<iframe width="100%"></iframe>かCSSの幅を設定しますiframe { width: 100%; }が、実際にはそれほど単純ではありませんが、そうすることはできます。

iframeコンテンツが完全にレスポンシブで、内部スクロールバーなしでサイズを変更できる場合、iOS Safariはiframe実際の問題なしにのサイズを変更します。

次のコードを考えた場合:

<html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=9,10,11" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Iframe Isolation Test</title>

    <style type="text/css" rel="stylesheet">

        #Main {
            padding: 10px;
        }
    </style>
</head>
<body>
    <h1>Iframe Isolation Test 13.17</h1>
    <div id="Main">
        <iframe height="950" width="100%" src="Content.html"></iframe>
    </div>
</body>
</html>

Content.html

<html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=9,10,11" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Iframe Isolation Test - Content</title>

    <style type="text/css" rel="stylesheet">

        #Main {
            width: 100%;
            background: #ccc;
        }

    </style>
</head>
<body>
    <div id="Main">
        <div id="ScrolledArea">
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc malesuada purus quis commodo convallis. Fusce consectetur mauris eget purus tristique blandit. Nam nec volutpat augue. Aliquam sit amet augue vitae orci fermentum tempor sit amet gravida augue. Pellentesque convallis velit eu malesuada malesuada. Aliquam erat volutpat. Nam sollicitudin nulla nec neque viverra, non suscipit purus tincidunt. Aenean blandit nisi felis, sit amet ornare mi vestibulum ac. Praesent ultrices varius arcu quis fringilla. In vitae dui consequat, rutrum sapien ut, aliquam metus. Proin sit amet porta velit, suscipit dignissim arcu. Cras bibendum tellus eu facilisis sodales. Vestibulum posuere, magna ut iaculis consequat, tortor erat vulputate diam, ut pharetra sapien massa ut magna. Donec massa purus, pharetra sed pellentesque nec, posuere ut velit. Nam venenatis feugiat odio quis tristique. 
        </div>      
    </div>
</body>
</html>

その後、これはiOS 7.1 Safariでは問題なく機能します。問題なく横向きと縦向きを切り替えることができます。

ここに画像の説明を入力してください ここに画像の説明を入力してください

ただし、これを追加してContent.html CSSを変更するだけです。

    #ScrolledArea {
        width: 100%;
        overflow: scroll;
        white-space: nowrap;
        background: #ff0000;
    }

あなたはこれを手に入れます:

ここに画像の説明を入力してください ここに画像の説明を入力してください

ご覧のとおり、Content.htmlコンテンツは完全に応答性があり(div#ScrolledAreaoverflow: scroll設定されています)、iframeの幅が100%であっても、オーバーフローが存在しないかのように、iframeはdiv#ScrolledAreaの幅全体を使用します。デモ

このような場合、iframeコンテンツにスクロール領域がありましたが、問題は、iframeiframeコンテンツに水平スクロール領域があるときにレスポンシブを取得する方法ですか?ここでの問題は、Content.htmlが応答しないという事実ではなく、iOS Safariが単にiframeのサイズを変更して、div#ScrolledAreaが完全に表示されるようにするという事実です。


リンクを教えてもらえますか?内のページにwhite-space: nowrapスタイルのあるコンテンツがある場合、iOSはiFrameをページ内の全幅に拡張すると言っていますか?
DA。

@DA問題と解決策の両方にデモを追加しました。いいえ、white-space: nowrapそれ自体は問題ではありません。私は単にそれを使って極端な幅にしていdiv#ScrolledAreaます。問題は、IFrameコンテンツに水平スクロール可能な領域がある場合に発生します。その場合、iOS Safariは単に幅の設定を無視して、穴のコンテンツを表示し、サイトの応答性を壊します。
Idra 2014

うーん...それが「機能」なのかしら。スクロール可能なコンテンツを含むスクロール可能な領域(iFrame)を用意するのは面倒です。タッチスクリーンでの操作は非常に困難です。
DA。

@DAもちろんこれは姪のケースであり、あなたが言ったことは真実である可能性があり(実装によって異なりますが、機能します)、ほとんどのサイトには水平方向にスクロール可能な領域がありませんが、そうすると...想像もできません私がこれに費やした時間。ただし、非表示にしてボタンなどでスクロールする画像がある場合でも、これは問題になる可能性があります。
Idra 2014

これに関連する質問があるようです:stackoverflow.com/questions/5267996/…これはモバイルサファリの「機能」のようです...ユーザーができるようにコンテンツのサイズが設定されていることを確認しようとしていますまだそれと対話します。スクロールするiframeにスクロールするコンテンツがあるとどうなるかわかりません... Safariはネストされたスクロール要素内のスワイプをどのように解釈しますか?
DA。

回答:


289

この問題の解決策は実際には非常に単純であり、それに対処するには2つの方法があります。Content.htmlを制御できる場合は、div#ScrolledAreaCSS の幅を次のように変更するだけです。

        width: 1px;
        min-width: 100%;
        *width: 100%;

基本的に、ここでの考え方は単純です。widthビューポート(この場合はiframeの幅)よりも小さい値に設定し、それを上書きして、デフォルトmin-width: 100%で実際にwidth: 100%どのiOS Safariが上書きするかを許可します。*width: 100%;コードはIE6は互換性を維持するだろうが、あなたはIE6のために気にしないならば、あなたはそれを省略することができるようにそこにあります。デモ

ここに画像の説明を入力してください ここに画像の説明を入力してください

ご覧のとおり、div#ScrolledArea幅は実際には100%であり、overflow: scroll;それを実行して、オーバーフローするコンテンツを非表示にすることができます。iframeコンテンツにアクセスできる場合は、これが推奨されます。

ただし、(何らかの理由で)iframeコンテンツにアクセスできない場合は、iframe自体で実際に同じ手法を使用できます。iframeで同じCSSを使用するだけです。

    iframe {
        width: 1px;
        min-width: 100%;
        *width: 100%;
    }

ただし、これには1つの制限があります。scrolling="no"これを機能させるには、iframeでスクロールバーをオフにする必要があります。

<iframe height="950" width="100%" scrolling="no" src="Content.html"></iframe>

スクロールバーが許可されている場合、これはiframeでは機能しなくなります。つまり、代わりにContent.htmlを変更すると、iframeでスクロールを維持できます。デモ


1
@NickGottliebが言及したように、iframeレスポンシブウェブデザインをiOS 7搭載のiPhone 4で準備する!importantためにwidth属性に追加する必要がありました
malisokan

@ЮнгвиртТони回避策が機能するために必要とされるべきではない、それがwidth以前に設定された!importantか、またはより高い優先度のCSSがそれを上書きした可能性があります。iPhone 4 iOS7の孤立したケースでは必要ありませんでした。
Idra

重要な必要もありませんでした。iOS 8でもうまく機能します。乾杯
サムポッツ2015年

scrolling = noが必要な場合のみ必要です。それ以外の場合はscrolling = yesです。では、何を検出する必要がありますか?これはiOSの問題ですか?またはウェブキットの問題?または...?
gerbz

@ggwarpigこれはiOSの問題で、iOS Safariがシームレス属性を自動的にオンにし、上書きすることはできません。コンテンツを制御している場合は、コンテンツを変更する必要があります。scrolling="yes"そうでない場合、これを修正する方法はありません。IFRAMEで必要な修正のみをIFRAMEで機能させるscrolling="no"には
Idra

24

問題のようですが、Mobile Safariは、iFrameに含まれるドキュメントが指定したものより広い場合、iFrameの幅に従うことを拒否します。例:

http://jsbin.com/hapituto/1

デスクトップブラウザでは、iFrameとDivの両方が300pxに設定されています。内容は幅が広いので、iFrameをスクロールできます。

ただし、モバイルサファリでは、iFrameがコンテンツの幅に合わせて自動拡張されます。

これは、ページ内のコンテンツのスクロールに関する長年の問題の回避策であると私は推測しています。過去には、タッチデバイスに大きなスクロールiframeがあった場合、ページ自体ではなくスクロールになるため、iframeで「スタック」していました。AppleはiFrameのデフォルトの動作を「スクロールなし」と決定し、それを防ぐために拡張しているようです。

1つのオプションはこの回避策です。iFrameがスクロールすると想定する代わりに、iframeをユーザーが制御できるDIVに配置し、スクロールさせます。

例:http : //jsbin.com/zakedaja/1

マークアップの例:

<div style="overflow: scroll; -webkit-overflow-scrolling: touch; width: 300px;">
   <iframe src="http://jsbin.com/roredora/1/" style="width: 600px;"></iframe>
</div>

モバイルサファリでは、完全に展開されたiFrameのコンテンツを、それを含むdivを介してスクロールできるようになりました。

キャッチ:これは、デスクトップブラウザーでは見苦しいように見えます。これは、2つのスクロールバーがあるためです。そのため、これを回避するには、JSを使用してブラウザの検出を行う必要がある場合があります。


1
ここで示した解決策は、iOS Safariでiframeの穴のスクロールを偽造する標準的な方法ですが、このiOSの問題を考慮すると、IFrameのスクロールに関する問題であるため、これは実際には問題の範囲外です。(コンテンツまたはそれ以外)次に、ここに配置すると便利です。
Idra 2014

1
私はあなたの質問を完全に理解していないと思います。私が理解しているところによると、あなたが抱えている問題は、iOSではMobile Safariが最初にiFrameがスクロールしないようにしようとし、それに幅を強制することです。私はあなたの問題を誤解していますか?
DA。

本質的にそれが問題であり、必要な解決策は異なります。最初の問題では、IFrameコンテンツは応答性がありましたが、コンテンツを水平方向にスクロールしているため、iframeスクロールをエミュレートする方法ではなく、iframeの幅を100%にして応答性を上げる方法が問題でした。そのiframe。このため、この場合は上記のアプローチが機能しません。これは、設計された応答性が壊れており、スクロールする必要があるためです。
Idra 2014

1
私は謝罪します、私はコメントの1つであなたを騙したことに気づきました。iframeがスクロールしない。それがポイントでした、iframeはそのコンテンツの一部のみdiv#ScrolledArea(つまり、私の例では(緑色))をスクロールすることを想定していませんでした。私は前に誤って読みました。しかし、IFRAMEがコンテナ要素に基づいて自身のサイズを変更するだけで、スクロールしてはならないつまりは持っているwidth: 100%;
IDRA

18

クロスブラウザソリューションが必要でした。要件は次のとおりです。

  • iOSと他の場所の両方で動作する必要がある
  • iFrameのコンテンツにアクセスできない
  • スクロールする必要があります!

iOSでのscrolling = "no"について@Idraから学んだことと、iOSの画面にiFrameコンテンツを適合させることに関するこの投稿基に最終的にここに到達しました。それが誰かを助けることを願って=)

HTML

<div id="url-wrapper"></div>

CSS

html, body{
    height: 100%;
}

#url-wrapper{
    margin-top: 51px;
    height: 100%;
}

#url-wrapper iframe{
    height: 100%;
    width: 100%;
}

#url-wrapper.ios{
    overflow-y: auto;
    -webkit-overflow-scrolling:touch !important;
    height: 100%;
}

#url-wrapper.ios iframe{
    height: 100%;
    min-width: 100%;
    width: 100px;
    *width: 100%;
}

JS

function create_iframe(url){

    var wrapper = jQuery('#url-wrapper');

    if(navigator.userAgent.match(/(iPod|iPhone|iPad)/)){
        wrapper.addClass('ios');
        var scrolling = 'no';
    }else{
        var scrolling = 'yes';
    }

    jQuery('<iframe>', {
        src: url,
        id:  'url',
        frameborder: 0,
        scrolling: scrolling
    }).appendTo(wrapper);

}

1
賛成ですが、なぜ「ios」クラスのIE6ルールですか?:-)
J.ブルーニ

12

これらすべてのソリューションの問題は、高さがiframe実際に変化しないことです。

この手段は、あなたの内側の中心要素にできなくなりiframe、使用のJavascript position:fixed;、またはposition:absolute;以降iframe自体は決してスクロールします。

ここ説明する私の解決策は、divこのCSSを使用してiframeのすべてのコンテンツを内にラップすることです。

#wrap {
    position: fixed;
    top: 0;
    right:0;
    bottom:0;
    left: 0;
    overflow-y: scroll;
    -webkit-overflow-scrolling: touch;
}

これにより、Safariはコンテンツに高さがないと判断し、iframe適切に高さを割り当てることができます。これにより、任意の方法で要素を配置することもできます。

あなたはここで素早く汚いデモを見ることができます。


1
これは私のために働いた唯一の解決策です。もちろん、これはのコンテンツを制御する場合にのみ使用できますiframeが、私の場合は使用します。乾杯!
Vince

うーん。あなたの例はiOSで反応しないようですか?
BrandonReid

これを書いたのは2年前のことです。リポジトリに問題を提出できますか?
ピア

iOSのIonic / Cordovaでこの問題に何時間も費やした後、これが機能した唯一のものです。ありがとう!
アンドリュー

1
これは素晴らしく、唯一機能したものです。私はこのようなソリューションを1日かけて@Pier 100ptsと探しました
Carlos E

5

この問題はiOS Chromeにも存在します。

上記のすべてのソリューションを一見したところ、ほとんどは非常にハックです。

古いブラウザをサポートする必要がない場合は、iframeの幅を100vwに設定してください。

iframe {
  max-width: 100%; /* Limits width to 100% of container */
  width: 100vw; /* Sets width to 100% of the viewport width while respecting the max-width above */
}

注:ビューポートユニットのサポートを確認してください https://caniuse.com/#feat=viewport-units


1
Chrome for iOSはその下にあるSafariです。WKWebViewを使用します。iOSでは他のWebレンダリングエンジンは許可されていません。
桟橋

3

私はionic2で作業しており、システム構成は以下のとおりです-


******************************************************

Your system information:

Cordova CLI: 6.4.0 
Ionic Framework Version: 2.0.0-beta.10
Ionic CLI Version: 2.1.8
Ionic App Lib Version: 2.1.4
ios-deploy version: Not installed
ios-sim version: 5.0.8 
OS: OS X Yosemite
Node Version: v6.2.2
Xcode version: Xcode 7.2 Build version 7C68



******************************************************

私にとって、この問題はこのコード
で解決されました-html iframeタグの場合-

<div class="iframe_container">
      <iframe class= "animated fadeInUp" id="iframe1" [src]='page' frameborder="0" >
        <!--  <img src="img/video-icon.png"> -->
      </iframe><br>
   </div>

同じのCSSを参照してください-


.iframe_container {
  overflow: auto; 
  position: relative; 
  -webkit-overflow-scrolling: touch;
  height: 75%;
}

iframe {
  position:relative;
  top: 2%;
  left: 5%;
  border: 0 !important;
  width: 90%;
}

私の場合、ポジションプロパティはここで重要な役割を果たします。
位置:相対;

それもあなたを助けるかもしれません!!!


0

CSSのみのソリューション

HTML

<div class="container">
    <div class="h_iframe">
        <iframe  src="//www.youtube.com/embed/9KunP3sZyI0" frameborder="0" allowfullscreen></iframe>
    </div>
</div>

CSS

html,body {
    height:100%;
}
.h_iframe iframe {
    position:absolute;
    top:0;
    left:0;
    width:100%;
    height:100%;
}

デモ

iframe内のHTMLページを使用した別のデモ


多分私はあなたのソリューションを間違って実装していますが、分離されたテストケースでそれを試したところ、iOS Safari 7.1 iPhone 4ではまったく機能しませんでした。これがどのように機能するかについて詳しく教えていただけますか?
Idra 14

問題を誤解しているように見えますが、このリンクを確認してください。iframeに追加のCSSを適用せずに統合された新しいデモiframeコンテンツです。そして、iOS Safariでそれを確認しても、応答は良好です。これは、このページに、iframeの幅を強制的にビューポートよりも広くする水平スクロールがないためです。質問で説明されているように、このようなサイトでは、iframeが応答するために何もする必要はありません。
Idra 2014

それで、あなたがそれをどのように動作させたいのか、あなたの与えられたリンクの例を挙げてください?
4dgaurav 2014

0

コンテンツペインの幅に問題があり、iframeの水平スクロールバーが作成されました。画像が予想よりも広い幅を保持していることがわかりました。すべての画像のcss max-widthをパーセントに設定することで解決できました。

<meta name="viewport" content="width=device-width, initial-scale=1" />

img {
        max-width: 100%;
        height:auto;
    }

0

実際、私にとっては、スクロールを無効にするiosで働いていました

<iframe src="//www.youraddress.com/" scrolling="no"></iframe>

スクリプトを介してOSを処理します。


0

私にとってCSSソリューションは機能しませんでした。ただし、幅をプログラムで設定することで問題が解決します。iframeの読み込み時に、幅をプログラムで設定します。

 $('iframe').width('100%');
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.