Actualización en 2019
TL; DR: Hoy la mejor opción es la última en esta respuesta: flexbox. Todo lo soporta muy bien y lo ha sido durante años. Ve por eso y no mires atrás. El resto de esta respuesta se deja por razones históricas.
El truco es entender de qué se toma el 100%. Leer las especificaciones CSS puede ayudarte allí.
Para abreviar una larga historia, existe el "bloque de contención", que no es necesariamente el elemento padre. Simplemente dicho, es el primer elemento en la jerarquía que tiene posición: relativa o posición: absoluta. O el elemento del cuerpo en sí mismo si no hay nada más. Entonces, cuando dices "ancho: 100%", verifica el ancho del "bloque que contiene" y establece el ancho de tu elemento al mismo tamaño. Si había algo más allí, entonces podría obtener el contenido de un "bloque que contiene" que es más grande que sí mismo (por lo tanto, "desborda").
La altura funciona de la misma manera. Con una excepcion. No puede obtener la altura al 100% de la ventana del navegador. El elemento de nivel más alto, contra el cual se puede calcular el 100%, es el elemento body (o html? No estoy seguro), y se estira lo suficiente como para contener su contenido. Especificar altura: el 100% no tendrá efecto, ya que no tiene un "elemento padre" contra el cual medir el 100%. La ventana en sí misma no cuenta. ;)
Para hacer que algo se extienda exactamente al 100% de la ventana, tiene dos opciones:
- Usar JavaScript
- No uses DOCTYPE. Esta no es una buena práctica, pero pone los navegadores en "modo peculiar", en el que puede hacer height = "100%" en los elementos y los estirará al tamaño de la ventana. Tenga en cuenta que el resto de su página probablemente también tendrá que cambiarse para acomodar los cambios de DOCTYPE.
Actualización: no estoy seguro de si no estaba equivocado cuando publiqué esto, pero esto ciertamente está desactualizado ahora. Hoy puede hacer esto en su hoja de estilo: html, body { height: 100% }
y en realidad se extenderá a toda su ventana gráfica. Incluso con un DOCTYPE. min-height: 100%
También podría ser útil, dependiendo de su situación.
Y tampoco recomendaría a nadie que haga un documento en modo peculiar ya que causa muchos más dolores de cabeza que los resuelve. Cada navegador tiene un modo de peculiaridades diferente, por lo que hacer que su página se vea de manera consistente en los navegadores se vuelve dos órdenes de magnitud más difícil. Use un DOCTYPE. Siempre. Preferiblemente el HTML5 - <!DOCTYPE html>
. Es fácil de recordar y funciona de maravilla en todos los navegadores, incluso los de 10 años.
La única excepción es cuando tienes que soportar algo como IE5 o algo así. Si estás allí, entonces estás solo de todos modos. Esos navegadores antiguos no se parecen en nada a los navegadores de hoy, y los pequeños consejos que se dan aquí lo ayudarán con ellos. En el lado positivo, si estás allí, probablemente solo tengas que admitir UN tipo de navegador, que elimina los problemas de compatibilidad.
¡Buena suerte!
Actualización 2: ¡Hola, ha pasado mucho tiempo! 6 años después, nuevas opciones están en escena. Acabo de tener una discusión en los comentarios a continuación, aquí hay más trucos para usted que funcionan en los navegadores de hoy.
Opción 1 : posicionamiento absoluto. Agradable y limpio para cuando conoces la altura precisa de la primera parte.
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>
Algunas notas - la second-row
que se necesita contenedor debido bottom: 0
y right: 0
no funciona en iframes, por alguna razón. Algo que ver con ser un elemento "reemplazado". Pero width: 100%
y height: 100%
funciona bien. display: block
es necesario porque es un inline
elemento por defecto y los espacios en blanco comienzan a crear desbordamientos extraños de lo contrario.
Opción 2 - tablas. Funciona cuando no sabes la altura de la primera parte. Puede usar <table>
etiquetas reales o hacerlo de la manera más elegante display: table
. Iré por lo último porque parece estar de moda en estos días.
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>
Algunas notas: overflow: auto
se asegura de que la fila siempre incluya todo su contenido. De lo contrario, los elementos flotantes a veces pueden desbordarse. El height: 100%
en la segunda fila se asegura de que se expanda tanto como pueda apretando la primera fila lo más pequeño posible.
Opción 3 - flexbox. El más limpio de todos, pero con un soporte de navegador menos que estelar. IE10 necesitará -ms-
prefijos para las propiedades de flexbox, y cualquier cosa menos no lo admitirá en absoluto.
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>
Algunas notas: la overflow: hidden
causa es que el iframe todavía genera algún tipo de desbordamiento incluso display: block
en este caso. No es visible en la vista de pantalla completa o en el editor de fragmentos, pero la pequeña ventana de vista previa obtiene una barra de desplazamiento adicional. No tengo idea de qué es eso, los iframes son raros.
Usamos un JavaScript para resolver este problema; Aquí está la fuente.
Nota:
ifm
es la ID del iframepageY()
fue creado por John Resig (el autor de jQuery)fuente
Otra forma de hacerlo sería utilizar el
position: fixed;
nodo primario.Si no me equivoco,
position: fixed;
vincula el elemento a la ventana gráfica, por lo tanto, una vez que le dé este nodowidth: 100%;
y susheight: 100%;
propiedades, se extenderá por toda la pantalla. A partir de este momento, puede poner una<iframe>
etiqueta dentro de él y extenderlo sobre el espacio restante (tanto en ancho como en alto) con una simplewidth: 100%; height: 100%;
instrucción CSS.Código de ejemplo
fuente
position: fixed
al iframe.Aquí hay algunos enfoques modernos:
Enfoque 1 - Combinación de unidades relativas de ventana gráfica /
calc()
.La expresión
calc(100vh - 30px)
representa la altura restante. Dónde100vh
está la altura del navegador y el uso decalc()
desplaza efectivamente la altura del otro elemento.Ejemplo aquí
Apoyo por
calc()
aquí ; soporte para unidades relativas de ventana aquí .Enfoque 2: enfoque de Flexbox
Ejemplo aquí
Establezca el
display
del elemento principal común enflex
, junto conflex-direction: column
(suponiendo que desea que los elementos se apilen uno encima del otro). Luego configureflex-grow: 1
eliframe
elemento hijo para que ocupe el espacio restante.Dado que este enfoque tiene menos soporte 1 , sugeriría seguir con el enfoque mencionado anteriormente.
1 Aunque parece funcionar en Chrome / FF, no funciona en IE (el primer método funciona en todos los navegadores actuales).
fuente
flexbox
opción porque concalc
usted necesita saber la cantidad de espacio para deducir devh
. Conflexbox
un simple loflex-grow:1
hace.Puedes hacerlo
DOCTYPE
, pero tienes que usarlotable
. Mira esto:fuente
Tal vez esto ya haya sido respondido (algunas respuestas anteriores son formas "correctas" de hacerlo), pero pensé que también agregaría mi solución también.
Nuestro iFrame se carga dentro de un div, por lo tanto, necesitaba algo más que window.height. Y al ver que nuestro proyecto ya depende en gran medida de jQuery, creo que esta es la solución más elegante:
Donde, por supuesto, "#middle" es el id del div. Lo único que deberá hacer es recordar este cambio de tamaño cada vez que el usuario cambie el tamaño de la ventana.
fuente
Esto es lo que hice. Tuve el mismo problema y terminé buscando recursos en la web durante horas.
Agregué esto a la sección principal.
Tenga en cuenta que mi iframe se encuentra dentro de la celda central de una tabla que tiene 3 filas y 1 columna.
fuente
El código MichAdel funciona para mí, pero realicé algunas modificaciones menores para que funcione correctamente.
fuente
Es correcto, está mostrando un iframe con una altura del 100% con respecto a su contenedor: el cuerpo.
Prueba esto:
Por supuesto, cambie la altura del segundo div a la altura que desee.
fuente
prueba lo siguiente:
funciono para mi
fuente
Puede hacer esto con html / css de esta manera:
fuente
Nuevo en HTML5: use calc (en altura)
fuente
Usé display: table para solucionar un problema similar. Es casi funciona para este, dejando una pequeña barra de desplazamiento vertical. Si está tratando de llenar esa columna flexible con algo que no sea un iframe, funciona bien (no
Tome el siguiente HTML
Cambie el div externo para usar display: table y asegúrese de que tenga un ancho y una altura establecidos.
Convierta el banner en una fila de la tabla y establezca su altura a la que prefiera:
Agregue un div adicional alrededor de su iframe (o cualquier contenido que necesite) y conviértalo en una fila de tabla con una altura establecida al 100% (establecer su altura es fundamental si desea incrustar un iframe para llenar la altura)
A continuación se muestra un jsfiddle que lo muestra en el trabajo (sin un iframe porque no parece funcionar en el violín)
https://jsfiddle.net/yufceynk/1/
fuente
Creo que tienes un problema conceptual aquí. Para decir "Intenté establecer la altura: 100% en el iframe, el resultado está bastante cerca pero el iframe intentó llenar toda la página" , bueno, ¿cuándo "100%" no ha sido igual a "todo"?
Le ha pedido al iframe que llene toda la altura de su contenedor (que es el cuerpo) pero desafortunadamente tiene un hermano de nivel de bloque en el <div> por encima del cual ha pedido que sea 30px grande. ¡Por lo tanto, ahora se solicita que el total del contenedor principal se ajuste al 100% + 30px> 100%! De ahí las barras de desplazamiento.
Lo que creo que quiere decir es que le gustaría que el iframe consuma lo que queda como los marcos y las celdas de la tabla, es decir, altura = "*". IIRC esto no existe.
Desafortunadamente, que yo sepa, tampoco hay forma de mezclar / calcular / restar unidades absolutas y relativas, así que creo que estás reducido a dos opciones:
Coloque su div absolutamente, lo que lo sacará del contenedor para que el iframe solo consuma la altura de sus contenedores. Sin embargo, esto te deja con todo tipo de otros problemas, pero quizás por lo que estás haciendo, la opacidad o la alineación estarían bien.
Alternativamente, debe especificar un% de altura para el div y reducir la altura del iframe en esa medida. Si la altura absoluta es realmente tan importante, deberás aplicar eso a un elemento secundario del div.
fuente
Después de haber probado la ruta CSS por un tiempo, terminé escribiendo algo bastante básico en jQuery que hizo el trabajo por mí:
Probado en IE8, Chrome, Firefox 3.6
fuente
Funcionará con el código mencionado a continuación
fuente
Respuesta similar de @MichAdel, pero estoy usando JQuery y más elegante.
iframe_id
es la ID de la etiqueta iframefuente
Puede hacer esto midiendo el tamaño del cuerpo en eventos de carga / cambio de tamaño y estableciendo la altura en (altura completa - altura del banner).
Tenga en cuenta que actualmente en IE8 Beta2 no puede hacer esto de gran tamaño ya que ese evento está actualmente roto en IE8 Beta2.
fuente
o puedes ir a la vieja escuela y usar un conjunto de marcos tal vez:
fuente
Si bien estoy de acuerdo en que JS parece una mejor opción, tengo una solución de trabajo única de CSS. La desventaja es que si tiene que agregar contenido a su documento html de iframe con frecuencia, tendrá que adaptar un porcentaje de tiempo mínimo.
Solución:
Intente no especificar ninguna altura para AMBOS documentos html,
entonces solo codifique esto:
nota: el div debería ser tu sección principal.
Esto debería funcionar relativamente. el iframe calcula exactamente el 300% de la altura de la ventana visible. Si el contenido html del segundo documento (en el iframe) tiene una altura menor que 3 veces la altura de su navegador, funciona. Si no necesita agregar contenido con frecuencia a ese documento, esta es una solución permanente y podría encontrar su propio% necesario de acuerdo con la altura de su contenido.
Esto funciona porque evita que el segundo documento html (el incrustado) herede su altura del documento html principal. Lo impide porque no especificamos una altura para ambos. Cuando le damos un% al niño, busca a su padre, si no, toma su altura de contenido. Y solo si los otros contenedores no tienen alturas, por lo que probé.
fuente
El atributo " sin interrupciones " es un nuevo estándar que apunta a resolver este problema:
http://www.w3schools.com/tags/att_iframe_seamless.asp
Al asignar este atributo, eliminará los bordes y las barras de desplazamiento y ajustará el iframe a su tamaño de contenido. aunque solo es compatible con Chrome y la última versión de Safari
más sobre esto aquí: HTML5 iFrame Seamless Attribute
fuente
Una solución simple de jQuery
Use esto en un script dentro de la página iframed
fuente
no puede establecer la altura del iframe en% porque la altura de su cuerpo principal no es del 100%, por lo tanto, haga que la altura del padre sea del 100% y luego aplique la altura del iframe al 100%
fuente
Si tiene acceso al contenido del iframe que se cargará, puede decirle a su padre que cambie el tamaño cada vez que cambie el tamaño.
Si tiene más de un iframe en la página, es posible que necesite usar id u otros métodos inteligentes para mejorar .find ("iframe") para que esté seleccionando el correcto.
fuente
Creo que la mejor manera de lograr este escenario usando la posición css. establezca la posición relativa a su div principal y la posición: absoluta a su iframe.
para otros problemas de relleno y margen ahora, css3 calc () es muy avanzado y es compatible principalmente con todos los navegadores.
comprobar calc ()
fuente
¿Por qué no hacer esto (con ajustes menores para el relleno / márgenes del cuerpo)
fuente
-0
con+'px'
al final. ¿Funciona en dispositivos móviles?