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 qu'il contient, sans utiliser de défilement.
Ajoutez ceci à votre section <head>
:
<script>
function resizeIframe(obj) {
obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px';
}
</script>
Et changez votre iframe en ceci:
<iframe src="..." frameborder="0" scrolling="no" onload="resizeIframe(this)" />
Tel que trouvé sur discussion de site .
Vous pouvez utiliser cette bibliothèque, qui redimensionne initialement correctement votre iframe et la maintient à la bonne taille en détectant chaque fois que la taille du contenu de l'iframe change (soit en vérifiant régulièrement dans un fichier setInterval
ou via MutationObserver
) et le redimensionner.
https://github.com/davidjbradshaw/iframe-resizer
Ceci fonctionne avec les mêmes iframes cross et domain.
Voici une version compacte:
<iframe src="hello.html"
onload="this.style.height=this.contentDocument.body.scrollHeight +'px';">
</iframe>
La suggestion de hjpotter92 ne fonctionne pas en safari! J'ai apporté une petite modification au script afin qu'il fonctionne également dans Safari.
La seule modification apportée consiste à réinitialiser la hauteur à 0 à chaque chargement afin de permettre à certains navigateurs de diminuer la hauteur.
Ajoutez ceci à la balise <head>
:
<script type="text/javascript">
function resizeIframe(obj){
obj.style.height = 0;
obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px';
}
</script>
Et ajoutez l'attribut onload
suivant à votre iframe, comme suit
<iframe onload='resizeIframe(this)'></iframe>
La réponse hjpotter92 fonctionne assez bien dans certains cas, mais j'ai constaté que le contenu de l'iframe était souvent pris au plus crant avec Firefox et IE, alors que tout fonctionnait bien dans Chrome.
Ce qui suit fonctionne bien pour moi et corrige le problème de découpage. Le code a été trouvé à l'adresse http://www.dyn-web.com/tutorials/iframes/height/ . J'ai apporté une légère modification pour supprimer l'attribut onload du code HTML. Placez le code suivant après le <iframe>
HTML et avant la balise de fermeture </body>
:
<script type="text/javascript">
function getDocHeight(doc) {
doc = doc || document;
// stackoverflow.com/questions/1145850/
var body = doc.body, html = doc.documentElement;
var height = Math.max( body.scrollHeight, body.offsetHeight,
html.clientHeight, html.scrollHeight, html.offsetHeight );
return height;
}
function setIframeHeight(id) {
var ifrm = document.getElementById(id);
var doc = ifrm.contentDocument? ifrm.contentDocument:
ifrm.contentWindow.document;
ifrm.style.visibility = 'hidden';
ifrm.style.height = "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 code HTML iframe:
<iframe id="ifrm" src="some-iframe-content.html"></iframe>
Notez que 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 le dyn-web page Web.
Évitez le JavaScript intégré; vous pouvez utiliser une classe:
<iframe src="..." frameborder="0" scrolling="auto" class="iframe-full-height"></iframe>
Et référencez-le avec jQuery:
$('.iframe-full-height').on('load', function(){
this.style.height=this.contentDocument.body.scrollHeight +'px';
});
la méthode . contents () de jQuery nous permet de rechercher dans les enfants immédiats de l'élément dans l'arborescence DOM.
jQuery:
$('iframe').height( $('iframe').contents().outerHeight() );
Rappelez-vous que le corps de la page à l'intérieur de l'iframe doit avoir sa hauteur
CSS:
body {
height: auto;
overflow: auto
}
Cela fonctionne pour moi (principalement).
Mettez ceci 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 l'iframe sur la hauteur de la page (pas la hauteur du contenu), lorsque la classe iframes est iframe_fullHeight
. Vous pouvez l'utiliser si le contenu est un PDF ou autre, mais vous devez définir la classe. Aussi, ne peut être utilisé que lorsque la hauteur maximale est appropriée.
Remarque: pour une raison quelconque, lorsqu'il recalcule après le redimensionnement de la fenêtre, la hauteur est incorrecte.
Essayez ceci pour IE11
<iframe name="Stack" src="http://stackoverflow.com/" style='height: 100%; width: 100%;' frameborder="0" scrolling="no" id="iframe">...</iframe>
Cela fonctionne pour moi (également avec plusieurs iframes sur une page):
$('iframe').load(function(){$(this).height($(this).contents().outerHeight());});
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'>
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')"
Je l'ai fait avec AngularJS. Angular n'a pas de charge de base, mais un module tiers a été créé. installer avec bower ci-dessous, ou le trouver ici: https://github.com/andrefarzat/ng-load
Récupère la directive ngLoad: bower install ng-load --save
Configurez votre iframe:
<iframe id="CreditReportFrame" src="about:blank" frameborder="0" scrolling="no" ng-load="resizeIframe($event)" seamless></iframe>
Fonction resizeIframe du contrôleur:
$scope.resizeIframe = function (event) {
console.log("iframe loaded!");
var iframe = event.target;
iframe.style.height = iframe.contentWindow.document.body.scrollHeight + 'px';
};
J'ai eu des problèmes dans le passé avec iframe.onload pour des iframes créés dynamiquement. Je suis donc allé avec cette approche pour définir la taille de l'iframe:
iFrame Voir
var height = $("body").outerHeight();
parent.SetIFrameHeight(height);
Vue principale
SetIFrameHeight = function(height) {
$("#iFrameWrapper").height(height);
}
(cela ne fonctionnera que si les deux vues sont dans le même domaine)