Ich habe darüber schon mal berichtet, jedoch traten immer wieder Fehler im Internet Explorer auf. Hier nun eine ausführlichere Beschreibung, wie man vertikale Scrollbalken in iFrames durch automatische Höhenanpassung vermeidet.
In den Kommentaren meines ersten Artikels zu diesem Script, ließt man häufig das es im Internet Explorer einfach nicht klappen möchte. Am vergangenen Wochenende erreichte mich eine E-Mail mit der Bitte mich diesem Problem anzunehmen.
Erste Spekulationen und Tipps zum Ausbessern brachten leider nichts. Der Teufel liegt eben doch im Detail, weshalb ich diese Erfahrungen in einem separaten Artikel noch mal kundtun möchte.
Das JavaScript
Als erstes muss das Herzstück im Head-Bereich der Website platziert werden. Einfach den folgenden Code zwischen <head> und </head> kopieren.
<script type="text/javascript">
var framefenster = document.getElementsByTagName("iFrame");
var auto_resize_timer = window.setInterval("autoresize_frames()", 400);
function autoresize_frames() {
for (var i = 0; i < framefenster.length; ++i) {
if(framefenster[i].contentWindow.document.body){
var framefenster_size = framefenster[i].contentWindow.document.body.offsetHeight;
if(document.all && !window.opera) {
framefenster_size = framefenster[i].contentWindow.document.body.scrollHeight;
}
framefenster[i].style.height = framefenster_size + 'px';
}
}
}
</script>
Der iFrame
Mit dem JavaScript haben wir schon die halbe Miete. Beim iFrame selbst, müssen jedoch auch einige Punkte berücksichtigt werden, damit das Script auch im Internet Explorer einwandfrei funktionieren kann.
<iFrame src="ordner/datei.html" style="width:600px; height:200px; border:none;" frameborder="0" name="irgendwas" scrolling="no"></iFrame>
Beim Platzieren des iFrames auf der eigentlichen Seite muss man folgendes beachten:
- Eine Höhe ist angegeben
- Die Schreibweise von "iFrame" ist absolut identisch mit der Schreibweise aus dem JavaScript
- Der Pfad zur Datei im "src" befindet sich auf der gleichen Domain. Subdomains gelten als neue Domain. Am Besten verwendet man hier relative oder absolute Pfade zur jeweiligen Datei, ohne vorne dran ein "http://" zu schreiben
- Es bietet sich an im Standardkonformen-Modus zu arbeiten. Sind wir außerhalb dieses Modus kann es zu Fehlern kommen. Um diesen Modus zu erhalten ist ein vollständiger und korrekter DocType notwendig
Der Inhalt des iFrame
Beim Inhalt des iFrame sollte man ebenfalls einige Punkte beachten, damit das JavaScript auch die Möglichkeit hat eindeutig die Höhe der Elemente zu errechnen.
- Der Body der Datei im iFrame sollte über CSS einen Margin-Wert haben. z.B. "margin:10px 0;"
- P-Tags und H-Tags (H1, H2, etc.) sollten ebenfalls einen Margin-Wert zugewiesen haben, falls sie verwendet werden. z.B. "margin:0 0 10px;"
Und es funktioniert doch!
Sind diese ganzen Punkte berücksichtigt, steht dem scrollbalkenfreiem iFrame-Vergnügen nichts mehr im Wege. Dieses Script funktioniert schon mehrfach als Ergänzung eines kostenpflichtigen CMS-Systems in allen gängigen Browsern. Einzige Voraussetzung ist aktiviertes JavaScript.
Nun sollten alle Zweifel und Stolpersteine aus dem Weg geräumt sein.
Vielen Dank an Sabine !
Sie hat mich darauf gebracht das Thema "Automatische iFrame-Höhe" noch mal neu aufzugreifen.
Verwandte Artikel
iFrame-Höhe an dessen Inhalt automatisch anpassen
1 Geschrieben von: Akahito , am 04.06.2009 um 21:21 Hi! Ich möchte mich bei dir bedanken! Du hast mir und meiner Seite wirklich geholfen. Endlich habe muss ich die height nicht mehr angeben, da dies durch das hier automatisch angepasst wird. Danke! 2 Geschrieben von: Poetker , am 22.06.2009 um 18:31 Jup, ist eine ziemlich klevere Lösung... Es funktioniert... nur nicht im Opera!? Woran könnte das liegen? 3 Geschrieben von: Armin Vieweg , am 22.06.2009 um 19:35 Ich würde mal raten, dass der Opera Browser nichts mit ".contentWindow.document.body.offsetHeight" oder .scrollHeight anfangen kann. Allerdings muss ich auch gestehen, dass ich diese Lösung nicht im Opera-Browser getestet habe, da die Verbreitung relativ gering im Verhältnis zum dahinterstehenden Aufwand steht. Gegebenfalls kann es sogar sein, dass der Opera-Browser diese Lösung aus Sicherheitsgründen komplett sperrt. Gibt es denn eine Fehlermeldung im Operabrowser, welcher der Befehle nun keine Wirkung zeigt? Gruß Armin 4 Geschrieben von: Poetker , am 06.07.2009 um 14:47 Nein der Iframe wird bei der eingegeben Höhe abgeschnitten, gibt man keine Höhe ein, bleibt er bei ca. 100px Größe... Wenn man in das Feld mit dem Cursor fährt und scrollt, bewegt sich der Inhalt... LG Poetker 5 Geschrieben von: Daniel , am 09.07.2009 um 12:34 Hi, das ist das erste Script welches bei mir funktioniert und ich schaue schon seit 2 Tagen :-( Leider hab ich ein Problem mit dem Mozilla Firefox 3.0 -> dort nimmt er wie es scheint die höhe der 1. src und verändert danach nix mehr... Im IE klappts spitze... Bei mir ist der iframe innerhalb eines divs mit auto höhe... Wenn jemand was weiss wär ich echt froh. LG vom Bodensee 6 Geschrieben von: Armin Vieweg , am 09.07.2009 um 15:06 Hi Daniel, mir ist kein Fehler im Firefox bekannt. Schick mir doch mal die URL (am besten per Mail), dann schaue ich es mir gerne mal an. Gruß Armin 7 Geschrieben von: Daniel , am 09.07.2009 um 16:23 Hier hinterlasse ich doch gerade noch ein ganz fettes MERCI an Armin der sich meines Problems nicht nur angenommen hat sondern es gelöst hat... LG vom Bodensee Daniel 8 Geschrieben von: domme , am 23.08.2009 um 14:37 vielen dank! 9 Geschrieben von: JanC , am 18.10.2009 um 23:56 Nach sowas habe ich schon ewig gesucht. Wow ,Echt gute Arbeit. Vielen Dank ! gruß, Jan 10 Geschrieben von: DanielG , am 27.10.2009 um 12:38 Hallo, irgendwie funktioniert das Script bei mir nicht. Ich habe mal als Debug ein paar Alerts eingebaut und da bekomme ich immer den Initialisierungswert (200px) als Höhe heraus (egal ob mit offsetHeight oder scrollHeight). Ich benutze IE7 und FF3, an was kann das liegen? Gruß, DanielG 11 Geschrieben von: Armin Vieweg , am 27.10.2009 um 16:01 An soooooo vielem. Deswegen empfehle ich mir über Kontakt ne Nachricht zu schicken mit einem Link zu dem Problem. Da es in keinem Browser funktioniert würde ich zwei Dinge vermuten: Irgendwo im JavaScript einen Fehler. Das könnte man mit der Firebug Console mal prüfen Oder Du rufst im iFrame einen externen Inhalt auf. Also etwas was nicht auf der gleichen Domain liegt, wie der iFrame selbst. Dabei reicht auch schon mit www. und ohne um einen Unterschied zu haben und Subdomains werden auch als extern gewertet. Wenn nichts davon zutrifft, dann schreib mir bitte nochmal ne Mail. Vielen Dank und schönen Gruß Armin 12 Geschrieben von: Michael , am 10.12.2009 um 09:01 Herzlichen Dank! Genau das hab ich schon lange gesucht. 13 Geschrieben von: Christian , am 29.12.2009 um 18:51 Hallo, klappt super, ich würde nur gerne eine externe seite einbinden. hättest du dafür auch eine Lösung? Vielen Dank Chris 14 Geschrieben von: Armin Vieweg , am 29.12.2009 um 19:54 Hallo Chris, eine solche Lösung gibt es. Ist auch unter dem Artikel (und über den Kommentaren) verlinkt. Ein alter Beitrag zu dem Thema. In der Mitte des Artikels findest Du die Beschreibung für externe Seiten. ABER: Du musst auf der externen Seite dafür ein JavaScript eingebettet haben. Nur dann funktioniert das. Man kann also nicht x-beliebige Seiten wie z.B. Google und Co. im iFrame automatisch anpassen lassen. Hoffe weitergeholfen zu haben. Guten Rutsch! Armin 15 Geschrieben von: Silvio Segner , am 09.04.2010 um 19:24 Ich möchte jetzt auch hier noch einmal einen dickes Dankeschön an Armin senden. Die schnelle und unkomplizierte Hilfe bei meinem Problem mit dem einbinden des Scripts fand ich einfach super. Es gibt nur Wenige die ihr Wissen so selbstlos mit Anderen teilen. Jetzt wo ich diese Seite entdeckt habe, werde ich hier mal öffter reinschaunen. Nochmals Danke Armin Gruß. Silvio 16 Geschrieben von: Zotemano , am 15.05.2010 um 13:47 Hey. Danke für das tolle Script. Habe da mal eine Frage an dich. Also ich biete auf meiner Website eine Witzbox an, und verwende dein Script. Damit es bei den anderen Usern auch klappt, müsste ich dein Script ebenfalls mit angeben. Hast du etwas dagegen? Ansonsten muss ich mir etwas anderes einfallen lassen. LG Zotemano Bitte deine Antwort an zotemano@hotmail.de 17 Geschrieben von: Christoph , am 10.08.2010 um 18:12 Vielen Dank Armin für diese wunderbare Anleitung und die offenlegung deines Scripts. Danach habe auch ich jetzt schon einige Stunden gesucht und jetzt habe ich meine Suche hier vorerst beenden können. Im Internetexplorer funktioniert das ganze wunderbar - im Firefox allerdings blinkt der Frame nur ganz kurz auf woraufhin er dann scheinbar verschwindet. Evtl. wird die höhe hierbei auf 0px veringert?! Hat hier jemand einen Rat für mich? Vielen vielen Dank schonmal, Grüße, Christoph 18 Geschrieben von: Armin Vieweg , am 13.08.2010 um 14:57 Hallo Christoph, ich vermute wie Du, dass die Höhe auf 0 Pixel gestellt wird. Als ich diesen Fehler das letzte mal gesehen habe, lag es am Code der Seite im iFrame. Generell sollte diese Seite bei einem Validitätscheck keine Fehler oder Warnungen haben - wenn das nichts hilft, schick mir doch einfach mal eine E-Mail mit der konkreten Seite, dann helfe ich gerne weiter. Gruß Armin 19 Geschrieben von: Mario , am 11.10.2010 um 14:49 Hallo Armin, vielen Dank für die ausführliche Beschreibung. Aber lässt sich Deine Methode auch in CMS-Seiten wie Wordpress und Joomla anwenden? Muss dann der JavaScript-Teil in die Index.php und wirkt sich das nicht negativ auf den Rest der Seite aus? Danke im Voraus. 20 Geschrieben von: Anna , am 05.11.2010 um 18:52 Hallo Armin Dein Script ist super! Nun, wie sieht es aus mit externen-Inhalten? src="http://...." ergibt nix. Danke und Gruss Anna 21 Geschrieben von: Peter , am 14.12.2010 um 15:54 Hallo Armin, ich habe mich auch Deines Skriptes bedient und eine externes Gästebuch auf meiner Homepage mittels eines iFrames eingebunden. leider funktioniert das ganze nicht, der Scrollbalken ist zwar weg, jedoch werden die Einträge bei Erreichen der vorgegebenen Höhe im iFrame einfach abgeschnitten. Ich schicke mal die URL per Kontaktformular... schon mal DANKE! Grüße, Peter 22 Geschrieben von: Addy , am 20.12.2010 um 10:49 Hallo Armin, Danke dir erstmal für diesen Beitrag. 2 Sachen wollte ich Fragen. -Ich habe den script über Tomcat laufenlassen. Mit IE9beta läuft es super, ABER mit Firefox funktioniert es nicht. -Wie kann man diesen Code auch für automatische Breite umsetzen (offsetWidth)??? Kann man beide gleichzeitig einsetzen? 23 Geschrieben von: Markus , am 30.12.2010 um 22:05 Ich würde gerne eine externe Seite einbinden. Kann mir einer bitte erklären was ich dafür verändern muss ;D Danke sehr Markus 24 Geschrieben von: Manfred , am 21.01.2011 um 13:20 Hallo Armin Glücklicherweise bin ich auf der Suche nach einer Lösung für automatische Anpassung der Höhe eines iframe auf Dein Script gestossen, das in jedem gängigen Browser funktioniert, sogar im IE, aber leider nicht im Firefox.. Damit der Shop im iframe angezeigt werden kann, musste ich per css für den firefox über overflow:auto; die Scrollbalken anzeigen. Gibt es eine Möglichkeit, für den Firefox das iframe ohne Scrollbalken darzustellen? Besten Dank für Dein Script und Deine Hilfe. Gruss Manfred 25 Geschrieben von: Armin Vieweg , am 21.01.2011 um 13:39 Hallo Manfred, man kann über CSS overflow:hidden; oder über das iframe-Attribut scrolling="no" die Scrollbalken prinzipiell deaktivieren. Allerdings glaube ich wird Dir das nicht helfen, da Du ja explizit den Firefox als störende Quelle erwähnt hast. Was genau ist denn der Grund für Deine Frage? Vielleicht hast Du auch einen Link für mich, zum gucken? Du kannst Du mir, wenn Du möchtest auch schnell eine E-Mail schicken :) Gruß Armin 26 Geschrieben von: nerd , am 11.03.2011 um 07:53 klappt nicht 27 Geschrieben von: OL_O , am 10.05.2011 um 13:05 Bei mir klappt es super. (IE8, FF 4) nur der Opera 11.10 zickt wie oben beschrieben rum. 28 Geschrieben von: OL_O , am 10.05.2011 um 14:03 Mein Opera Problem habe ich damit gelöst: if (window.opera) framefenster_size = framefenster[0].contentWindow.document.documentElement.clientHeight; einfach nach der !window.opera abfrage eingefuegt. Vielen Dank für den ursprungscode! 29 Geschrieben von: Felix , am 02.06.2011 um 10:02 Wirklich sehr schönes Script, hat mir geholfen, meine Seite zu vervollständigen. Einzig und allein stören, ist die nötige Umbenennung des iframe-Tags zu "iFrame"... das geht garnicht und zerstört die Validität. Meine persönliche Abhilfe ist, das Javascript direkt zu ändern und alle korrekt geschriebenen Tags auszuwählen. var framefenster = document.getElementsByTagName("iframe"); Dann ist es auch XHTML-valide. Jedoch nicht getestet mit mehreren Iframes auf einer Seite. 30 Geschrieben von: Mario , am 18.06.2011 um 00:20 Habe einen zweiten Iframe im Programm. Wenn ich die automatische Höhe starte, dann verschwindet mein zweites Iframe. Warum?? und wohin?? 31 Geschrieben von: Armin , am 18.06.2011 um 06:05 Hm, ich vermute es hängt nicht damit zusammen, dass es der zweite iFrame ist, sondern am Inhalt des iFrames. Kannste ja mal testen, indem Du das erste iFrame auskommentiest. Meistens passieren solche Fehler, wenn im iFrame selbst irgendwas nicht valide ist. Das würde ich auch noch checken. Ist das auch okay, schreib mir doch mal ne Mail mit nem Link zur Seite, dann schaue ich mir das mal an. Gruß Armin 32 Geschrieben von: Goteach , am 29.07.2011 um 13:26 Vielen Dank für diesen tollen Tipp!!! 33 Geschrieben von: Tobias , am 13.08.2011 um 05:45 Perfekt, danach habe ich ewig gesucht. Vielen Dank für diese Lösung. 34 Geschrieben von: Dieter , am 21.08.2011 um 00:22 Hallo, dein Skript hat mir sehr gut gefallen. Finde ich auch Klasse. Aber eine Frage habe ich noch. Kann man das irgendwie so einstellen, dass wenn das iframe trotz der automatischen Höhe größe sein sollte als 600px, dass er ab dann stoppen soll und die Balken öffnen soll? Also, so dass er bis zu 600px automatisch angepasst wird, und ab den 600px soll ein Scrollbar erscheinen und soll nicht mehr länger werden? 35 Geschrieben von: Armin Vieweg , am 21.08.2011 um 22:38 Hallo Dieter, das geht recht einfach. Die folgende Zeile einfach mit einer If-Abfrage umschließen: if (framefenster_size 36 Geschrieben von: Johannes Seyffert , am 18.09.2011 um 17:49 schwarzes Kästchen auf jeder Seite!!! Hallo, das Skipt funktioniert wirklich! :-) Aber bei mir wird unter verschiedenen Browsern immer ein schwarzes Kästchen Dargestellt auf jeder Seite. Habe auf meiner Seite 3 iFrames die sich jeweils in einer Tabellenspalte befinden eingebunden. Scrollen Funktioniert wie beschrieben wunderbar, nur das schwarzes Kästchen springt je nach fülle der Informationen der einzelnen Frames in den Tabellen von einer Tabellenspalter zur anderen. Bitte mal nachsehen: http://www.johannes-seyffert.de/ Für jede Hilfe wäre ich sehr Dankbar!!! 37 Geschrieben von: Johannes Seyffert , am 18.09.2011 um 18:17 hat sich erledigt! Nach 10 Stunden Programmieren kann man wohl mal das einfachste Übersehen :-) Es lag an bgcolor vom Table. 38 Geschrieben von: Umberto , am 07.10.2011 um 07:21 Leider funktioniert diese Methode irgendwie nicht im Chrome...woran kann das liegen? 39 Geschrieben von: Alex , am 14.12.2011 um 14:00 Klappt wunderbar - sogar im IE! Vielen dank für diese Lösung Gruß Alex 40 Geschrieben von: René Steiger , am 19.12.2011 um 17:02 Google, google, google, ........ Endlich!! Danke Armin, klappt bestens beim Anzeigen von html-Seiten. Mein Problem: Beim Anzeigen einer pdf-Datei behält das iframe seine letzte berechnete Höhe. Ebenso eine in Excel ertellte und als htm-Seite abgespeicherte Datei. Gibt es eine Lösung für dieses Problem? Gruss René 41 Geschrieben von: Armin Vieweg , am 20.12.2011 um 09:39 Vermutlich nicht! Also PDF-Dateien werden ja in einem Plugin dargestellt und das kann von Browser zu Browser variieren. Wenn es Fehler mit einem Excel-Export als HTML gibt, ist meine erste Vermutung, dass das HTML nicht valide und damit standardkonform ist. Das würde ich mal prüfen, Microsoft ist nicht für ihr sauberes HTML bekannt ^^ 42 Geschrieben von: Linda , am 24.12.2011 um 11:28 Bei mir klappt es seltsamerweise nicht im IE, im Safarie und Firefox funktioniert es aber.. =( 43 Geschrieben von: Marius , am 08.01.2012 um 01:33 Hey :) Erst einmal noch ein schönes 2012! Das Script ist wirklich super und funktioniert sogar mit Wordpress :) Danke! 44 Geschrieben von: SlippyStoat , am 27.01.2012 um 09:08 Ganz nett, aber Polling ist keine schöne Lösung. Die Lösung hat mich nicht zufrieden gestellt und es gibts tatsächlich was viel eleganteres. Quelle: http://stackoverflow.com/questions/819416/adjust-width-height-of-iframe-to-fit-with-content-in-it Grüße 45 Geschrieben von: Armin Vieweg , am 27.01.2012 um 11:12 Jo, nur das mein Script die iFrame Höhe permanent aktualisiert, also auch wenn sich im iFrame Inhalte ändern (das ist ja heutzutage mit Tabs, Accordions, etc schnell passiert). Wenn man das nicht braucht, ist eine Lösung ohne Interval natürlich besser. 46 Geschrieben von: Andreas , am 18.02.2012 um 13:13 Danke, danke, danke! Das ist wirklich sehr genial! Viele Grüße aus Thüringen 47 Geschrieben von: Dominik , am 07.03.2012 um 18:48 Danke, Danke, Danke! Endlich hab ich gefunden was ich gesucht habe! Bisschen Seite anpassen - nicht das Script - und die Seite sieht aus wie gewünscht. 48 Geschrieben von: Joey , am 06.04.2012 um 10:21 Hallo, kann man das Script auch so anpassen, dass das iframe immer min. 400 px hoch ist und erst angepasst wird, wenn es größer ist als 400 px? Ich habe das Problem, dass ich auf einer Seite in dem iframe noch ein Frameset habe, das ja keinen body-Teil hat. Deswegen wird das Fenster immer zu klein angezeigt. 49 Geschrieben von: Joshua , am 03.07.2012 um 17:19 Gent nicht! Gibt nur Fehlermeldungen, weil der Inhalt NICHT ausgelesen wird, weil der Wert "null" ist! (FF13) Und überhaupt: javascript kann nix! Mit nem VB-Script mach ich sowas in 30 Sekunden... -.-