Iframe : Height à 100%

Iframe : Height à 100% - HTML/CSS - Programmation

Marsh Posté le 05-06-2009 à 18:40:08    

Bonjour à tous,  :hello:  
 
Je me penche actuellement sur le fameux "bug" de l'height à 100% de l'iframe. En gros le souci, c'est que si on met une iframe en "height:100%;", l'iframe ne s'adapte pas à la taille de la page et se limite à en gros 100px de hauteur.  
Après de longues recherches sur google, je n'ai trouvé que des solutions bancales bien que ce problème semble être un casse-tête pour beaucoup de devs.
 
Quelqu'un connaîtrait-il une solution solide à ce problème ? (solution cross-browser)
Facebook utilise une iframe pour afficher les liens externes tout en gardant en haut un petit bandeau facebook (exactement ce que je veux faire).
 
J'ai donc essayé d'adapter ce code là à ma page.
 
JS :

Code :
  1. var FramedPageController=
  2. {
  3. manuallyAdjustIframe:false,iframeLoadCount:0,iframeLoadHandler:function()
  4. {
  5.  this.iframeLoadCount++;
  6.  if(this.iframeLoadCount>2)
  7.  {
  8.   $('conteneur_general').addClass('unknown_page');this.resizeIframe();
  9.  }
  10. }
  11. ,setManualIframeAdjustment:function()
  12. {
  13.  this.manuallyAdjustIframe=true;this.resizeIframe();
  14.  Event.listen(window,'resize',bind(this,this.resizeIframe));
  15. }
  16. ,resizeIframe:function()
  17. {
  18.  var viewport=Vector2.getViewportDimensions();
  19.  var header=Vector2.getElementDimensions($('navigateur_barre'));
  20.  if(this.manuallyAdjustIframe)
  21.  {
  22.   viewport.setElementHeight($('conteneur_iframe'));
  23.   viewport.sub(header).setElementHeight($('conteneur_iframe'));
  24.  }
  25.  else
  26.  {
  27.   viewport.setElementHeight($('conteneur_general'));
  28.   bind($('conteneur_general'),'setStyle','height','100%').defer();
  29.  }
  30. }
  31. };


HTML :

Code :
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5.     <title>Apple.com</title>
  6.     <link rel="stylesheet" rev="stylesheet" href="css/navigateur.css" type="text/css" media="screen" />
  7.     <script type="text/javascript" src="js/navigateur.js"></script>
  8. </head>
  9. <body>
  10. <div id="conteneur_general">
  11. <div id="navigateur_barre">
  12.  Contenu
  13. </div>
  14. <div id="conteneur_iframe">
  15.  <iframe id="navigateur_iframe" src="http://www.apple.com/fr/" frameborder="0" scrolling="auto" onload="FramedPageController.iframeLoadHandler();"></iframe>
  16. </div>
  17. </div>
  18. </body>
  19. </html>


CSS :

Code :
  1. *
  2. {
  3. border: 0;
  4. margin: 0;
  5. padding: 0;
  6. text-decoration: none;
  7. list-style: none;
  8. }
  9. body
  10. {
  11. width:100%;
  12. height:100%;
  13. overflow:hidden;
  14. }
  15. #conteneur_general
  16. {
  17. height: 100%;
  18. width: 100%;
  19. }
  20. #navigateur_barre
  21. {
  22. height: 50px;
  23. width: 100%;
  24. }
  25. #conteneur_iframe
  26. {
  27. height: 100%;
  28. overflow: hidden;
  29. vertical-align: top;
  30. }
  31. #navigateur_iframe
  32. {
  33. width: 100%;
  34. height: 100%;
  35. }


 
Edit : Je ne sais pas si je l'ai mal adapté ou quoi, mais ça ne marche pas. En gros l'idée dans ma tête c'est avec JS trouver la hauteur intérieure de la fenêtre (ou de #conteneur_general en pixels), retirer 50px (= hauteur de ma barre en haut) et appliquer cette hauteur là à #navigateur_iframe  
après je suis parti du principe que le code de facebook aurait surement été plus réfléchi en prenant en compte tous les cas de figure mais j'arrive pas à le faire marcher :/
Bref, si quelqu'un à une idée...  :sweat:  
 
Merci d'avance :jap:


Message édité par Alekusu2 le 05-06-2009 à 19:38:02
Reply

Marsh Posté le 05-06-2009 à 18:40:08   

Reply

Marsh Posté le 05-06-2009 à 22:02:24    

Mouais, la propriété "height: 100%" est un peu tordue : pour qu'il y ait un effet, il faut que tous les éléments parents aient une hauteur fixées.
 
Dans ton exemple, la balise html n'a pas de hauteur définie, donc ça foire.
 
Edit: j'ai pas testé ça sur beaucoup de navigateur, mais j'ai le présage que ça va merder niveau compatibilité (FF3 et IE7 ont l'air correct, c'est déjà pas si mal).

Message cité 1 fois
Message édité par tpierron le 05-06-2009 à 22:05:59
Reply

Marsh Posté le 05-06-2009 à 22:23:04    

tpierron a écrit :

Mouais, la propriété "height: 100%" est un peu tordue : pour qu'il y ait un effet, il faut que tous les éléments parents aient une hauteur fixées.

 

Dans ton exemple, la balise html n'a pas de hauteur définie, donc ça foire.

 

Edit: j'ai pas testé ça sur beaucoup de navigateur, mais j'ai le présage que ça va merder niveau compatibilité (FF3 et IE7 ont l'air correct, c'est déjà pas si mal).

 

En effet sous mac aucun souci avec Safari 3, FF3 et Opera 9 :love: J'essaierai demain sous PC avec FF2 et IE6/7/8
1000 merci ! Tu m'as sauvé :love:


Message édité par Alekusu2 le 05-06-2009 à 22:24:11
Reply

Marsh Posté le 08-06-2009 à 20:49:26    

Ne peux-tu pas éviter les iframe ?
En général, c'est plutôt merdique ce truc...

Reply

Marsh Posté le 09-06-2009 à 10:48:04    

C'est complètement merdique ce truc c'est clair, je les ai évités pendant 10 ans :D
 
Mais pouvoir afficher un bandeau horizontal en haut d'un site A pendant que le visiteur surfe sur le reste de l'écran sur un site B, y a pas 50 solutions. Même facebook est passé par cette solution... :/
 
Après si tu as une idée, je suis largement preneur ^^

Reply

Marsh Posté le 10-06-2009 à 11:59:56    

Oui c'est vrai, Google l'utilise aussi...

Reply

Marsh Posté le 10-06-2009 à 16:11:20    

Je viens de regarder le code de Google pour faire ce truc justement. Et mon dieu :D
 
C'est du HTML 4 et encore, y a plein de balises qui sont ouvertes mais jamais fermées, les attributs ne sont même pas mis dans des guillemets, l'horreur :D Tout est en vrac.
 
Google devrait montrer un minimum l'exemple en terme de pérennité, d'accessibilité, normes W3C, etc... :/


Message édité par Alekusu2 le 10-06-2009 à 16:11:42
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed