CSS: hacer div ancho proporcional a la altura


Esto es un poco difícil de explicar, pero: Quiero un div responsive-height (height: 100%) que escalará el width proporcional al height (no viceversa).

Conozco este método utilizando un hack padding-top para hacer la altura proporcional al ancho, pero lo necesito para trabajar al revés. Dicho esto, no estoy muy interesado en el requisito adicional de elementos absolutamente posicionados para el contenido en ese método, así que me doy cuenta de que bien podría pedir la luna en un palo aquí.

Para ayudar a visualizar, aquí hay una imagen:

Representación visual del efecto deseado

...y aquí hay un jsFiddle , que ilustra casi lo mismo.

Vale la pena señalar que ya estoy usando los pseudo-elementos :before y :after para alinear verticalmente el contenido de la caja que quiero escalar proporcionalmente.

Realmente, realmente disfrutaría no tener que volver a jQuery, solo porque va a haber un requisito inherente para cambiar el tamaño de los controladores y, en general, más depuración en todo... pero si esa es mi única opción, entonces fiat .

Author: indextwo, 2014-03-27

6 answers

Me he estado preguntando acerca de una solución pure-css para este problema durante un tiempo. Finalmente se me ocurrió una solución usando ems, que se puede mejorar progresivamente usando vws:

Vea el enlace de codepen para una demostración completa y una explicación:

Http://codepen.io/patrickkunka/pen/yxugb

Versión simplificada:

.parent {
  font-size: 250px; // height of container
  height: 1em;
}

.child {
  height: 100%;
  width: 1em; // 100% of height
}
 12
Author: Patrick Kunka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-23 22:55:12

Oh,probablemente podrías usar ese truco de "relleno-top".

width: 50%;
height: 0;
padding-bottom: 50%;

Http://absolide.tumblr.com/post/7317210512/full-css-fluid-squares

O:

.square-box{
    position: relative;
    width: 50%;
    overflow: hidden;
    background: #4679BD;
}
.square-box:before{
    content: "";
    display: block;
    padding-top: 100%;
}

Http://codeitdown.com/css-square-rectangle /

El relleno vertical en CSS está relacionado con el ancho del elemento, no con la altura.

 12
Author: feeela,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-26 21:12:00

La solución font requiere que se conozca la altura. He encontrado una solución para hacer un elemento proporcional dentro de un div padre con anchuras y alturas desconocidas. Aquí hay una demo.

El truco que estoy usando es tener una imagen usada como espaciador. El código explicado:

<div class="heightLimit">
 <img width="2048" height="2048" class="spacer"
  src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAA
       P///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7">
 <div class="filler">
  <div class="proportional">
  </div>
 </div>
</div>

Así que no es el más bonito con dos divs extra y una imagen inútil. Pero podría ser peor. El elemento de imagen debe tener anchura y altura con las dimensiones deseadas. Necesidad de anchura y altura para ser tan grande como el tamaño máximo permitido (una característica!).

El css:

.heightLimit {
 position: absolute;
 top: 0;
 left: 0;
 height: 100%;
 width: auto;
 max-width: 100%;
 overflow: hidden;
}

Este elemento es limitar la altura, pero expandirse horizontalmente (width: auto) aunque nunca más allá del padre (max-width). El desbordamiento debe ocultarse porque algunos niños sobresalirán fuera del div.

.spacer {
 width: auto;
 max-height: 100%;
 visibility: hidden;
}

Esta imagen es invisible y se escala proporcionalmente a la altura, mientras que el ancho se ajusta y obliga a ajustar también el ancho del padre.

.filler {
 position: absolute;
 top: 0;
 left: 0;
 bottom: 0;
 right: 0;
}

Este elemento es necesario para llenar el espacio con un contenedor absolutamente posicionado.

.proportional {
 position: relative;
 width: 100%;
 height: 0;
 padding-bottom: 100%;
}

Y aquí nuestro elemento proporcional obtiene una altura proporcional al ancho con el truco familiar padding-bottom.

Desafortunadamente, hay un error en Chrome e IE, por lo que si modifica el elemento padre usando Javascript, como en mi demo, las dimensiones no se actualizarán. Hay un truco que se puede aplicar para resolver eso, como se muestra en mi demo.

 6
Author: Johan Rönnblom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-06 18:55:58

Basado en la respuesta de @kunkalabs (que es realmente inteligente), se me ocurrió una solución que te permite preservar el tamaño de fuente heredado.

HTML:

<div id='rect'>
    <div id='content'>Text</div>
</div>

CSS:

#rect {
    font-size: 1000%;
    height: 1em;
    width: 1em;
    position: relative;
}

#content {
    font-size: 10%;
}

Así que básicamente el tamaño de fuente de #content es (100 / rect rectFontSize) * 100 por ciento del rectángulo. Si necesita un tamaño de píxel definido para el rectángulo, puede establecer el tamaño de fuente del padre de #rect...de lo contrario, simplemente ajuste el tamaño de fuente hasta que esté aproximadamente donde desea que esté (y enfade a su diseñador en proceso).

 1
Author: hobberwickey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-24 02:33:10

Puede usar view height (vh) como la unidad para el width.

Aquí hay un ejemplo con el margen de 20px que pidió.

 .parent {
   margin : 20px;
}
.child {
   width: calc(100vh - 40px);
   height : calc(100vh - 40px);
   margin:0 auto;
   background: red;
   box-sizing:border-box;
   padding:10px;
}

Ver el violín : https://jsfiddle.net/svobczp4 /

 0
Author: Erwan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-01 15:03:52

Haga que el DIV padre se comporte como una celda de tabla y alinee el elemento hijo verticalmente. No hay necesidad de hacer ningún truco de relleno.

HTML

<div class="parent">
<img src="foo.jpg" />
</div>

CSS

.parent { width:300px; height:300px; display:table-cell; vertical-align:middle; }
 -2
Author: Eric Windmeier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-22 10:55:20