Le problème est que lorsque vous devez utiliser IFrames pour insérer du contenu dans un site Web, alors dans le monde Web moderne, on s'attend à ce que l'IFrame soit également réactif. En théorie, c'est simple, aidez simplement à utiliser <iframe width="100%"></iframe>
ou à définir la largeur CSS, iframe { width: 100%; }
mais en pratique, ce n'est pas aussi simple, mais cela peut l'être.
Si le iframe
contenu est entièrement réactif et peut se redimensionner sans barres de défilement internes, iOS Safari redimensionnera le iframe
sans aucun problème réel.
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 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>
Ensuite, cela fonctionne sans problème dans iOS 7.1 Safari. Vous pouvez passer du paysage au portrait sans aucun problème.
Cependant, en changeant simplement le CSS Content.html en ajoutant ceci:
#ScrolledArea {
width: 100%;
overflow: scroll;
white-space: nowrap;
background: #ff0000;
}
Vous obtenez ceci:
Comme vous pouvez le voir, même si le contenu Content.html est entièrement réactif ( div # ScrolledArea a été overflow: scroll
défini) et que la largeur de l'iframe est de 100%, l'iframe prend toujours toute la largeur du div # ScrolledArea comme si le débordement n'existait même pas. Démo
Dans des cas comme celui-ci, si le iframe
contenu comporte des zones de défilement, la question devient: comment obtenir le iframe
réactif, lorsque le contenu iframe a des zones de défilement horizontal? Le problème ici ne réside pas dans le fait que Content.html n'est pas réactif, mais dans le fait que iOS Safari redimensionne simplement l'iframe pour que le div#ScrolledArea
soit entièrement visible.
white-space: nowrap
style?white-space: nowrap
le problème n'est pas en soi. Je l'utilise simplement pour obtenir une largeur extrêmediv#ScrolledArea
. Le problème survient lorsque le contenu IFrame contient des zones de défilement horizontal. Si tel est le cas, iOS Safari ignore simplement vos paramètres de largeur et affiche le contenu du trou et brise la réactivité du site.Réponses:
La solution à ce problème est en fait assez simple et il existe deux façons de le résoudre. Si vous avez le contrôle sur Content.html, modifiez simplement la
div#ScrolledArea
largeur CSS en:Fondamentalement, l'idée ici est simple, vous définissez le
width
sur quelque chose qui est plus petit que la fenêtre (largeur de l'iframe dans ce cas), puis écrasez-le avecmin-width: 100%
pour permettre le remplacement réel dewidth: 100%
Safari iOS par défaut. Le*width: 100%;
est là pour que le code reste compatible IE6, mais si vous ne vous souciez pas d'IE6, vous pouvez l'omettre. DémoComme vous pouvez le voir maintenant, la
div#ScrolledArea
largeur est en fait de 100% et leoverflow: scroll;
peut faire son travail et cacher le contenu débordant. Si vous avez accès au contenu iframe, c'est préférable.Cependant, si vous n'avez pas accès au contenu de l'iframe (quelle qu'en soit la raison), vous pouvez en fait utiliser la même technique sur l'iframe lui-même. Utilisez simplement le même CSS sur l'iframe:
Cependant, il y a une limitation à cela, vous devez désactiver les barres de défilement avec
scrolling="no"
sur l'iframe pour que cela fonctionne:Si les barres de défilement sont autorisées, cela ne fonctionnera plus sur l'iframe. Cela dit, si vous modifiez le Content.html à la place, vous pouvez conserver le défilement dans l'iframe. Démo
la source
!important
à l'width
attribut pour que l'iframe responsive-web-design soit prêt sur un iPhone 4 avec iOS 7width
été défini plus tôt!important
ou qu'un CSS de priorité plus élevée l'ait écrasé. Dans des cas isolés sur iPhone 4 iOS7, ce n'était pas nécessaire.scrolling="yes"
sinon il n'y a aucun moyen de corriger cela, pour que le correctif fonctionne sur IFRAME, il vous suffit d'avoirscrolling="no"
sur l'IFRAMELe problème, semble-t-il, est que Mobile Safari 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 réglés sur 300 pixels. Le contenu est plus large afin que vous puissiez faire défiler l'iFrame.
Sur mobile safari, cependant, vous remarquerez que l'iFrame est automatiquement étendu à la largeur du contenu.
Je suppose que c'est une solution de contournement pour les problèmes de longue date avec le défilement du contenu dans une page. Dans le passé, si vous aviez une grande iframe à défilement sur un appareil tactile, vous restiez `` coincé '' dans l'iframe car cela ferait défiler au lieu de la page elle-même. Il semble qu'Apple ait décidé que le comportement par défaut d'un iFrame est «pas de défilement» et se développe pour l'empêcher.
Une option peut être cette solution de contournement. Au lieu de supposer que l'iFrame défilera, placez l'iframe dans un DIV sur lequel vous avez le contrôle et laissez-le défiler.
exemple: http://jsbin.com/zakedaja/1
Exemple de balisage:
Sur mobile safari, vous pouvez maintenant faire défiler le contenu de l'iFrame maintenant entièrement développé via le div qui le contient.
Le hic: Cela semble vraiment moche sur un navigateur de bureau, car vous avez maintenant des barres de défilement doubles. Vous devrez peut-être faire une détection de navigateur avec JS pour contourner ce problème.
la source
div#ScrolledArea
(en vert) dans mon exemple. J'ai juste mal lu avant. Mais l'iframe ne doit pas défiler uniquement en se redimensionnant en fonction de l'élément conteneur, c'est-à-dire avoirwidth: 100%;
J'avais besoin d'une solution multi-navigateurs. Les exigences étaient:
En s'appuyant sur ce que j'ai appris de @Idra concernant le scrolling = "no" sur iOS et ce post sur l'ajustement du contenu iFrame à l'écran sous iOS, voici ce que j'ai obtenu. J'espère que ça aide quelqu'un =)
HTML
CSS
JS
la source
Le problème avec toutes ces solutions est que la hauteur des
iframe
changements ne change jamais vraiment.Cela signifie que vous ne pourrez pas centrer les éléments à l'intérieur du
iframe
Javascriptposition:fixed;
, ouposition:absolute;
puisque leiframe
lui - même ne défile jamais.Ma solution détaillée ici est d'envelopper tout le contenu de l'iframe dans un en
div
utilisant ce CSS:De cette façon, Safari pense que le contenu n'a pas de hauteur et vous permet d'attribuer
iframe
correctement la hauteur du . Cela vous permet également de positionner les éléments comme vous le souhaitez.Vous pouvez voir une démo rapide et sale ici.
la source
iframe
, mais dans mon cas, je le fais. À votre santé!Ce problème est également présent sur iOS Chrome.
J'ai jeté un œil à toutes les solutions ci-dessus, la plupart sont très piratées.
Si vous n'avez pas besoin de support pour les navigateurs plus anciens, définissez simplement la largeur de l'iframe sur 100vw;
Remarque: vérifiez la prise en charge des unités de fenêtre https://caniuse.com/#feat=viewport-units
la source
Je travaille avec ionic2 et la configuration du système est comme ci-dessous-
Pour moi, ce problème a été résolu avec ce code -
pour la balise iframe html -
Voir css de même que-
La propriété de position joue ici un rôle vital dans mon cas.
position: relative;
Cela peut vous aider aussi !!!
la source
Solution CSS uniquement
HTML
CSS
DEMO
Une autre démo ici avec une page HTML en iframe
la source
J'ai eu un problème avec la largeur du volet de contenu en 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 définissant toutes les images css max-width à un pour cent.
la source
en fait pour moi je viens de travailler dans ios en désactivant le défilement
<iframe src="//www.youraddress.com/" scrolling="no"></iframe>
et traiter le système d'exploitation via un script.
la source
Pour moi, les solutions CSS ne fonctionnaient pas. Mais définir la largeur par programme fait le travail. Lors du chargement d'iframe, définissez la largeur par programme:
la source