Comment obtenir une IFrame pour être responsive En Safari iOS?

le problème est que lorsque vous devez utiliser IFrames pour insérer du contenu dans un site Web, puis dans le monde web moderne, il est prévu que L'IFrame serait également réactive. En théorie, il est simple, tout simplement aider à utiliser <iframe width="100%"></iframe> ou de définir la largeur CSS à iframe { width: 100%; } , mais en pratique, il n'est pas tout à fait simple, mais il peut l'être.

si le contenu iframe est entièrement réactif et peut se redimensionner sans barre de défilement interne, alors iOS Safari redimensionner le iframe sans problèmes réels.

si vous considérez le code suivant:

<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>

avec le contenu .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>

alors cela fonctionne sans problèmes dans iOS 7.1 Safari. Vous pouvez changer entre paysage et portrait sans aucun problème.

enter image description here enter image description here

toutefois par il suffit de changer le contenu .html CSS en ajoutant ceci:

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

, Vous obtenez ceci:

enter image description here enter image description here

comme vous pouvez le voir, même si le contenu .html le contenu est entièrement responsive ( div#ScrolledArea a overflow: scroll ensemble) et la largeur iframe est de 100% l'iframe prend encore la pleine largeur de la div#ScrolledArea comme si le dépassement n'existe même pas. Démo

dans des cas comme celui-ci, est-ce que le contenu iframe comporte des zones de défilement, la question devient, comment obtenir la réponse iframe , quand le contenu iframe a des zones de défilement horizontales? Le problème ici n'est pas dans le fait que le contenu .html n'est pas responsive, mais dans le fait que le Safari iOS redimensionne l'iframe de façon à ce que le div#ScrolledArea soit entièrement visible.

99
demandé sur Idra 2014-04-15 16:15:42

9 réponses

la solution pour ce problème est en fait assez simple et il ya deux façons de procéder. Si vous avez le contrôle sur le contenu .html puis changez simplement la div#ScrolledArea largeur CSS en:

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

fondamentalement l'idée ici est simple, vous mettez le width à quelque chose qui est plus petit que le viewport (iframe width dans ce cas) et puis l'écraser avec min-width: 100% pour tenir compte de réelle width: 100% qui iOS Safari par défaut remplace. Le *width: 100%; est là donc le code resterait compatible IE6, mais si vous ne vous souciez pas de IE6, vous pouvez l'omettre. Démo

enter image description here enter image description here

comme vous pouvez le voir maintenant, la largeur div#ScrolledArea est en fait de 100% et le overflow: scroll; peut faire sa chose et cacher le contenu débordant. Si vous avez accès au contenu de l'iframe, c'est préférable.

cependant si vous n'avez pas accès au contenu iframe (pour quelle raison que ce soit) alors vous pouvez réellement utiliser la même technique sur l'iframe elle-même. Il suffit d'utiliser le même CSS sur l'iframe:

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

Cependant, il y a une limite à cela, vous devez désactiver les barres de défilement avec scrolling="no" sur l'iframe pour que cela fonctionne:

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

si les barres de défilement sont autorisées, cela ne fonctionnera pas sur l'iframe plus. Cela dit, si vous modifiez le contenu .html à la place, vous pouvez conserver le défilement dans l'iframe. Démo

241
répondu Idra 2016-02-16 22:49:14

le problème, il semble, est que le Safari Mobile refusera d'obéir à la largeur de votre iFrame si le document qu'il contient est plus large que ce que vous avez spécifié. Exemple:

http://jsbin.com/hapituto/1

sur un navigateur de bureau, vous verrez un iFrame et un Div tous les deux définis à 300px. Le contenu est plus large de sorte que vous pouvez faire défiler l'iFrame.

sur mobile safari, cependant, vous noterez que le iFrame est auto-étendu à la largeur du contenu.

à mon avis, il s'agit d'une solution de contournement pour les problèmes de longue date avec le contenu défilant dans une page. Dans le passé, si vous aviez une grande iframe de défilement sur un appareil tactile, vous seriez "coincé" dans l'iframe car ce serait défiler au lieu de la page elle-même. Il semble Qu'Apple ait décidé que le comportement par défaut d'une iFrame est 'no scroll' et se développe pour l'empêcher.

une option peut être contournement. Au lieu de supposer que l'iFrame va défiler, placez l'iframe dans une DIV sur laquelle vous avez le contrôle et laissez ce défilement.

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

exemple de balisage:

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

sur le safari mobile, vous pouvez maintenant faire défiler le contenu de l'iFrame maintenant entièrement élargi via le div qui le contient.

le piège: cela semble vraiment laid sur un navigateur de bureau, comme maintenant vous avez des barres de défilement doubles. Donc vous devrez peut-être faire une détection de navigateur avec JS pour contourner cela.

18
répondu DA. 2014-04-17 03:02:42

j'avais besoin d'une solution de navigateur. Les besoins étaient les suivants:

  • nécessaire pour travailler à la fois sur iOS et ailleurs
  • n'ont pas accès au contenu dans l'iFrame
  • j'en ai besoin pour faire défiler!

construire à partir de ce que j'ai appris de @Idra concernant le défilement= "non" sur iOS et ce post sur l'ajustement du contenu iFrame à l'écran dans iOS voici ce que j'ai fini avec. Espérons que cela aide quelqu'un =)

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);

}
10
répondu ggwarpig 2018-04-19 19:29:10

