Faire Iframe pour s'adapter à 100% des conteneurs restants de hauteur
Je veux concevoir une page web avec une bannière et un iframe. J'espère que l'iframe peut remplir tout le reste de la hauteur de la page et être redimensionnées automatiquement tant que le navigateur est en cours de redimensionnement. Est-il possible de le faire sans avoir à écrire de code Javascript, uniquement avec du CSS?
J'ai essayé de définir height:100%
sur iframe, le résultat est assez proche, mais l'iframe essayé de remplir toute la hauteur de la page, y compris la 30px
hauteur de la bannière élément div, je me suis donc inutile de barre de défilement verticale. Il n'est pas parfait.
Notes de mise à jour: Excusez-moi pour ne décrit pas la question, j'ai essayé CSS margin, padding attribut sur les DIV à occuper l'ensemble de la remining hauteur d'une page web avec succès, mais l'astuce ne fonctionne pas sur iframe.
HTML:
<body>
<div style="width:100%; height:30px; background-color:#cccccc;">Banner</div>
<iframe src="http: //www.google.com.tw" style="width:100%; height:100%;"></iframe>
</body>
Toute idée est apprécié.
Vous devez vous connecter pour publier un commentaire.
Mise à jour en 2019
TL;DR: aujourd'Hui, la meilleure option est la dernière dans cette réponse - flexbox. Tout le supporte très bien et a pendant des années. Aller pour cela et ne pas regarder en arrière. Le reste de cette réponse est de gauche, pour des raisons historiques.
Le truc, c'est de comprendre ce que le 100% est prise de. La lecture des spécifications CSS peut vous y aider.
Pour faire une longue histoire courte, il ya une telle chose comme "bloc contenant" - qui n'est pas nécessaire de l'élément parent. Autrement dit, c'est le premier élément de la hiérarchie qui a une position:relative ou position:absolute. Ou le corps de l'élément lui-même si il n'y a rien d'autre. Donc, quand vous dites "width: 100%", il vérifie la largeur de la "bloc contenant" et définit la largeur de votre élément de la même taille. Si il y avait quelque chose d'autre là-bas, alors vous pourriez obtenir le contenu d'un "bloc contenant" qui sont plus grand que lui-même (et donc de "déborder").
Hauteur fonctionne de la même manière.
À une exception près. Vous ne pouvez pas obtenir à hauteur de 100% de la fenêtre du navigateur. Le très haut niveau de l'élément, contre lequel à 100% peut être calculée, est le corps (ou html? pas sûr) de l'élément, et qui s'étend juste assez pour contenir son contenu. La spécification hauteur:100% sur qu'il n'aura aucun effet, car il n'a pas de "parent de l'élément" permettant de mesurer les 100%. De la fenêtre elle-même ne compte pas. 😉De faire quelque chose d'étirement exactement 100% de la fenêtre, vous avez deux choix:
Mise à jour: je ne suis pas sûr si je n'étais pas mal déjà quand j'ai posté, mais c'est certainement dépassée aujourd'hui. Aujourd'hui, vous pouvez le faire dans votre feuille de style:
html, body { height: 100% }
et il va en fait s'étirer à l'ensemble de votre fenêtre. Même avec un DOCTYPE.min-height: 100%
pourrait également être utile, en fonction de votre situation.Et je ne conseillerais à personne de faire un quirks mode document de plus, soit parce qu'elle engendre la manière plus de maux de tête que les résout eux. Chaque navigateur est différent quirks mode, de sorte que l'obtention de votre page pour rechercher de manière cohérente à travers les navigateurs devient deux ordres de grandeur plus difficile. Utiliser un DOCTYPE. Toujours. De préférence, le HTML5 un
<!DOCTYPE html>
. C'est facile à retenir et fonctionne comme un charme sur tous les navigateurs, même les 10 années précédentes.La seule exception est lorsque vous avez à l'appui de quelque chose comme IE5 ou quelque chose. Si vous êtes là, vous êtes sur votre propre, de toute façon. Ces anciens navigateurs ne sont rien comme les navigateurs d'aujourd'hui, et peu de conseils qui sont donnés ici va vous aider avec eux. Sur le côté positif, si vous êtes là, vous avez probablement juste de soutenir UN type de navigateur, qui se débarrasse des problèmes de compatibilité.
Bonne chance!
Mise à jour 2: Hey, ça faisait longtemps! 6 ans plus tard, de nouvelles options sont sur la scène. Je viens d'avoir une discussion dans les commentaires ci-dessous, voici d'autres astuces pour vous qui travaillent aujourd'hui dans les navigateurs.
Option 1 - positionnement absolu. Agréable et propre pour quand vous savez que les précis de la hauteur de la première partie.
CSS:
HTML:
Quelques notes - le
second-row
conteneur est nécessaire parce quebottom: 0
etright: 0
ne fonctionne pas sur des iframes pour une raison quelconque. Quelque chose à faire avec un "remplacé" élément. Maiswidth: 100%
etheight: 100%
fonctionne très bien.display: block
est nécessaire parce que c'est uninline
élément par défaut et espace commence à créer bizarre débordements autrement.Option 2 - tables. Si vous ne connaissez pas la hauteur de la première partie. Vous pouvez utiliser soit réelle
<table>
de tags ou de le faire de la façon élégante avecdisplay: table
. Je vais aller pour la dernière parce qu'elle semble être à la mode ces jours.CSS:
HTML:
Quelques notes - le
overflow: auto
permet de s'assurer que la ligne comprend toujours tout de son contenu. Sinon éléments flottants peuvent parfois déborder. Leheight: 100%
sur la deuxième ligne permet de s'assurer qu'il se développe autant qu'il peut en serrant la première ligne aussi petit qu'il obtient.Option 3 - flexbox. Le plus propre de tous, mais avec une moins que stellaire prise en charge du navigateur. IE10 aurez besoin
-ms-
préfixes pour la flexbox propriétés, et rien de moins ne soutiendra pas du tout.CSS:
HTML:
Quelques notes - le
overflow: hidden
est parce que l'iframe génère toujours une sorte de dépassement de même avecdisplay: block
dans ce cas. Il n'est pas visible dans la vue plein écran ou l'extrait de l'éditeur, mais la petite fenêtre d'aperçu obtient un supplément de barre de défilement. Aucune idée de ce que c'est, les iframes sont bizarres.display:table-layout
, mais vous aurez juste remplacer une étiquette de soupe avec un autre, parce que toutes les balises pour les tableaux/lignes/cellules seront encore nécessaires. Là encore, ces dispositions sont assez rares, et dans mon expérience, 90% des cas peuvent être résolus sans avoir recours à des tables.<nav><ul><li>
serait commun. De cette façon, vous êtes à l'aide de votre marque jusqu'à correctement marquer le contenu et le css pour tirer dans les propriétés d'affichage que vous avez besoin, plutôt que de piratage d'une table dans le mark-up de sorte que vous pouvez bénéficier de l'affichage des effets secondaires. C'est de la sémantique, accessible balisage, la séparation des préoccupations et de l'unique concepteur satisfaits<nav><ul><li>
. Je ne vois pas tout ce que vous avez gagné. C'est toujours un tableau, par un autre nom.<a>
et à l'aide de CSS pour le faire fonctionner comme<input type="text">
; ou modification d'un<img>
à fonctionner comme un<form>
, etc. Pensez à la confusion, ce qui permettrait de créer si quelqu'un pouvait le faire avec les CSS. Cettedisplay:table-cell
est la même chose. Je ne sais pas pourquoi il a été ajouté à CSS comme ça, mais je n'aime pas la capacité de redéfinir ce que la balise ne juste en CSS. L'apparence, la mise en page - oui. Mais pas de la fonctionnalité.action: post;
aurait tort; la chose est cependant, que les tables n'ont aucune fonctionnalité. Entrées et Que les deux ont des fonctionnalités et agissent comme des balises de marquage: une entrée actes dans le cadre d'un poteau; un rendu d'un lien hypertexte; mais une table ne fait rien, c'est juste de mark-up. En fait, Comme les Entrées et les deux ont des styles attachée trop, nous en débarrasser à l'aide de réinitialisation.css habituellement. Ce que vous êtes suggère, c'est un peu comme à l'aide d'un Un pour marquer le texte parce que vous souhaitez qu'il soit par défaut (bleu). Les propriétés d'affichage d'un tableau appartenant à la section de code qui définit la façon dont le site a l'air.display: table-head-group
qui en fait imprimer sur chaque page. N'est-ce pas de fonctionnalités supplémentaires, pas seulement de la mise en page?iframe
, malheureusement.body, html, iframe {width: 100%; height: 100%; border: none; padding: 0; margin: 0}
- et vous avez une pleine page de l'iframe. Ce qui ne fonctionne pas pour vous?<table>
oudisplay: table-row
qui permet un redimensionnement dynamique au prix d'un peu de performance. De toute façon, l'idée de base dans tous les d'entre eux sont - créer certains wrapper éléments qui s'étendent de la façon dont vous avez besoin, et ensuite la position de l'iframe à l'intérieur avecwidth: 100%; height: 100%; margin: 0; padding: 0; border: none
.<div>
s tables et de les faire s'étirer en tant que de besoin. Leoverflow:auto
sur la première ligne permet de s'assurer qu'il sera toujours étirer à son contenu. Leheight: 100%
sur la deuxième ligne signifie qu'il va s'étirer de tout ce qui est à gauche après la première ligne. Et ledisplay:block
sur le<iframe>
est parce que par défaut c'estinline
et donc de l'espace commence à créer bizarre débordements.-ms-
préfixe et IE9 ne le supporte pas du tout. Autres que que c'est génial.overflow
s ne sont pas nécessaires. Mais vérifiez par vous-même - aujourd'hui, j'ai moi-même appris queiframe
s sont beaucoup plus pointilleux que cela puisse paraître à première vue.overflows
peut être retirée avec le tout fonctionne à merveille avec presque pas de css: jsfiddle.net/dmitri14/1uqh3zgx/3Nous utilisons un JavaScript pour résoudre ce problème, voici la source.
Remarque:
ifm
est l'iframe IDpageY()
a été créé par John Resig (l'auteur de jQuery)Une autre façon de faire serait d'utiliser le
position: fixed;
sur le nœud parent.Si je ne me trompe pas,
position: fixed;
liens de l'élément de fenêtre d'affichage, ainsi, une fois que vous donnez à ce nœudwidth: 100%;
etheight: 100%;
propriétés, il s'étendra sur tout l'écran. À partir de ce point, vous pouvez mettre<iframe>
balise à l'intérieur d'elle et s'étendent sur l'espace restant (à la fois en largeur et en hauteur) avec de simpleswidth: 100%; height: 100%;
instruction CSS.Exemple de code
CSS:
HTML:
position: fixed
de l'iframe.Vous pouvez le faire avec
DOCTYPE
, mais vous devez utiliser lestable
. Check this out:Ici sont quelques approches modernes:
Approche 1 - Combinaison de fenêtre d'affichage des unités relatives /
calc()
.L'expression
calc(100vh - 30px)
représente le reste de la hauteur. Où100vh
est la hauteur du navigateur et de l'utilisation decalc()
efficacement déplace la hauteur de l'autre élément.Exemple
CSS:
HTML:
Soutien pour
calc()
ici; le soutien aux fenêtre d'affichage des unités relatives ici.Approche 2 - Flexbox approche
Exemple
Définir la
display
de la commune de parent de l'élément deflex
, avecflex-direction: column
(en supposant que vous souhaitez utiliser pour les éléments de la pile sur le dessus les uns des autres). Puis définissezflex-grow: 1
sur l'enfantiframe
élément pour remplir l'espace restant.CSS:
HTML:
Depuis, cette approche a moins de soutien1, je vous conseille d'aller avec cette démarche.
1Mais il semble que cela fonctionne dans Chrome/FF, il ne fonctionne pas sous IE (la première méthode fonctionne dans tous les navigateurs).
flexbox
option, car aveccalc
vous besoin de connaître la quantité d'espace à déduire de lavh
. Avecflexbox
un simpleflex-grow:1
t-il.Peut-être que cela a déjà répondu (quelques réponses ci-dessus sont "correctes" façons de le faire), mais je pensais que je voudrais juste ajouter ma solution.
Notre iFrame est chargé à l'intérieur d'un div, donc j'ai besoin de quelque chose d'autre alors la fenêtre.hauteur de. Et de voir notre projet s'appuie déjà lourdement sur jQuery, j'ai trouvé que cela soit la solution la plus élégante:
Où bien sûr "#middle" est l'id de la div. La seule petite chose que vous devez faire est de rappeler ce changement de taille lorsque l'utilisateur redimensionne la fenêtre.
Voici ce que j'ai fait. J'ai eu le même problème et a terminé la recherche sur le web pour les ressources pendant des heures.
J'ai ajouté ceci à la tête de la section.
Veuillez noter que mon iframe est situé à l'intérieur de la cellule du milieu d'un tableau de 3 lignes et 1 colonne.
MichAdel code fonctionne pour moi, mais j'ai fait quelques modifications mineures à le faire fonctionner correctement.
essayez ce qui suit:
il a travaillé pour moi
C'est bon, vous montrez un iframe avec 100% de la hauteur de respect à son conteneur: le corps.
Essayez ceci:
Bien sûr, de changer la hauteur de la deuxième div à la hauteur que vous voulez.
Vous pouvez le faire en html/css comme ceci:
Nouveau en HTML5: Utiliser calc (sur la hauteur)
J'ai utilisé display:table pour résoudre un problème similaire. Il presque travaille pour cela en laissant une petite barre de défilement verticale. Si vous essayez de remplir ce flexible colonne avec autre chose qu'un iframe, il fonctionne très bien (pas
Prendre le code HTML suivant
Changer la div extérieure à utiliser display:table et de s'assurer qu'il a une largeur et une hauteur définie.
Faire la bannière d'une table-row et réglez sa hauteur à ce que votre préférence est:
Ajouter une div autour de votre iframe (ou le contenu que vous avez besoin) et en faire une table-row avec la hauteur fixée à 100% (réglage de sa hauteur est essentiel si vous souhaitez intégrer une iframe pour remplir la hauteur)
Ci-dessous est un jsfiddle montrant à l'œuvre (sans iframe parce que cela ne semble pas fonctionner dans le violon)
https://jsfiddle.net/yufceynk/1/
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 essayé de remplir la page entière", eh bien, quand a "100%" pas été à la hauteur de "tout"?
Vous avez demandé l'iframe pour remplir la totalité de la hauteur de son conteneur (qui est le corps), mais malheureusement, il a un bloc de niveau de la fratrie dans le <div> au-dessus de qui vous avez demandé d'être 30px grand. De sorte que le conteneur parent total est maintenant posée à la taille à 100% + 30px > 100%! Donc les barres de défilement.
Ce que je pense que vous dire que vous souhaiteriez que l'iframe à consommer ce qui est à gauche comme les cadres et les cellules du tableau peut, c'est à dire height="*". IIRC ce qui n'existe pas.
Malheureusement, à ma connaissance, il n'existe pas de moyen efficace pour mélanger/calculer/soustraire absolue et relative des unités non plus, donc je pense que vous êtes réduit à deux options:
Absolument position de votre div, qui
va le prendre hors du récipient,
l'iframe seront les seuls à consommer de l'
conteneurs de hauteur. Cela vous laisse
avec toutes sortes d'autres problèmes
bien, mais peut-être que ce que vous êtes
faire de l'opacité ou l'alignement serait
ok.
Sinon, vous devez spécifier un
% de la hauteur de la div et de réduire la
hauteur de l'iframe par beaucoup.
Si la hauteur absolue est vraiment
importantes que vous aurez besoin d'appliquer
qui à un élément enfant de l'élément div
au lieu de cela.
Avoir essayé le css route pendant un certain temps, j'ai fini par écrire quelque chose assez simple en jQuery qui fait le travail pour moi:
Testé avec IE8, Chrome, Firefox 3.6
Il travaillera avec mentionnées ci-dessous code
Similaire réponse de @MichAdel, mais je suis en utilisant JQuery et plus élégant.
iframe_id
est l'ID de la balise iframeVous pouvez le faire par la mesure de la taille du corps de la charge/événements de redimensionnement et le réglage de la hauteur de la (pleine hauteur - hauteur de la bannière).
Noter qu'actuellement, dans IE8 Bêta 2 vous ne pouvez pas faire ce onresize que cet événement est actuellement cassé dans IE8 Bêta 2.
ou vous pouvez aller à la vieille école et de l'utilisation d'un jeu de cadres peut-être:
Alors que je suis d'accord JS semble une meilleure option, j'ai un peu de CSS seule solution de travail. L'inconvénient, c'est que si vous devez ajouter du contenu à votre iframe document html fréquemment, vous devrez adapter un pourcentage dans le temps.
Solution:
Essayer de ne pas spécifier la hauteur de vos documents html,
alors seulement ce code:
remarque: la div doit être votre principal la section.
Cela devrait relativement de travail. l'iframe ne calcule précisément de 300% de la fenêtre visible de la hauteur. Si vous contenu html à partir de la 2e document (dans l'iframe) est plus petit en hauteur de 3 fois votre navigateur hauteur, il fonctionne. Si vous n'avez pas besoin d'ajouter du contenu fréquemment pour que ce document est une solution permanente, et vous pourriez juste trouver votre propre % nécessaires selon votre contenu à la hauteur.
Cela fonctionne, car elle empêche la 2ème html document (embed) pour hériter de sa hauteur de frome le parent document html. Il la prévient que nous n'avons pas spécifier une hauteur de deux d'entre eux. Lorsque l'on donne un % à l'enfant regarde à son parent, si pas, il prend son contenu à la hauteur. Et seulement si les autres récipients ne sont pas donnés hauteurs, de ce que j'ai essayé.
La "transparente" attribut est une nouvelle norme visant à résoudre ce problème:
http://www.w3schools.com/tags/att_iframe_seamless.asp
Lors de l'affectation de cet attribut, il va supprimer les frontières et les barres de défilement et de la taille de l'iframe pour son taille du contenu.
si c'est uniquement pris en charge en Chrome et dernier Safari
plus à ce sujet ici:
HTML5 iFrame Transparente Attribut
Un simple jQuery solution
L'utiliser dans un script à l'intérieur de la iframed page
tu ne peux pas régler la hauteur de l'iframe en % parce que votre parent hauteur de corps n'est pas à 100%, afin de rendre le parent hauteur de 100% et ensuite appliquer iframe hauteur de 100%
Si vous avez accès au contenu de l'iframe qui sera chargé, vous pouvez dire à ses parents pour redimensionner chaque fois qu'il change..
Si vous avez plus d'un iframe sur la page, vous pouvez avoir besoin d'utiliser des id ou d'autres intelligent méthodes pour améliorer .find("iframe"), de sorte que vous choisissez la bonne.
Je pense que le meilleur moyen d'atteindre ce scénario à l'aide de css position. jeu de position par rapport à votre div parent et position:absolute pour votre iframe.
CSS:
HTML:
pour d'autres rembourrage et de la marge question maintenant un jours css3 calc() est très avancé et surtout compatible avec tous les navigateurs ainsi.
vérifier calc()
Pourquoi ne pas le faire (avec ajustement mineur pour le corps de rembourrage/marges)
-0
avec+'px'
à la fin. Fonctionne-t-il mobile?