¿Cómo puedo crear cuadros de igual ancho/alto que se ajusten al ancho de la pantalla? [duplicate]

7 minutos de lectura

Avatar de usuario de Kevin
Kevin

Estoy tratando de construir un sitio web que tenga muchos cuadros que tengan el mismo ancho y alto. Por ejemplo, tengo una página que tiene dos cuadros del mismo tamaño uno al lado del otro.

La solución simple fue establecer el ancho y la altura en 50vw. Esto funciona muy bien hasta que hay una barra de desplazamiento. He buscado en Google durante horas y no puedo entender por qué diablos vw y vh incluirían las barras de desplazamiento como parte de la ventana gráfica.

Aquí hay una muestra de mi problema

body {
    margin: 0;
    padding: 0;
}

.container {
    width: 100vw;
}

.box {
    float: left;
    width: 50vw;
    height: 50vw;
}

.red {
    background-color: red;
}

.green {
    background-color: green;
}

.lotta-content {
    height: 10000px;
}
<div class="container">
    <div class="box red"></div>
    <div class="box green"></div>
</div>
<div class="lotta-content"></div>

Observe la barra de desplazamiento horizontal no deseada.

Una posible solución sería usar porcentajes para los anchos, pero vw para la altura, pero nunca será una caja perfecta que no es lo peor del mundo, pero tampoco es ideal. Aquí hay una muestra:

body {
    margin: 0;
    padding: 0;
}

.container {
    width: 100%;
}

.box {
    float: left;
    width: 50%;
    height: 50vw;
}

.red {
    background-color: red;
}

.green {
    background-color: green;   
}

.lotta-content {
    height: 10000px;   
}
}
<div class="container">
    <div class="box red"></div>
    <div class="box green"></div>
</div>
<div class="lotta-content"></div>

¿Por qué vw/vh incluye barras de desplazamiento como parte de la ventana gráfica? ¿Existe una solución mejor que la mía? Estoy buscando una solución CSS pura. Prefiero no tener JavaScript.

  • ¿Tienes incluido en head?

    – Dachi

    10 de abril de 2015 a las 1:14

  • @Dachi Eso no hará la diferencia.

    –Josh Crozier

    10 de abril de 2015 a las 1:14

  • w3.org/TR/css3-values/#viewport-relative-lengths dice: “Cuando el valor de ‘overflow’ en el elemento raíz es ‘auto’, se supone que no existen barras de desplazamiento”. overflow: auto es el valor predeterminado en el elemento raíz. Creo que se tomó la decisión de resolver el siguiente problema, un bucle infinito: el “ciclo de dependencia” de “la presencia o ausencia de la barra de desplazamiento según los valores de las unidades de la ventana gráfica”

    – mems

    26 de junio de 2015 a las 15:54

  • @Dachi Todavía es bueno incluir aunque

    – Tristán Delantero

    30 de abril de 2021 a las 2:39

Avatar de usuario de ZJR
ZJR

Una solución alternativa simple (simplista) es mantener la barra de desplazamiento siempre alrededor y solucionarlo.

html,body {margin:0;padding:0}
html{overflow-y:scroll}

(usar overflow-x para un diseño que utiliza vh)

  • Desafortunadamente, hacer que la barra de desplazamiento esté siempre ahí no soluciona el problema. 100vw, ya sea que la barra de desplazamiento esté visible o no, no cambia el valor final real de 100vw. Cada navegador también maneja las barras de desplazamiento de manera diferente. Safari y otros navegadores Mac OS X los superponen, Edge y creo que los navegadores IE más recientes también los superponen. Mientras que algunos realmente ocuparán espacio en la ventana gráfica y moverán su contenido. Pero gracias por la sugerencia y comparto tu frustración.

    –Kevin

    11 de octubre de 2015 a las 1:21


  • Deberían hacer un vw2 que tiene barras de desplazamiento excluidas ahhha!

    – miguel

    24 de agosto de 2016 a las 16:16


  • +1 por la frustración. Acabo de descubrir esto también y rompe por completo mi diseño cuando hay una barra de desplazamiento. Afortunadamente, mi diseño era tal que podía reemplazar calc(100vw - 50px) con calc(100% - 50px)pero desafortunadamente usar porcentajes es una solución muy parcial en comparación con la hasta ahora sólida como una roca vw unidades: ya no son tan sólidas como una roca… 🙁 Sin embargo, en una nota más práctica, ¿quizás lo correcto sería presentar un informe de relaciones públicas o error o algo así?

    – Gilad Barner

    30/10/2016 a las 14:52


  • El contenido dentro del div que tiene vh y vw no puede ser verdaderamente centralizado. Esto es tan extraño.

    usuario7075574

    8 de abril de 2019 a las 6:39

  • Enlace a meta: meta.stackoverflow.com/questions/425340

    – El maestro

    25 de junio a las 16:00