le problème avec toutes ces solutions est que la hauteur du iframe ne change jamais vraiment.

cela signifie que vous ne pourrez pas centrer des éléments à l'intérieur du iframe en utilisant Javascript, position:fixed; , ou position:absolute; puisque le iframe lui-même ne défile jamais.

ma solution détaillé ici est d'envelopper tout le contenu de l'iframe dans un div en utilisant ce CSS:

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

de cette façon Safari croit que le contenu n'a pas de hauteur et vous permet d'attribuer la hauteur du iframe correctement. Cela vous permet également de positionner les éléments comme vous le souhaitez.

vous pouvez voir une démo rapide et sale ici.

5
répondu Pier 2016-07-22 19:27:28

je travaille avec ionic2 et la configuration du système est comme ci - dessous -


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

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



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

pour moi ce problème a été résolu avec ce code -

pour la balise iframe html -

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

voir css du même que -


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

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

Position la propriété joue un rôle vital dans mon cas.

position: relative;

Il peut vous aider aussi!!!

1
répondu S.Yadav 2016-11-16 12:25:15

CSS seule solution

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%;
}

DÉMO

l'Autre démo ici avec le HTML de la page dans un iframe

0
répondu 4dgaurav 2014-04-16 01:56:39

j'ai eu un problème avec la largeur sur le volet de contenu créant une barre de défilement horizontale pour l'iframe. Il s'est avéré qu'une image tenait la largeur plus large que prévu. J'ai pu le résoudre en réglant toutes les images CSS Max-width à un pour cent.

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

img {
        max-width: 100%;
        height:auto;
    }
0
répondu Dr. Aaron Dishno 2015-08-18 21:13:27

en fait pour moi vient de travailler dans ios désactivant le rouleau

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

et le traitement de L'OS via script.

0
répondu Luiz Rossi 2018-05-17 20:48:50

ce numéro est également présent sur iOS Chrome.

dans mon cas, j'avais besoin d'un J'ai jeté un coup d'oeil à toutes les solutions ci-dessus, la plupart sont très hacky.

si vous n'avez pas besoin de support pour les navigateurs plus anciens, il suffit de régler la largeur 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 */ }

Note : Vérifier le support des unités de viewport https://caniuse.com/#feat=viewport-units

0
répondu Prathamesh Gharat 2018-09-13 08:33:49