Mise à jour en 2019
TL; DR: Aujourd'hui, la meilleure option est la dernière de cette réponse - flexbox. Tout le supporte bien et depuis des années. Allez-y et ne regardez pas en arrière. Le reste de cette réponse est laissé pour des raisons historiques.
L'astuce consiste à comprendre de quoi est pris le 100%. La lecture des spécifications CSS peut vous y aider.
Pour faire une histoire courte - il existe une chose telle que "contenant un bloc" - qui n'est pas nécessairement l'élément parent. En termes simples, c'est le premier élément de la hiérarchie qui a position: relative ou position: absolue. Ou l'élément corps lui-même s'il n'y a rien d'autre. Ainsi, lorsque vous dites "largeur: 100%", il vérifie la largeur du "bloc contenant" et définit la largeur de votre élément à la même taille. S'il y avait quelque chose d'autre, alors vous pourriez obtenir le contenu d'un "bloc contenant" qui est plus grand que lui-même (donc "débordant").
La hauteur fonctionne de la même manière. À une exception près. Vous ne pouvez pas obtenir la hauteur à 100% de la fenêtre du navigateur. L'élément de niveau supérieur, par rapport auquel 100% peut être calculé, est l'élément body (ou html? Pas sûr), et qui s'étire juste assez pour contenir son contenu. Spécifier la hauteur: 100% dessus n'aura aucun effet, car il n'a pas "d'élément parent" par rapport auquel mesurer 100%. La fenêtre elle-même ne compte pas. ;)
Pour que quelque chose s'étire exactement à 100% de la fenêtre, vous avez deux choix:
- Utiliser JavaScript
- N'utilisez pas DOCTYPE. Ce n'est pas une bonne pratique, mais cela met les navigateurs en "mode excentrique", dans lequel vous pouvez faire height = "100%" sur les éléments et les étirer à la taille de la fenêtre. Notez que le reste de votre page devra probablement être modifié également pour s'adapter aux modifications de DOCTYPE.
Mise à jour: je ne sais pas si je ne m'étais pas déjà trompé lorsque j'ai posté cela, mais cela est certainement obsolète maintenant. Aujourd'hui, vous pouvez le faire dans votre feuille de style: html, body { height: 100% }
elle s'étendra à l'ensemble de votre fenêtre. Même avec un DOCTYPE. min-height: 100%
pourrait également être utile, selon votre situation.
Et je ne conseillerais à personne de créer un document en mode excentrique non plus, car cela provoque beaucoup plus de maux de tête que de les résoudre. Chaque navigateur a un mode bizarrerie différent, donc rendre votre page cohérente sur tous les navigateurs devient plus difficile de deux ordres de grandeur. Utilisez un DOCTYPE. Toujours. De préférence le HTML5 - <!DOCTYPE html>
. Il est facile à retenir et fonctionne comme un charme dans tous les navigateurs, même ceux de 10 ans.
La seule exception est lorsque vous devez prendre en charge quelque chose comme IE5 ou quelque chose. Si vous y êtes, vous êtes quand même tout seul. Ces anciens navigateurs ne ressemblent en rien aux navigateurs d'aujourd'hui, et les petits conseils donnés ici vous aideront à les utiliser. Du côté positif, si vous y êtes, vous n'avez probablement qu'à prendre en charge UN type de navigateur, ce qui élimine les problèmes de compatibilité.
Bonne chance!
Mise à jour 2: Hé, ça fait longtemps! 6 ans plus tard, de nouvelles options font leur apparition. Je viens d'avoir une discussion dans les commentaires ci-dessous, voici d'autres astuces pour vous qui fonctionnent dans les navigateurs d'aujourd'hui.
Option 1 - positionnement absolu. Agréable et propre pour quand vous connaissez la hauteur précise de la première partie.
body, html {width: 100%; height: 100%; margin: 0; padding: 0}
.first-row {position: absolute;top: 0; left: 0; right: 0; height: 100px; background-color: lime;}
.second-row {position: absolute; top: 100px; left: 0; right: 0; bottom: 0; background-color: red }
.second-row iframe {display: block; width: 100%; height: 100%; border: none;}
<div class="first-row">
<p>Some text</p>
<p>And some more text</p>
</div>
<div class="second-row">
<iframe src="https://jsfiddle.net/about"></iframe>
</div>
Quelques notes - le second-row
conteneur est nécessaire car bottom: 0
et right: 0
ne fonctionne pas sur les iframes pour une raison quelconque. Quelque chose à voir avec le fait d'être un élément "remplacé". Mais width: 100%
et height: 100%
fonctionne très bien. display: block
est nécessaire car c'est un inline
élément par défaut et les espaces commencent à créer des débordements étranges sinon.
Option 2 - tableaux. Fonctionne lorsque vous ne connaissez pas la hauteur de la première pièce. Vous pouvez utiliser des <table>
balises réelles ou le faire de la manière la plus élégante avec display: table
. Je vais opter pour ce dernier car il semble être à la mode ces jours-ci.
body, html {width: 100%; height: 100%; margin: 0; padding: 0}
.row-container {display: table; empty-cells: show; border-collapse: collapse; width: 100%; height: 100%;}
.first-row {display: table-row; overflow: auto; background-color: lime;}
.second-row {display: table-row; height: 100%; background-color: red; overflow: hidden }
.second-row iframe {width: 100%; height: 100%; border: none; margin: 0; padding: 0; display: block;}
<div class="row-container">
<div class="first-row">
<p>Some text</p>
<p>And some more text</p>
</div>
<div class="second-row">
<iframe src="https://jsfiddle.net/about"></iframe>
</div>
</div>
Quelques notes - le overflow: auto
s'assure que la ligne inclut toujours tout son contenu. Sinon, les éléments flottants peuvent parfois déborder. Le height: 100%
sur la deuxième rangée s'assure qu'il se dilate autant qu'il peut en serrant la première rangée aussi petite que possible.
Option 3 - flexbox. Le plus propre de tous, mais avec un support de navigateur moins que stellaire. IE10 aura besoin de -ms-
préfixes pour les propriétés de la flexbox, et rien de moins ne le supportera pas du tout.
body, html {width: 100%; height: 100%; margin: 0; padding: 0}
.row-container {display: flex; width: 100%; height: 100%; flex-direction: column; background-color: blue; overflow: hidden;}
.first-row {background-color: lime; }
.second-row { flex-grow: 1; border: none; margin: 0; padding: 0; }
<div class="row-container">
<div class="first-row">
<p>Some text</p>
<p>And some more text</p>
</div>
<iframe src="https://jsfiddle.net/about" class="second-row"></iframe>
</div>
Quelques notes - overflow: hidden
c'est parce que l'iframe génère toujours une sorte de débordement même avec display: block
dans ce cas. Il n'est pas visible dans la vue plein écran ou dans l'éditeur d'extraits de code, mais la petite fenêtre d'aperçu dispose d'une barre de défilement supplémentaire. Aucune idée de ce que c'est, les iframes sont bizarres.
Nous utilisons un JavaScript pour résoudre ce problème; voici la source.
Remarque:
ifm
est l'ID iframepageY()
a été créé par John Resig (l'auteur de jQuery)la source
Une autre façon de le faire serait d'utiliser le
position: fixed;
nœud parent.Si je ne me trompe pas,
position: fixed;
lie l'élément à la fenêtre d'affichage, ainsi, une fois que vous avez donné ce nœudwidth: 100%;
et sesheight: 100%;
propriétés, il s'étendra sur tout l'écran. À partir de ce moment, vous pouvez mettre une<iframe>
balise à l'intérieur et l'étendre sur l'espace restant (en largeur et en hauteur) avec une simplewidth: 100%; height: 100%;
instruction CSS.Exemple de code
la source
position: fixed
à l'iframe.Voici quelques approches modernes:
Méthode 1 - Combinaison de fenêtre unités relatives /
calc()
.L'expression
calc(100vh - 30px)
représente la hauteur restante. Où100vh
est la hauteur du navigateur et l'utilisation decalc()
déplace effectivement la hauteur de l'autre élément.Exemple ici
Support pour
calc()
ici ; prise en charge des unités relatives aux fenêtres ici .Approche 2 - Approche Flexbox
Exemple ici
Définissez l'
display
élément parent commun surflex
, avecflex-direction: column
(en supposant que vous souhaitez que les éléments s'empilent les uns sur les autres). Ensuite, définissezflex-grow: 1
l'iframe
élément enfant afin qu'il remplisse l'espace restant.Étant donné que cette approche a moins de support 1 , je suggère de suivre l'approche susmentionnée.
1 Bien qu'il semble fonctionner dans Chrome / FF, il ne fonctionne pas dans IE (la première méthode fonctionne dans tous les navigateurs actuels).
la source
flexbox
option, car aveccalc
vous, vous devez connaître la quantité d'espace à déduire duvh
. Avecflexbox
un simpleflex-grow:1
fait ça.Vous pouvez le faire avec
DOCTYPE
, mais vous devez utilisertable
. Regarde ça:la source
Peut-être que cela a déjà été répondu (quelques réponses ci-dessus sont des façons "correctes" de le faire), mais je pensais que j'ajouterais aussi ma solution.
Notre iFrame est chargé dans une div, donc j'avais besoin d'autre chose que window.height. Et vu que notre projet repose déjà fortement sur jQuery, je trouve que c'est la solution la plus élégante:
Où bien sûr "#middle" est l'id du div. La seule chose supplémentaire que vous devrez faire est de rappeler ce changement de taille chaque fois que l'utilisateur redimensionne la fenêtre.
la source
Voici ce que j'ai fait. J'ai eu le même problème et j'ai fini par chercher des ressources sur le Web pendant des heures.
J'ai ajouté ceci à la section principale.
Veuillez noter que mon iframe est situé à l'intérieur de la cellule du milieu d'un tableau qui a 3 lignes et 1 colonne.
la source
Le code MichAdel fonctionne pour moi mais j'ai apporté quelques modifications mineures pour le faire fonctionner correctement.
la source
C'est vrai, vous montrez une iframe à 100% de hauteur par rapport à son conteneur: le corps.
Essaye ça:
Bien sûr, changez la hauteur du deuxième div à la hauteur souhaitée.
la source
essayez ce qui suit:
ça a marché pour moi
la source
Vous pouvez le faire avec html / css comme ceci:
la source
Nouveau en HTML5: utilisez calc (en hauteur)
la source
J'ai utilisé display: table pour résoudre un problème similaire. Cela fonctionne presque pour cela, laissant une petite barre de défilement verticale. Si vous essayez de remplir cette colonne flexible avec autre chose qu'un iframe, cela fonctionne bien (pas
Prenez le code HTML suivant
Modifiez le div externe pour utiliser display: table et assurez-vous qu'il a une largeur et une hauteur définies.
Faites de la bannière une ligne de tableau et définissez sa hauteur quelle que soit votre préférence:
Ajoutez une div supplémentaire autour de votre iframe (ou du contenu dont vous avez besoin) et faites-en une ligne de tableau avec une hauteur définie sur 100% (la définition de sa hauteur est critique si vous souhaitez intégrer une iframe pour remplir la hauteur)
Ci-dessous, un jsfiddle le montrant au travail (sans iframe car cela ne semble pas fonctionner au violon)
https://jsfiddle.net/yufceynk/1/
la source
Je pense que vous avez un problème conceptuel ici. Dire "J'ai essayé de régler la hauteur: 100% sur iframe, le résultat est assez proche mais l'iframe a essayé de remplir toute la page" , eh bien, quand "100%" n'est-il pas égal à "entier"?
Vous avez demandé à l'iframe de remplir toute la hauteur de son conteneur (qui est le corps), mais malheureusement, il a un frère au niveau du bloc dans la <div> au-dessus duquel vous avez demandé une taille de 30 pixels. Il est donc maintenant demandé au total du conteneur parent de dimensionner à 100% + 30 px> 100%! D'où les barres de défilement.
Je pense que vous voulez dire que vous souhaitez que l'iframe consomme ce qui reste comme les cadres et les cellules du tableau, c'est-à-dire height = "*". IIRC cela n'existe pas.
Malheureusement, à ma connaissance, il n'y a aucun moyen de mélanger / calculer / soustraire efficacement les unités absolues et relatives, donc je pense que vous êtes réduit à deux options:
Positionnez absolument votre div, ce qui le sortira du conteneur pour que l'iframe seul consomme sa hauteur de conteneur. Cela vous laisse cependant toutes sortes d'autres problèmes, mais peut-être que pour ce que vous faites, l'opacité ou l'alignement serait correct.
Alternativement, vous devez spécifier un% de hauteur pour le div et réduire d'autant la hauteur de l'iframe. Si la hauteur absolue est vraiment aussi importante que vous devrez l'appliquer à un élément enfant de la div à la place.
la source
Après avoir essayé la route css pendant un certain temps, j'ai fini par écrire quelque chose d'assez basique dans jQuery qui a fait le travail pour moi:
Testé dans IE8, Chrome, Firefox 3.6
la source
Cela fonctionnera avec le code mentionné ci-dessous
la source
Réponse similaire de @MichAdel, mais j'utilise JQuery et plus élégant.
iframe_id
est l'ID de la balise iframela source
Vous pouvez le faire en mesurant la taille du corps lors des événements de chargement / redimensionnement et en définissant la hauteur sur (pleine hauteur - hauteur de la bannière).
Notez qu'actuellement dans IE8 Beta2, vous ne pouvez pas faire cela sur une taille car cet événement est actuellement interrompu dans IE8 Beta2.
la source
ou vous pouvez aller à la vieille école et utiliser un jeu de cadres peut-être:
la source
Bien que je convienne que JS semble être une meilleure option, j'ai une solution de travail quelque peu CSS. L'inconvénient est que si vous devez ajouter du contenu à votre document HTML iframe fréquemment, vous devrez adapter un pourcentage de temps d'attente.
Solution:
Essayez de ne pas spécifier de hauteur pour vos DEUX documents html,
alors ne codez que ceci:
note: le div doit être votre section principale.
Cela devrait fonctionner relativement. l'iframe calcule exactement 300% de la hauteur de la fenêtre visible. Si le contenu html du 2e document (dans l'iframe) est plus petit que 3 fois la hauteur de votre navigateur, cela fonctionne. Si vous n'avez pas besoin d'ajouter fréquemment du contenu à ce document, il s'agit d'une solution permanente et vous pouvez simplement trouver votre propre% nécessaire en fonction de la hauteur de votre contenu.
Cela fonctionne car il empêche le 2ème document html (celui incorporé) d'hériter de sa hauteur du document html parent. Cela l'empêche car nous n'avons pas spécifié de hauteur pour les deux. Lorsque nous donnons un% à l'enfant, il recherche son parent, sinon, il prend sa hauteur de contenu. Et seulement si les autres conteneurs n'ont pas de hauteur, d'après ce que j'ai essayé.
la source
Le " sans couture " attribut " est une nouvelle norme visant à résoudre ce problème:
http://www.w3schools.com/tags/att_iframe_seamless.asp
Lors de l'attribution de cet attribut, il supprimera les bordures et les barres de défilement et dimensionnera l'iframe à sa taille de contenu. bien qu'il ne soit pris en charge que dans Chrome et la dernière version de Safari
en savoir plus ici: HTML5 iFrame Seamless Attribute
la source
Une solution jQuery simple
Utilisez-le dans un script à l'intérieur de la page iframed
la source
vous ne pouvez pas définir la hauteur de l'iframe en% car la hauteur du corps de votre parent n'est pas de 100%, alors définissez la hauteur du parent sur 100%, puis appliquez la hauteur de l'iframe à 100%
la source
Si vous avez accès au contenu de l'iframe qui sera chargé, vous pouvez dire à son parent de redimensionner chaque fois qu'il redimensionne.
Si vous avez plusieurs iframes sur la page, vous devrez peut-être utiliser des identifiants ou d'autres méthodes intelligentes pour améliorer .find ("iframe") afin de sélectionner la bonne.
la source
Je pense que la meilleure façon de réaliser ce scénario en utilisant la position css. définir la position par rapport à votre parent div et position: absolue à votre iframe.
pour les autres problèmes de remplissage et de marge, un jour css3 calc () est très avancé et principalement compatible avec tous les navigateurs.
vérifier calc ()
la source
Pourquoi ne pas le faire (avec un ajustement mineur pour le rembourrage / les marges du corps)
la source
-0
par+'px'
à la fin. Cela fonctionne-t-il sur mobile?