Avatar de usuario de Shikkediel
Shikkediel

Sería conveniente si las unidades de ventana gráfica no incluir causar barras de desplazamiento, pero es el tamaño de visualización (pantalla) después de todo. Sin embargo, eche un vistazo a esta solución con un pseudo elemento:

http://www.mademyday.de/css-height-equals-width-with-pure-css.html

Hace un cuadrado en tu ejemplo también:

https://jsfiddle.net/3z887swo/4/

.box {
    float: left;
    width: 50%;
}

.box::before {
    content: "";
    display: block;
    padding-top: 100%;
}

Editar: si alguien se pregunta por qué funciona esto (el relleno vertical responde al ancho del elemento original) … así es como se define en la especificación:

El porcentaje se calcula con respecto al ancho del bloque contenedor de la caja generada, incluso para ‘padding-top’ y ‘padding-bottom’.

http://www.w3.org/TR/CSS2/box.html#padding-properties


Después de encontrar mi propia respuesta, creo que necesitaba un poco de refinamiento. La ambigüedad semántica es la razón por la que reemplacé la palabra “incluir” con “causa” en la parte superior. Porque es más el hecho de que vw las unidades solo tienen en cuenta el tamaño de la ventana gráfica – no incluyendo cualquier barra de desplazamiento y causando desbordamiento y una barra de desplazamiento en la otra dirección cuando se agrega su ancho a 100vw (haciendo que el espacio total que se necesita sea la ventana gráfica más el ancho de la barra de desplazamiento, excediendo la pantalla).

Al igual que con la pregunta aquí, la mejor manera de manejar vw Es probable que las unidades las eviten si puede porque simplemente no son muy compatibles con el navegador de escritorio (que no tiene barras de desplazamiento superpuestas).

Edité la idea que incluía una variable CSS, por esperanzadora que pareciera.

Avatar de usuario de Jefferson
jefferson

Esta pregunta es antigua y se respondió bien arriba, por lo que me centraré en obtener el ancho de la barra de desplazamiento para luego usarlo para calcular el ancho de los elementos, ya que es por eso que llegué aquí. Esperemos que esto ayude a otros Googlers.

Una solución CSS descuidada

Empecé a escribir la solución CSS pura basada en el cálculo a continuación, pero una vez que comienzas a tener en cuenta los elementos dentro de los contenedores de ancho variable, especialmente cuando no son el 100% del ancho visible, el calc las funciones comienzan a volverse intrincadas e ilegibles.

Para quien le interese, este calc en el elemento raíz (<html>) (asumiendo que el documento es de ancho completo y no más ancho) le dará el ancho de la barra de desplazamiento o 0 cuando no se muestra ninguna barra de desplazamiento.

calc( 100vw - 100% );

Una solución robusta

Personalmente, no lucharía contra CSS en este caso. Utilice la herramienta adecuada para el trabajo:

(function get_scrollbar_width() {

    // Get window width including scrollbar.
    const withScrollBar = window.innerWidth;
    
    // Get window width excluding scrollbar.
    const noScrollBar = document.querySelector("html").getBoundingClientRect().width;
    
    // Calc the scrollbar width.
    scrollbarWidth = parseInt((withScrollBar - noScrollBar), 10) + 'px';

    // Update the CSS custom property value.
    let root = document.documentElement;
    root.style.setProperty('--scrollbar', scrollbarWidth);
    
})();
:root {
    --scrollbar: 0px;
}

body {
    overflow: scroll;
}

.demobox {
    display: grid;
    grid: auto / var(--scrollbar) max-content;
    width: calc(10em + var(--scrollbar) );
    margin: 0 auto;
}

.demobox > div {
    background: red;
}

.demobox > p {
    padding: 1em;
    text-align: center;
    width: 10em;
}
<div class="demobox">
    <div></div>
    <p>
        This red grid cell represents the scrollbar width as set
        on the CSS custom property by the JavaScript function.
    </p>
</div>

html { overflow-x: hidden; }

parece funcionar

Tengo una solución aquí. Incluirá el ancho de la barra de desplazamiento cuando use 100vw, ¿verdad? así que si no podemos hacerlo bien, entonces podemos quitar la barra de desplazamiento, hacerla invisible. así: ocultar la barra de desplazamiento, pero sin dejar de poder desplazarse

¿Ha sido útil esta solución?