Tengo un sitio con la siguiente estructura:
<div id="header"></div>
<div id="main">
<div id="navigation"></div>
<div id="content"></div>
</div>
<div id="footer"></div>
La navegación está a la izquierda y el contenido div está a la derecha. La información para el contenido div se extrae a través de PHP, por lo que es diferente cada vez.
¿Cómo puedo escalar la navegación verticalmente para que su altura sea la misma que la altura del div de contenido, sin importar qué página esté cargada?
display: flex; align-items: stretch;
el div # main. Y no lo useheight: 100%
para contenido div #Respuestas:
NOTA : Esta respuesta es aplicable a los navegadores heredados sin soporte para el estándar Flexbox. Para un enfoque moderno, consulte: https://stackoverflow.com/a/23300532/1155721
Le sugiero que eche un vistazo a las columnas igual altura con CSS entre navegadores y sin trucos .
Básicamente, hacer esto con CSS en una forma compatible con el navegador no es trivial (sino trivial con tablas), así que encuentre una solución preempaquetada adecuada.
Además, la respuesta varía según si desea 100% de altura o igual altura. Por lo general, es igual de altura. Si es 100% de altura, la respuesta es ligeramente diferente.
fuente
border:1px solid blue
por ejemplo, encontainer2
: el borde azul está en las dos primeras columnas, no en la segunda columna solo como hubiera esperado.display:table
Para los padres:
Debe agregar algunos prefijos, http://css-tricks.com/using-flexbox/ .
Editar: como señaló @Adam Garner, alinear elementos: estirar; no es necesario. Su uso también es para padres, no para niños. Si desea definir el estiramiento de los niños, use align-self.
fuente
align-items: center
el artículo que necesita para estirar las necesidadesalign-self: normal
Este es un tema frustrante que se trata con los diseñadores todo el tiempo. El truco es que debes establecer la altura al 100% en BODY y HTML en tu CSS.
Este código aparentemente inútil es definir al navegador lo que significa 100%. Frustrante, sí, pero es la forma más sencilla.
fuente
html { height: 100%; } body { height: 98%; }
.Encuentro que configurar las dos columnas en
display: table-cell;
lugar defloat: left;
funcionar bien.fuente
Si no le importa que el div de navegación se recorte en el caso de un div de contenido inesperadamente corto, hay al menos una manera fácil:
De lo contrario, está la técnica de columnas falsas .
fuente
fuente
usando jQuery:
fuente
Math.max()
Sería tu amigo aquí.css
función de JQuery , no puede diferenciar entre la pantalla y los medios impresos, como suele hacer cuando se usan soluciones CSS puras. Por lo tanto, puede tener problemas de impresión.Intenta hacer que el margen inferior sea del 100%.
fuente
Mira este ejemplo .
fuente
height: 100%
pero resultó que no era necesario.height : <percent>
solo funcionará si tiene todos los nodos principales con un porcentaje de altura especificado con una altura fija en píxeles, ems, etc. en el nivel superior. De esa manera, la altura caerá en cascada hasta su elemento.Puede especificar 100% a html y elementos del cuerpo como @Travis declaró anteriormente para que la altura de la página caiga en cascada a sus nodos.
fuente
Después de una larga búsqueda e intento, nada resolvió mi problema, excepto
en los niños div
y para los padres apliquen esto
Además, estoy usando bootstrap y esto no corrompió la respuesta para mí.
fuente
flex-direction: column;
para que esto funcione para mí.Según el método descrito en este artículo , he creado una solución menos dinámica:
HTML:
Menos:
fuente
Agregar
display: grid
al padrefuente
Sé que ha pasado mucho tiempo desde que se hizo la pregunta, pero encontré una solución fácil y pensé que alguien podría usarla (perdón por el pobre inglés). Aquí va:
CSS
HTML
Ejemplo simple. Tenga en cuenta que puede convertirse en capacidad de respuesta.
fuente
Mi solución:
fuente
Hay un poco de contradicción en el título de la pregunta y el contenido. El título habla de un div padre, pero la pregunta hace que parezca que desea que dos div hermanos (navegación y contenido) tengan la misma altura.
¿Desea (a) que tanto la navegación como el contenido tengan el 100% de la altura de main, o (b) desea que la navegación y el contenido tengan la misma altura?
Asumiré (b) ... si es así, no creo que pueda hacerlo dada su estructura de página actual (al menos, no con CSS puro y sin secuencias de comandos). Probablemente necesite hacer algo como:
y configure el div de contenido para que tenga un margen izquierdo del ancho del panel de navegación. De esa manera, el contenido del contenido está a la derecha de la navegación y puede configurar el div de navegación para que sea el 100% de la altura del contenido.
EDITAR: Estoy haciendo esto por completo en mi cabeza, pero probablemente también deba configurar el margen izquierdo del div de navegación en un valor negativo o establecer su izquierda absoluta en 0 para empujarlo hacia el extremo izquierdo. El problema es que hay muchas formas de lograrlo, pero no todas serán compatibles con todos los navegadores.
fuente
[Refiriéndose al código Less de Dmity en otra respuesta] ¿Supongo que esto es algún tipo de "pseudocódigo"?
Por lo que entiendo, intente usar la técnica de columnas falsas que debería ser la solución.
http://www.alistapart.com/articles/fauxcolumns/
Espero que esto ayude :)
fuente
fuente
dando
position: absolute;
al niño trabajado en mi casofuente
Utiliza CSS Flexbox
fuente
Esta respuesta ya no es ideal ya que CSS flexbox y grid se implementaron en CSS. Sin embargo, sigue siendo una solución de trabajo.
En una pantalla más pequeña, es probable que desee mantener la altura automática ya que col1, col2 y col3 se apilan entre sí.
Sin embargo, después de un punto de interrupción de consulta de medios, desea que aparezcan cols uno al lado del otro con una altura igual para todas las columnas.
1125 px es solo un ejemplo del punto de ruptura del ancho de la ventana, después del cual desea que todas las columnas tengan la misma altura.
Podría, por supuesto, establecer más puntos de interrupción si lo necesita.
fuente
Tuve el mismo problema, funcionó según la respuesta de Hakam Fostok, he creado un pequeño ejemplo, en algunos casos podría funcionar sin tener que agregar
display: flex;
yflex-direction: column;
en el contenedor principalJSFiddle
fuente
Como se mostró anteriormente, flexbox es el más fácil. p.ej.
esto alineará todos los elementos secundarios al centro dentro del elemento principal.
fuente
Desde:
http://getbootstrap.com.vn/examples/equal-height-columns/equal-height-columns.css
indica bootstrap pero no necesita bootstrap para usar esto. Contestar esta vieja pregunta, ya que esto funcionó para mí, y parece bastante fácil de implementar.
Esta fue la misma respuesta que proporcioné a esta pregunta
fuente
Aquí una demostración antigua basada en el
position: absolute
contenedor de contenido yposition: relative
contenedor principal.En cuanto a la forma moderna de hacerlo, las cajas flexibles son las mejores.
fuente
La forma más fácil de hacer esto es simularlo. A List Apart ha cubierto esto ampliamente a lo largo de los años, como en este artículo de Dan Cederholm de 2004 .
Así es como lo hago habitualmente:
Puede agregar fácilmente un encabezado a este diseño envolviendo #container en otro div, incrustando el encabezado div como # hermano del contenedor y moviendo los estilos de margen y ancho al contenedor principal. Además, el CSS debe moverse a un archivo separado y no mantenerse en línea, etc. etc. Finalmente, la clase clearfix se puede encontrar en positioniseverything .
fuente