Duplicate possible:
Redimensionnement d'un iframe en fonction du conten
Je charge une iFrame et souhaite que le parent modifie automatiquement la hauteur en fonction de la hauteur du contenu de l'iFrame.
Pour résumer, toutes les pages appartiennent au même domaine. Par conséquent, je ne devrais pas rencontrer de problèmes de script intersite.
Pour tout autre élément, j'utiliserais le scrollHeight
de l'objet DOM et définirais la hauteur en conséquence. Je ne sais pas si cela fonctionnerait sur un iframe (parce qu'ils sont un peu bizarres à propos de tout) mais ça vaut vraiment le coup d'essayer.
Edit: Après avoir jeté un coup d’œil, le consensus populaire consiste à définir la hauteur depuis l’iframe à l’aide de la touche offsetHeight
:
function setHeight() {
parent.document.getElementById('the-iframe-id').style.height = document['body'].offsetHeight + 'px';
}
Et attachez-le pour qu'il soit exécuté avec l'événement onLoad
de l'iframe-body.
Je viens de passer par votre question et j'ai une solution. Mais c'est dans jQuery. C'est trop simple.
$('iframe').contents().find('body').css({"min-height": "100", "overflow" : "hidden"});
setInterval( "$('iframe').height($('iframe').contents().find('body').height() + 20)", 1 );
Voilà!
À votre santé! :)
Edit: Si vous avez un éditeur de texte enrichi basé sur la méthode iframe et non la méthode div et que vous voulez qu'il développe chaque nouvelle ligne, alors ce code fera le nécessaire.
Voici une solution simple et efficace qui fonctionne sur tous les navigateurs et avec plusieurs domaines:
Tout d'abord, cela fonctionne sur le concept que si la page html contenant l'iframe est définie sur une hauteur de 100% et que l'iframe est stylé à l'aide de CSS pour avoir une hauteur de 100%, css redimensionnera automatiquement tout pour l'adapter.
Voici le code:
<head>
<style type="text/css">
html {height:100%}
body {
margin:0;
height:100%;
overflow:hidden
}
</style>
</head>
<body>
<iframe allowtransparency=true frameborder=0 id=rf sandbox="allow-same-Origin allow-forms allow-scripts" scrolling=auto src="http://www.externaldomain.com/" style="width:100%;height:100%"></iframe>
</body>
Cette solution a fonctionné le mieux pour moi. Il utilise jQuery et l'événement ".load" de l'iframe.
Ma solution, (en utilisant jquery):
<iframe id="Iframe1" class="tabFrame" width="100%" height="100%" scrolling="no" src="http://samedomain" frameborder="0" >
</iframe>
<script type="text/javascript">
$(function () {
$('.tabFrame').load(function () {
var iframeContentWindow = this.contentWindow;
var height = iframeContentWindow.$(document).height();
this.style.height = height + 'px';
});
});
</script>
J'ai trouvé la solution de @ShripadK très utile, mais cela ne fonctionne pas s'il y a plus d'un iframe. Ma solution est:
function autoResizeIFrame() {
$('iframe').height(
function() {
return $(this).contents().find('body').height() + 20;
}
)
}
$('iframe').contents().find('body').css(
{"min-height": "100", "overflow" : "hidden"});
setTimeout(autoResizeIFrame, 2000);
setTimeout(autoResizeIFrame, 10000);
$('iframe').height($('iframe').contents().find('body').height() + 20)
définirait la hauteur de chaque image sur la même valeur, à savoir la hauteur du contenu de la première image. J'utilise donc height()
de jquery avec une fonction au lieu d'une valeur. De cette façon, les hauteurs individuelles sont calculées+ 20
Est un hack pour contourner les problèmes de barre de défilement iframe. Le nombre doit être supérieur à la taille d'une barre de défilement. Le piratage peut probablement être évité, mais en désactivant les barres de défilement pour l'iframe.setTimeout
au lieu de setInterval(..., 1)
pour réduire la charge du processeur dans mon casDans IE 5.5+, vous pouvez utiliser la propriété contentWindow:
iframe.height = iframe.contentWindow.document.scrollHeight;
Dans Netscape 6 (en supposant que firefox soit également), propriété contentDocument:
iframe.height = iframe.contentDocument.scrollHeight
En fait, le code de Patrick a également fonctionné pour moi. La bonne façon de le faire serait dans le sens suivant:
Remarque: il y a un peu de temps devant vous:
if ($.browser.msie == false) {
var h = (document.getElementById("iframeID").contentDocument.body.offsetHeight);
} else {
var h = (document.getElementById("iframeID").Document.body.scrollHeight);
}
Ma solution consiste à définir la hauteur/largeur de l'iframe sur toute taille de page source anticipée dans CSS et la propriété background
à transparent
.
Dans le jeu iframe allow-transparency
à true
et scrolling
à no
.
La seule chose visible sera le fichier source que vous utiliserez. Cela fonctionne dans IE8, Firefox 3 et Safari.
Oli a une solution qui fonctionnera pour moi. Pour mémoire, la page à l'intérieur de mon iFrame est restituée en javascript. Il me faudra donc un délai infinitésimal avant de faire rapport sur offsetHeight. Cela ressemble à quelque chose du genre:
$(document).ready(function(){
setTimeout(setHeight);
});
function setHeight() {
alert(document['body'].offsetHeight);
}
C'est la méthode la plus simple que j'ai trouvée en utilisant un prototype:
Main.html:
<html>
<head>
<script src="prototype.js"></script>
<script>
function init() {
var iframe = $(document.getElementById("iframe"));
var iframe_content = $(iframe.contentWindow.document.getElementById("iframe_content"));
var cy = iframe_content.getDimensions().height;
iframe.style.height = cy + "px";
}
</script>
</head>
<body onload="init()">
<iframe src="./content.html" id="iframe" frameBorder="0" scroll="no"></iframe>
<br>
this is the next line
</body>
</html>
content.html:
<html>
<head>
<script src="prototype.js"></script>
<style>
body {
margin: 0px;
padding: 0px;
}
</style>
</head>
<body>
<div id="iframe_content" style="max-height:200px;">
Sub content<br>
Sub content<br>
...
...
...
</div>
</body>
</html>
Cela semble fonctionner (jusqu'à présent) dans tous les principaux navigateurs.