Das Problem ist, dass in der modernen Web-Welt erwartet wird, dass der IFrame auch reagiert, wenn Sie IFrames zum Einfügen von Inhalten in eine Website verwenden müssen. Theoretisch ist es einfach, einfach zu verwenden <iframe width="100%"></iframe>
oder die CSS-Breite so einzustellen, iframe { width: 100%; }
aber in der Praxis ist es nicht ganz so einfach, aber es kann sein.
Wenn der iframe
Inhalt vollständig reagiert und die Größe ohne interne Bildlaufleisten ändern kann, ändert iOS Safari die Größe iframe
ohne echte Probleme.
Wenn Sie den folgenden Code berücksichtigen:
<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>
Mit der 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>
Dann funktioniert dies ohne Probleme in iOS 7.1 Safari. Sie können problemlos zwischen Quer- und Hochformat wechseln.
Ändern Sie jedoch einfach das CSS Content.html, indem Sie Folgendes hinzufügen:
#ScrolledArea {
width: 100%;
overflow: scroll;
white-space: nowrap;
background: #ff0000;
}
Du bekommst das:
Wie Sie sehen können, nimmt der Iframe die volle Breite der div # ScrolledArea an , obwohl der Content.html- Inhalt vollständig reagiert ( div # ScrolledArea wurde overflow: scroll
festgelegt) und die iframe-Breite 100% beträgt, als ob der Überlauf nicht einmal vorhanden wäre. Demo
Wenn in solchen Fällen der iframe
Inhalt Bildlaufbereiche enthält, stellt sich die Frage, wie die iframe
Reaktion erfolgen kann, wenn der Iframe-Inhalt horizontal Bildlaufbereiche aufweist. Das Problem liegt hier nicht in der Tatsache, dass die Content.html nicht reagiert , sondern in der Tatsache, dass die iOS-Safari die Größe des Iframes einfach so ändert, dass der div#ScrolledArea
vollständig sichtbar ist.
white-space: nowrap
Stil enthält?white-space: nowrap
an sich ist nicht das Problem. Ich benutze es einfach, um eine extreme Breite zu bekommendiv#ScrolledArea
. Das Problem tritt auf, wenn der IFrame-Inhalt horizontal scrollbare Bereiche enthält. In diesem Fall ignoriert die iOS-Safari einfach Ihre Breiteneinstellungen und zeigt den Lochinhalt an und beeinträchtigt die Reaktionsfähigkeit der Website.Antworten:
Die Lösung für dieses Problem ist eigentlich recht einfach und es gibt zwei Möglichkeiten. Wenn Sie die Kontrolle über Content.html haben, ändern Sie einfach die
div#ScrolledArea
Breite des CSS in:Grundsätzlich ist die Idee hier einfach: Sie setzen das
width
auf etwas, das kleiner als das Ansichtsfenster ist (in diesem Fall die Iframe-Breite), und überschreiben es dann mitmin-width: 100%
, um zu berücksichtigen,width: 100%
welches iOS Safari standardmäßig überschreibt. Das*width: 100%;
ist da, damit der Code IE6-kompatibel bleibt, aber wenn Sie sich nicht für IE6 interessieren, können Sie ihn weglassen. DemoWie Sie jetzt sehen können,
div#ScrolledArea
beträgt die Breite tatsächlich 100% und dasoverflow: scroll;
kann es tun und den überfüllten Inhalt verbergen. Wenn Sie Zugriff auf den Iframe-Inhalt haben, ist dies vorzuziehen.Wenn Sie jedoch keinen Zugriff auf den Iframe-Inhalt haben (aus welchem Grund auch immer), können Sie dieselbe Technik auch für den Iframe selbst anwenden. Verwenden Sie einfach dasselbe CSS für den Iframe:
Es gibt jedoch eine Einschränkung: Sie müssen die Bildlaufleisten
scrolling="no"
auf dem Iframe deaktivieren, damit dies funktioniert:Wenn die Bildlaufleisten zulässig sind, funktioniert dies auf dem Iframe nicht mehr. Wenn Sie jedoch stattdessen die Datei Content.html ändern , können Sie den Bildlauf im Iframe beibehalten. Demo
quelle
!important
daswidth
Attribut hinzufügen , um das Iframe Responsive-Web-Design auf einem iPhone 4 mit iOS 7 fertig zu stellenwidth
wurde das zuvor mit!important
CSS festgelegt oder von einem CSS mit höherer Priorität überschrieben. In Einzelfällen in iPhone 4 iOS7 wurde es nicht benötigt.scrolling="yes"
nicht korrigiert werden kann. Damit das Update auf IFRAME funktioniert, müssen Sie nurscrolling="no"
auf dem IFRAMEDas Problem scheint zu sein, dass Mobile Safari sich weigert, die Breite Ihres iFrame einzuhalten, wenn das darin enthaltene Dokument breiter ist als von Ihnen angegeben. Beispiel:
http://jsbin.com/hapituto/1
In einem Desktop-Browser sehen Sie einen iFrame und einen Div, die beide auf 300px eingestellt sind. Der Inhalt ist breiter, sodass Sie im iFrame scrollen können.
Auf einer mobilen Safari werden Sie jedoch feststellen, dass der iFrame automatisch auf die Breite des Inhalts erweitert wird.
Ich vermute, dass dies eine Problemumgehung für langjährige Probleme beim Scrollen von Inhalten innerhalb einer Seite ist. Wenn Sie in der Vergangenheit einen großen Bildlauf-Iframe auf einem Touch-Gerät hatten, blieben Sie im Iframe stecken, da dieser anstelle der Seite selbst gescrollt würde. Es scheint, dass Apple entschieden hat, dass das Standardverhalten eines iFrames "kein Bildlauf" ist, und erweitert, um dies zu verhindern.
Eine Option kann diese Problemumgehung sein. Anstatt davon auszugehen, dass der iFrame einen Bildlauf durchführt, platzieren Sie den Iframe in einem DIV, über den Sie die Kontrolle haben, und lassen Sie diesen Bildlauf durchführen.
Beispiel: http://jsbin.com/zakedaja/1
Beispiel-Markup:
Auf der mobilen Safari können Sie jetzt den Inhalt des jetzt vollständig erweiterten iFrame über das darin enthaltene div scrollen.
Der Haken: Das sieht in einem Desktop-Browser wirklich hässlich aus, da Sie jetzt doppelte Bildlaufleisten haben. Daher müssen Sie möglicherweise eine Browsererkennung mit JS durchführen, um dies zu umgehen.
quelle
div#ScrolledArea
(in Grün) in meinem Beispiel. Ich habe es gerade falsch verstanden. Aber der Iframe sollte nicht scrollen, sondern nur die Größe selbst basierend auf dem Containerelement ändern, dh habenwidth: 100%;
Ich brauchte eine browserübergreifende Lösung. Anforderungen waren:
Aufbauend auf dem, was ich von @Idra in Bezug auf Scrollen = "Nein" unter iOS gelernt habe, und diesem Beitrag über das Anpassen von iFrame-Inhalten an den Bildschirm in iOS habe ich Folgendes erreicht. Hoffe es hilft jemandem =)
HTML
CSS
JS
quelle
Das Problem bei all diesen Lösungen ist, dass sich die Höhe des
iframe
nie wirklich ändert.Dies bedeutet, dass Sie
iframe
mit Javascript keine Elemente in der Mitte zentrierenposition:fixed;
können oder dassposition:absolute;
die Elementeiframe
selbst niemals gescrollt werden.Meine Lösung detailliert hier ist alles , den Inhalt des iframe in einem wickelt
div
mit diesem CSS:Auf diese Weise glaubt Safari, dass der Inhalt keine Höhe hat, und lässt Sie die Höhe des Inhalts
iframe
richtig zuweisen . Auf diese Weise können Sie Elemente auch beliebig positionieren.Sie können hier eine schnelle und schmutzige Demo sehen.
quelle
iframe
, aber in meinem Fall tue ich das. Prost!Dieses Problem tritt auch bei iOS Chrome auf.
Ich habe alle oben genannten Lösungen durchgesehen, die meisten sind sehr hackig.
Wenn Sie keine Unterstützung für ältere Browser benötigen, setzen Sie einfach die iframe-Breite auf 100vw.
Hinweis: Überprüfen Sie die Unterstützung für Ansichtsfenstereinheiten https://caniuse.com/#feat=viewport-units
quelle
Ich arbeite mit ionic2 und die Systemkonfiguration ist wie folgt:
Für mich wurde dieses Problem mit diesem Code behoben -
für HTML-Iframe-Tag-
Siehe CSS des gleichen As-
Positionseigenschaft spielt hier in meinem Fall eine entscheidende Rolle.
Position: relativ;
Es kann dir auch helfen !!!
quelle
Nur CSS-Lösung
HTML
CSS
DEMO
Eine weitere Demo hier mit HTML-Seite in Iframe
quelle
Ich hatte ein Problem mit der Breite im Inhaltsbereich, bei dem eine horizontale Bildlaufleiste für den Iframe erstellt wurde. Es stellte sich heraus, dass ein Bild die Breite breiter als erwartet hielt. Ich konnte es lösen, indem ich die maximale CSS-Breite aller Bilder auf ein Prozent festlegte.
quelle
Tatsächlich habe ich gerade in iOS gearbeitet, um die Schriftrolle zu deaktivieren
<iframe src="//www.youraddress.com/" scrolling="no"></iframe>
und Behandeln des Betriebssystems per Skript.
quelle
Bei mir haben CSS-Lösungen nicht funktioniert. Das programmgesteuerte Einstellen der Breite erledigt den Job jedoch. Stellen Sie beim Laden des Iframes die Breite programmgesteuert ein:
quelle