Faire iframe régler automatiquement la hauteur selon le contenu sans utiliser scrollbar? [dupliquer]

cette question a déjà une réponse ici:

  • ajuster la largeur et la hauteur de l'iframe en fonction de son contenu 27 Réponses

par exemple:

<iframe name="Stack" src="http://stackoverflow.com/" width="740"
        frameborder="0" scrolling="no" id="iframe"> ...
</iframe>

je veux qu'il puisse ajuster sa hauteur en fonction du contenu à l'intérieur, sans utiliser défiler.

398
demandé sur David Cain 2012-04-02 15:45:38

17 réponses

ajoutez ceci à votre <head> section:

<script>
  function resizeIframe(obj) {
    obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px';
  }
</script>

et changez votre iframe pour ceci:

<iframe src="..." frameborder="0" scrolling="no" onload="resizeIframe(this)" />

Que l'on trouve sur sitepoint discussion .

532
répondu hjpotter92 2018-01-10 09:11:28

vous pouvez utiliser cette bibliothèque, qui au départ taille votre iframe correctement et le maintient également à la bonne taille en détectant chaque fois que la taille du contenu de l'iframe change (soit via la vérification régulière dans un setInterval ou via MutationObserver ) et de le redimensionner.

https://github.com/davidjbradshaw/iframe-resizer

cela fonctionne à la fois avec les iframes croisées et les Iframes du même domaine.

76
répondu user2684310 2015-04-05 20:24:37

la suggestion de hjpotter92 ne fonctionne pas en safari! J'ai fait un petit ajustement au script pour qu'il fonctionne maintenant aussi en Safari.

seul le changement fait est de remettre la hauteur à 0 sur chaque charge afin de permettre à certains navigateurs de diminuer la hauteur.

ajouter à <head> tag:

<script type="text/javascript">
  function resizeIframe(obj){
     obj.style.height = 0;
     obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px';
  }
</script>

et ajouter l'attribut onload suivant à votre iframe, comme

<iframe onload='resizeIframe(this)'></iframe>
36
répondu Allan P 2015-11-29 17:26:52

Voici une version compacte:

<iframe src="hello.html"
        onload="this.style.height=this.contentDocument.body.scrollHeight +'px';">
</iframe>
33
répondu Chong Lip Phang 2015-08-23 21:45:39

la réponse hjpotter92 fonctionne assez bien dans certains cas, mais j'ai trouvé le contenu iframe souvent obtenu bas-clipped dans Firefox & IE, tandis que fine dans le Chrome.

fonctionne bien pour moi et résout le problème de clipping. Le code a été trouvé à http://www.dyn-web.com/tutorials/iframes/height / . J'ai fait une légère modification pour enlever l'attribut onload du HTML. Placer le code suivant après le <iframe> HTML et avant la fermeture </body> tag:

<script type="text/javascript">
function getDocHeight(doc) {
    doc = doc || document;
    // /q/how-to-get-height-of-entire-document-with-javascript-63613/"10px"; // reset to minimal height ...
    // IE opt. for bing/msn needs a bit added or scrollbar appears
    ifrm.style.height = getDocHeight( doc ) + 4 + "px";
    ifrm.style.visibility = 'visible';
}

document.getElementById('ifrm').onload = function() { // Adjust the Id accordingly
    setIframeHeight(this.id);
}
</script>

votre iframe HTML:

<iframe id="ifrm" src="some-iframe-content.html"></iframe>

Note Si vous préférez inclure le Javascript dans le <head> du document, vous pouvez revenir à l'utilisation d'un attribut inline onload dans le iframe HTML, comme dans la dyn-web page web.

11
répondu Jimadine 2015-07-04 12:02:25

éviter JavaScript en ligne; vous pouvez utiliser une classe:

<iframe src="..." frameborder="0" scrolling="auto" class="iframe-full-height"></iframe>

et référence avec jQuery:

$('.iframe-full-height').on('load', function(){
    this.style.height=this.contentDocument.body.scrollHeight +'px';
});
10
répondu rybo111 2015-11-29 17:35:44

jQuery .la méthode nous permet de rechercher les enfants immédiats de l'élément dans le DOM tree.

jQuery:

$('iframe').height( $('iframe').contents().outerHeight() );

Rappelez-vous que le corps de la page intérieure de l'iframe doit avoir sa hauteur

CSS:

body {
  height: auto;
  overflow: auto
}
5
répondu Nathalia Xavier 2016-08-24 14:22:39

cela fonctionne pour moi (aussi avec plusieurs iframes sur une seule page):

$('iframe').load(function(){$(this).height($(this).contents().outerHeight());});
2
répondu user2992220 2015-05-17 06:57:08

cela fonctionne pour moi (la plupart du temps).

mettez ça au bas de votre page.

<script type="application/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">
</script>

<script type="application/javascript" src="/script/jquery.browser.js">
</script>

<script type="application/javascript" src="/script/jquery-iframe-auto-height.js">
</script>

<script type="application/javascript"> 
  jQuery('iframe').iframeAutoHeight();
  $(window).load(
      function() {
          jQuery('iframe').iframeAutoHeight();  
      }
  );

  // for when content is not html e.g. a PDF
  function setIframeHeight() {
      $('.iframe_fullHeight').each(
          function (i, item) {
              item.height = $(document).height();
          }
      );
  };

  $(document).ready( function () {
      setIframeHeight();
  });
  $(window).resize( function () {
      setIframeHeight();
  });
</script> 

