Wie kann ein Iframe reagieren, ohne ein Seitenverhältnis anzunehmen? Beispielsweise kann der Inhalt eine beliebige Breite oder Höhe haben, die vor dem Rendern unbekannt ist.
Beachten Sie, dass Sie Javascript verwenden können.
Beispiel:
<div id="iframe-container">
<iframe/>
</div>
Größe dies iframe-container
Passen Sie die so an, dass der Inhalt ohne zusätzlichen Platz kaum hineinpasst. Mit anderen Worten, es ist genügend Platz für den Inhalt vorhanden, sodass er ohne Scrollen angezeigt werden kann, jedoch ohne zusätzlichen Platz. Der Behälter umhüllt den Iframe perfekt.
Dies zeigt, wie ein Iframe reagiert, wenn das Seitenverhältnis des Inhalts 16: 9 beträgt. In dieser Frage ist das Seitenverhältnis jedoch variabel.
Antworten:
Es ist nicht möglich, mit Javascript mit einem iFrame eines anderen Ursprungs zu interagieren, um dessen Größe zu ermitteln. Die einzige Möglichkeit, dies zu tun, besteht darin,
window.postMessage
dastargetOrigin
Set auf Ihre Domain oder den Wildchar*
aus der iFrame-Quelle zu verwenden. Sie können den Inhalt der verschiedenen Ursprungsseiten als Proxy verwenden und verwenden. Diessrcdoc
wird jedoch als Hack angesehen und funktioniert nicht mit SPAs und vielen anderen dynamischeren Seiten.Gleiche iFrame-Größe
Angenommen, wir haben zwei iFrames gleichen Ursprungs, einen mit kurzer Höhe und fester Breite:
und ein langer iFrame:
Wir können die iFrame-Größe für ein
load
Ereignis ermitteln, indemiframe.contentWindow.document
wir Folgendes an das übergeordnete Fenster sendenpostMessage
:Wir erhalten die richtige Breite und Höhe für beide iFrames. Sie können es hier online überprüfen und den Screenshot sehen hier sehen .
Hack mit iFrame-Größe unterschiedlicher Herkunft ( nicht empfohlen )
Die hier beschriebene Methode ist ein Hack und sollte verwendet werden, wenn dies absolut notwendig ist und es keinen anderen Weg gibt. Es funktioniert nicht für die meisten dynamisch generierten Seiten und SPAs. Die Methode ruft den HTML-Quellcode der Seite mithilfe eines Proxys ab, um die CORS-Richtlinie zu umgehen (dies
cors-anywhere
ist eine einfache Möglichkeit, einen einfachen CORS-Proxyserver zu erstellen, und verfügt über eine Online-Demohttps://cors-anywhere.herokuapp.com
). Anschließend wird JS-Code in diesen HTML-Code eingefügt,postMessage
um die Größe des zu verwenden und zu senden iFrame zum übergeordneten Dokument. Es behandelt sogar das iFrame-Ereignisresize
( kombiniert mit iFramewidth: 100%
) und sendet die iFrame-Größe an das übergeordnete Element zurück.patchIframeHtml
::Eine Funktion , die iFrame HTML - Code und inject benutzerdefinierte Javascript flicken , die verwenden werden
postMessage
auf die iFrame Größe an die Eltern zu sendenload
und aufresize
. Wenn für denorigin
Parameter ein Wert vorhanden ist ,<base/>
wird dem Kopf unter Verwendung dieser Ursprungs-URL ein HTML- Element vorangestellt, sodass HTML-URIs wie/some/resource/file.ext
von der Ursprungs-URL im iFrame ordnungsgemäß abgerufen werden.getIframeHtml
::Eine Funktion zum
useProxy
Abrufen eines Seiten-HTML- Codes , der das CORS mithilfe eines Proxys umgeht, wenn param festgelegt ist. Es können zusätzliche Parameter vorhanden sein, diepostMessage
beim Senden von Größendaten an übergeben werden.Die Funktion zur Behandlung von Nachrichtenereignissen ist genau die gleiche wie unter "Gleiche Ursprungs-iFrame-Größe" .
Wir können jetzt eine Cross-Origin-Domain in einen iFrame laden, wobei unser benutzerdefinierter JS-Code eingefügt wird:
Und wir werden den iFrame auf die volle Höhe des Inhalts bringen, ohne dass ein vertikales Scrollen
overflow-y: auto
erforderlich ist, selbst wenn der iFrame-Körper verwendet wird ( dies sollteoverflow-y: hidden
so sein, dass beim Ändern der Größe keine Bildlaufleiste flackert ).Sie können es hier online überprüfen .
Wieder zu bemerken, dass dies ein Hack ist und es vermieden werden sollte ; Wir können weder auf Cross-Origin iFrame-Dokumente zugreifen noch irgendwelche Dinge injizieren.
quelle
cors-anywhere
ist im Moment nach unten , so dass Sie nicht sehen können Demo - Seite. Ich möchte aus urheberrechtlichen Gründen keinen Screenshot der externen Website hinzufügen. Ich werde einen anderen CORS-Proxy hinzufügen, wenn dieser lange nicht funktioniert.Es gibt viele Komplikationen bei der Ermittlung der Größe des Inhalts in einem Iframe, hauptsächlich aufgrund von CSS, das es Ihnen ermöglicht, Dinge zu tun, die die Messung der Inhaltsgröße beeinträchtigen können.
Ich habe eine Bibliothek geschrieben, die sich um all diese Dinge kümmert und auch domänenübergreifend arbeitet. Vielleicht finden Sie sie hilfreich.
https://github.com/davidjbradshaw/iframe-resizer
quelle
Meine Lösung ist auf GitHub und JSFiddle .
Präsentation einer Lösung für reaktionsschnelle Iframes ohne Annahme eines Seitenverhältnisses.
NB: Vergessen Sie nicht, die Größenänderungsfunktion nach dem Laden der Seite aufzurufen, da die Größe des Fensters nach dem Laden der Seite nicht von selbst geändert wird.
Der Code
index.html
style.css
main.js
Ich habe einige Zeit damit verbracht. Ich hoffe es wird euch gefallen =)
Bearbeiten Dies ist wahrscheinlich die beste generische Lösung. Wenn der Iframe jedoch sehr klein gemacht wird, erhält er nicht die richtige Größe. Dies ist spezifisch für den von Ihnen verwendeten Iframe. Es ist nicht möglich, eine richtige Antwort für dieses Phänomen zu codieren, es sei denn, Sie haben den Code des Iframes, da Ihr Code nicht wissen kann, welche Größe vom Iframe bevorzugt wird, um richtig angezeigt zu werden.
Nur einige Hacks wie der von @Christos Lytras können den Trick machen, aber es wird nie für jeden Iframe funktionieren. Nur in einer bestimmten Situation.
quelle
Machen Sie eine Sache, indem Sie dem Iframe-Container eine CSS-Eigenschaft für Breite und Höhe festlegen
quelle