iFrame mit automatischer Größenanpassung

Für die Einbindung eines Formulares möchte ich gerne ein iframe in einem Artikel einbinden, welches je nach angezeigtem Inhalt die Höhe verändert.

Bei einem ersten Versuch konnte ich fast erfolgreich die folgende Lösung von sfxonline.de umsetzen:

Nach dem -Tag folgenden Code auf der Ursprungsseite einbinden:

<body onLoad="resizeParent();">
  
<script type="text/javascript">
  function resizeParent() {
    var height = document.getElementsByTagName("html")[0].scrollHeight;
    window.parent.postMessage(["setIframeHeight", height], "*");
  }
</script>

</body>

Danach in der CMS-Seite das iframe wie folgt eingebunden:

<iframe id="superFrame" src="..." style="width: 100%; border: none;" onload="resizeIframe(this)" scrolling="no"></iframe>
<script type="text/javascript">
  function resizeIframe(iframe) {
    if(iframe) {
      iframe.height = '';
      iframe.height = iframe.contentWindow.document.body.scrollHeight + 'px';
    }   
  }
</script>  

Allerdings wird einer Größenänderung des Formular nach dem auswählen der Dateien für den upload der Inhalt etwas länger und die automatische Größenänderung des iframe spielt dann nicht mit,sodass die Schaltfläche zum senden hinter dem Footer verschwindet.

Eine 2. mögliche Lösung mit einer selbstständigen Abfrage findet sich auf iFrame-Höhe an dessen Inhalt automatisch anpassen v2 - Professor Web - Das Webdesigner Portal & Blog

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

Durch den Abfrageintervall von 400ms sollte demnach regelmäßig die Größe auf den Inhalt anpassen, tut es aber nicht.

Steht smarty dem ganzen vielleicht doch im Weg, oder was kann ich ändern um die Größenanpassung erfolgreich umzusetzen?

Nein, das Problem ist nicht Smarty.

Für iframes gibt es neben der Höhe und Breite noch das Attribute scrolling was für ein Scroll-Effekt sorgt. Damit falls der Inhalt z.B. Länger als die Höhe wird ein Scrollbalken angezeigt wird.

Weitere Infos findest unter HTML | <iframe> scrolling Attribute - GeeksforGeeks

In Deinem Beispiel

<iframe id="superFrame" src="..." style="width: 100%; border: none;" onload="resizeIframe(this)" scrolling="no"></iframe>

könntest Du z.B. eine Höhe definieren und sagen, wenn der Inhalt über die Höhe hinaus geht ein Scroll-Balken angezeigt werden soll:

<iframe id="superFrame" src="..." height="300" width="400" scrolling="yes"></iframe>

Vielleicht hilft Dir dies weiter um Deine Anforderung besser umzusetzen.

Ja, die Variante mit dem Scrollbalken ist mir bekannt. Allerdings ziehe ich eine automatische Größenänderung vor, da es m. E. nach die Usability verbessert und viel smarter ist.
Hast du eine Idee wie man dies umsetzen könnte?

Vielen Dank für die Hinweise.

Ein Blick auf die Codebeispiele hat mir einen kleinen aber leider recht wirkungsreichen Tippfehler aufmerksam gemacht.

Ich habe für mich jetzt für die 2. Möglichkeit mit der automatischen Größenänderung angewendet. Allerdings ist der Abfrageintervall von 400ms recht groß. Bei meinem Formular hatte es gedauert, bis eine Größenänderung von etwa 10cm auf dem Bildschirm “abgearbeitet” war. Der Intervall rduziert auf 4 ms lässt das Ganze dann schon besser aussehen.

This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.