Estoy tratando de crear algunas clases CSS reutilizables para obtener más consistencia y menos desorden en mi sitio, y estoy atascado en tratar de estandarizar una cosa que uso con frecuencia.
Tengo un contenedor para el <div>
que no quiero establecer la altura (porque variará dependiendo de en qué parte del sitio se encuentre), y dentro de él hay un encabezado <div>
, y luego una lista desordenada de elementos, todo con CSS aplicado a ellos.
Se parece mucho a esto:
Quiero que la lista desordenada ocupe el espacio restante en el contenedor <div>
, sabiendo que el encabezado <div>
es 18px
alto. Simplemente no sé cómo especificar la altura de la lista como "el resultado de 100%
menos 18px
".
He visto esta pregunta en un par de contextos más sobre SO, pero pensé que valdría la pena volver a preguntar por mi caso particular. ¿Alguien tiene algún consejo en esta situación?
Respuestas:
Me doy cuenta de que esta es una publicación antigua, pero dado que no se ha sugerido, vale la pena mencionar que si está escribiendo para navegadores compatibles con CSS3, puede usar
calc
:Vale la pena señalar que no todos los navegadores actualmente admiten la función estándar CSS3 calc (), por lo que puede ser necesario implementar las versiones específicas de la función del navegador como las siguientes:
fuente
lessc --strict-math=on
fin de no evaluar la expresión dentro decalc
- solo un problema que enfrenté y pasé mucho tiempo (a partir de Less 2.0.0)100%-18px
,100%- 18px
y100% -18px
no funcionó en los navegadores que he probado con.Para un enfoque un poco diferente, podría usar algo como esto en la lista:
Esto funciona siempre que el contenedor principal tenga
position: relative;
fuente
position: relative;
me estaba haciendo tropezar.absolute
en el contenedor para niños, no puede serrelative
.absolute
), y también debe configurarse a una altura del 100%.Yo uso Jquery para esto
luego ato el cambio de tamaño de la ventana para recalcularlo cada vez que se cambia el tamaño de la ventana del navegador (si el tamaño del contenedor cambia con el cambio de tamaño de la ventana)
fuente
No defina la altura como un porcentaje, solo configure
top=0
ybottom=0
, de esta manera:fuente
height:100%
ydisplay:block
. De lo contrario, sería una solución muy elegante. Curiosamente,margin:auto
tampoco puede centrar un objeto de ancho fijo verticalmente, a pesar de que funciona bien horizontalmente.Suponiendo una altura de encabezado de 17 px
Lista css:
Encabezado css:
fuente
ul { margin-top: -17px; }
overflow:hidden;
en el elemento contenedoroverflow:auto;
en el elemento deseado.¡Funcionó para mí!
fuente
calc()
centrarlo en tiempo de ejecución. Pero para muchos casos esto no debería ser un problema. Otra cosa a tener en cuenta es que el uso de muchos valores negativos para márgenes, relleno y compensaciones puede causar confusión al depurar el código más adelante, así que trate de simplificar las cosas.Prueba el tamaño de la caja. Para la lista:
Para el encabezado:
Por supuesto, el contenedor principal debe tener algo como:
fuente
Otra forma de lograr el mismo objetivo: cajas flexibles . Convierta el contenedor en una caja flexible de columna, y luego tendrá toda la libertad para permitir que algunos elementos tengan un tamaño fijo (comportamiento predeterminado) o para rellenar / reducir el espacio del contenedor (con flex-grow: 1 y flex- encogimiento: 1).
Consulte https://jsfiddle.net/2Lmodwxk/ (intente extender o reducir la ventana para notar el efecto)
Nota: también puede usar la propiedad abreviada:
fuente
Intenté algunas de las otras respuestas, y ninguna de ellas funcionó como yo quería. Nuestra situación era muy similar cuando teníamos un encabezado de ventana y la ventana era redimensionable con imágenes en el cuerpo de la ventana. Queríamos bloquear la relación de aspecto del cambio de tamaño sin necesidad de agregar cálculos para tener en cuenta el tamaño fijo del encabezado y aún así tener la imagen llena el cuerpo de la ventana.
A continuación, creé un fragmento muy simple que muestra lo que terminamos haciendo que parece funcionar bien para nuestra situación y debería ser compatible en la mayoría de los navegadores.
En nuestro elemento de ventana agregamos un margen de 20px que contribuye al posicionamiento en relación con otros elementos en la pantalla, pero no contribuye al "tamaño" de la ventana. El encabezado de la ventana se coloca absolutamente (lo que lo elimina del flujo de otros elementos, por lo que no hará que otros elementos como la lista desordenada se desplacen) y su parte superior se coloca -20px, lo que coloca el encabezado dentro del margen de la ventana. Finalmente, nuestro elemento ul se agrega a la ventana, y la altura se puede establecer al 100%, lo que hará que llene el cuerpo de la ventana (excluyendo el margen).
fuente
Gracias, resolví la mía con tu ayuda, ajustándola un poco ya que quiero un div 100% de ancho 100% de altura (menos altura de una barra inferior) y sin desplazamiento en el cuerpo (sin piratear / ocultar barras de desplazamiento).
Para CSS:
Para HTML:
Eso funcionó, oh sí, puse un valor un poco mejor en div.ajustada para la altura de la barra inferior que para la inferior, de lo contrario aparece la barra de desplazamiento vertical, ajusté el valor más cercano.
Esa diferencia se debe a que uno de los elementos en el área dinámica es agregar un agujero inferior adicional del que no sé cómo deshacerme ... es una etiqueta de video (HTML5), tenga en cuenta que puse esa etiqueta de video con este CSS ( así que no hay razón para que haga un agujero inferior, pero lo hace):
El objetivo: tener un video que tome el 100% del navegador (y cambie de tamaño dinámicamente cuando se cambia el tamaño del navegador, pero sin alterar la relación de aspecto) menos un espacio inferior que utilizo para un div con algunos textos, botones, etc. (y validadores w3c y css, por supuesto).
EDITAR: Encontré la razón, la etiqueta de video es como texto, no un elemento de bloque, así que lo arreglé con este CSS:
Tenga
display:block;
en cuenta la etiqueta de video.fuente
No estoy seguro de si esto funciona en su situación particular, pero he encontrado que el relleno en el div interno empujará el contenido dentro de un div si el div que lo contiene es de un tamaño fijo. Tendría que flotar o posicionar absolutamente su elemento de encabezado, pero de lo contrario, no he intentado esto para divs de tamaño variable.
fuente