la première moitié est de ??? et fonctionne quand il y a du html dans l'iframe. La seconde moitié définit iframe en hauteur de page (et non content height), quand iframes class est iframe_fullHeight . Vous pouvez l'utiliser si le contenu est un PDF ou autre, mais vous devez définir la classe. Peut également être utilisé uniquement lorsque toute la hauteur appropriée.

Note: pour une raison quelconque, quand il recalcule après redimensionnement de fenêtre, il obtient la mauvaise hauteur.

2
répondu ctrl-alt-delor 2016-01-03 17:02:47
function autoResize(id){
    var newheight;
    var newwidth;

    if(document.getElementById){
        newheight=document.getElementById(id).contentWindow.document.body.scrollHeight;
        newwidth=document.getElementById(id).contentWindow.document.body.scrollWidth;
    }

    document.getElementById(id).height=(newheight) + "px";
    document.getElementById(id).width=(newwidth) + "px"; 
}

ajoutez ceci à votre iframe: onload= " autoResize ('youriframeid') "

1
répondu Simon 2015-02-09 16:30:25
jq2('#stocks_iframe').load(function(){
var iframe_width = jq2('#stocks_iframe').contents().outerHeight() ; 
jq2('#stocks_iframe').css('height',iframe_width); });

<iframe id='stocks_iframe' style='width:100%;height:0px;' frameborder='0'>
1
répondu Айдън Бейтулов 2015-05-04 08:52:11

Essayez ceci pour IE11

<iframe name="Stack" src="http://stackoverflow.com/" style='height: 100%; width: 100%;' frameborder="0" scrolling="no" id="iframe">...</iframe>
1
répondu Lucky 2015-12-09 22:09:27

j'ai eu des problèmes dans le passé en appelant iframe.onload pour créer dynamiquement des iframes, je suis donc allé avec cette approche pour le réglage de la taille de l'iframe:

vue iFrame

var height = $("body").outerHeight();
parent.SetIFrameHeight(height);

Affichage Principal

SetIFrameHeight = function(height) {
    $("#iFrameWrapper").height(height);
}

(cela ne fonctionnera que si les deux vues sont dans le même domaine)

0
répondu Owen 2014-02-25 14:29:08

Je l'ai fait avec AngularJS. Angular n'a pas de charge ng, mais un module tiers a été fait; installez avec bower ci-dessous, ou trouvez-le ici: https://github.com/andrefarzat/ng-load

Obtenir le ngLoad directive: bower install ng-load --save

configurer votre iframe:

<iframe id="CreditReportFrame" src="about:blank" frameborder="0" scrolling="no" ng-load="resizeIframe($event)" seamless></iframe>

Contrôleur de resizeIframe de la fonction:

$scope.resizeIframe = function (event) {
    console.log("iframe loaded!");
    var iframe = event.target;
    iframe.style.height = iframe.contentWindow.document.body.scrollHeight + 'px';
};
0
répondu Charles Naccio 2015-04-05 23:06:56
<script type="text/javascript">
  function resizeIframe(obj) {
    obj.style.height = 0;
    obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px';
  }
</script>

cela ne fonctionne pas pour le chrome. Mais travailler pour firefox.

-2
répondu santoshs 2017-01-18 16:03:25

je voulais faire un iframe se comporter comme une page normale (j'avais besoin de faire une bannière plein écran à l'intérieur d'un élément iframe ), donc voici mon script:

    (function (window, undefined) {

    var frame,
        lastKnownFrameHeight = 0,
        maxFrameLoadedTries = 5,
        maxResizeCheckTries = 20;

    //Resize iframe on window resize
    addEvent(window, 'resize', resizeFrame);

    var iframeCheckInterval = window.setInterval(function () {
        maxFrameLoadedTries--;
        var frames = document.getElementsByTagName('iframe');
        if (maxFrameLoadedTries == 0 || frames.length) {
            clearInterval(iframeCheckInterval);
            frame = frames[0];
            addEvent(frame, 'load', resizeFrame);
            var resizeCheckInterval = setInterval(function () {
                resizeFrame();
                maxResizeCheckTries--;
                if (maxResizeCheckTries == 0) {
                    clearInterval(resizeCheckInterval);
                }
            }, 1000);
            resizeFrame();
        }
    }, 500);

    function resizeFrame() {
        if (frame) {
            var frameHeight = frame.contentWindow.document.body.scrollHeight;
            if (frameHeight !== lastKnownFrameHeight) {
                lastKnownFrameHeight = frameHeight;

                var viewportWidth = document.documentElement.clientWidth;
                if (document.compatMode && document.compatMode === 'BackCompat') {
                    viewportWidth = document.body.clientWidth;
                }

                frame.setAttribute('width', viewportWidth);
                frame.setAttribute('height', lastKnownFrameHeight);

                frame.style.width = viewportWidth + 'px';
                frame.style.height = frameHeight + 'px';
            }
        }
    }

    //--------------------------------------------------------------
    //  Cross-browser helpers
    //--------------------------------------------------------------

    function addEvent(elem, event, fn) {
        if (elem.addEventListener) {
            elem.addEventListener(event, fn, false);
        } else {
            elem.attachEvent("on" + event, function () {
                return (fn.call(elem, window.event));
            });
        }
    }

})(window);

les fonctions s'expliquent d'elles-mêmes et donnent lieu à des commentaires qui expliquent plus en détail leur objet.

-2
répondu Христо Панайотов 2017-07-10 21:56:39

cette option fonctionnera à 100%

<iframe id='iframe2' src="url.com" frameborder="0" style="overflow: hidden; height: 100%; width: 100%; position: absolute;" height="100%" width="100%"></iframe>
-3
répondu Vijay Chouhan 2015-05-15 10:14:47