css ancho igual que alto

6 minutos de lectura

avatar de usuario de giorgos
giorgos

Me gustaría hacer el siguiente truco en mi archivo css para que (alto = ancho) sin configurar píxeles. Quiero hacer esto para que sea cual sea la resolución del navegador, tenga los mismos valores en estas dos dimensiones.

#test{
    height: 100%;
    width: (same as height);
}

Prefiero hacerlo con css y no con javascript.

Gracias de antemano.

  • Posible duplicado de esta pregunta: stackoverflow.com/questions/5445491/…

    usuario2012084

    15 de febrero de 2014 a las 15:58

  • @dpwivagg No lo creo. El OP quiere width: same as height no height: same as width.

    – Hashem Qolami

    15/02/2014 a las 16:00


  • No puede hacer referencia a otras declaraciones css con css. Podría usar menos css, lo que le permitiría hacer esto. lesscss.org

    – Calvino

    15/02/2014 a las 16:00

  • @Hashem Qolami, he probado a hacerlo con jquery pero el problema es que no funciona en todas las resoluciones de smartphones.

    – giorgos

    15 de febrero de 2014 a las 16:11

Esta es mi manera

  aspect-ratio: 1 / 1;
  height: 100%;

Ejemplo:

.my-container {
  width: 100%;
  height: 150px;
  background: black;
  padding: 20px
}

.my-element {
  background: #fff;
  aspect-ratio: 1 / 1;
  height: 100%;
}
<div class="my-container">
  <div class="my-element">Height = Width</div>
</div>

  • ¡Fantástico! Pero, ¿podemos usarlo? caniuse.com/mdn-css_properties_aspect-ratio – el soporte actual es de alrededor del 70%, básicamente Safari aún no lo implementa. Si usa esto, su sitio se romperá en iPhones y en Safari. 🤷‍♂️

    – Eduardo

    16 de septiembre de 2021 a las 9:47

  • 100 millones de votos a favor… Safari ahora admite esto… gracias… esta debería ser la mejor respuesta

    – danday74

    2 oct 2021 a las 21:57

La única forma CSS de hacer esto en este momento (AFAIK) es usar valores relacionados con la ventana gráfica (vh / vw)

El soporte no es excelente en este momento: http://caniuse.com/viewport-units pero aquí hay una demostración rápida

JSFiddle

CSS

.box {
    background-color: #00f;
    width: 50vw;
    height:50vw;
}

La caja responde pero siempre permanecerá cuadrada.

Puro % los valores no funcionarán como height:100% no es igual width:100% ya que se refieren a diferentes cosas siendo las dimensiones relevantes del padre.

  • Creo que esto es lo que realmente quiero… Lo intentaré. Gracias

    – giorgos

    15 de febrero de 2014 a las 16:57

  • Alguna idea de cómo colocar tal .box elemento dentro de su padre para que esté centrado tanto horizontal como verticalmente?

    – Michal Hosala

    1 oct 2015 a las 18:06

  • Hay muchas respuestas a eso en SO. Solo busca un rato.

    – Paulie_D

    1 oct 2015 a las 18:20

  • Lo siento, tuve un error en mi código gracias al cual mi favorito margin: auto; position: absolute; top, bottom, right, left: 0; la solución no funcionaba, de ahí la pregunta: estaba culpando vw para ello.

    – Michal Hosala

    2 de octubre de 2015 a las 0:06

  • @Paulie_D: no hay “muchas respuestas” para esta pregunta. y esta solución no es correcta ya que no responde al título sino que responde a un escenario muy específico. Vine aquí para buscar una respuesta para el título y no obtuve nada: /

    – vsync

    5 de junio de 2017 a las 15:58


Otra opción es hacer relación de aspecto usando imagen comportamiento del elemento

Aquí uso SVG imagen y en línea con URL de datos para hacerlo más simple

Para describir la relación de aspecto deseada, puede usar viewBox atributo svg viewBox='0 0 width-ratio height-ratio'

Ejemplos:

html,
body {
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
        "Ubuntu", "Cantarell", "Fira Sans",
        "Droid Sans", "Helvetica Neue", sans-serif;
    margin: 0;
    padding: 0;
}
body {
    margin: 1rem;
}

.row {
  padding: 8px 0px;
}

.block {
  display: inline-block;
  vertical-align: top;
  position: relative;
  margin-left: 8px;
  margin-right: 8px;
}

.block-content {
  position: absolute; 
  top: 0; 
  left: 0; 
  right: 0; 
  bottom: 0; 
  display: flex; 
  justify-content: center; 
  align-items: center;
}

.ratio--width-to-height {
  height: 100%; 
  width: auto;
}

.ratio--height-to-width {
  height: auto; 
  width: 100%;
}
<h1>
  Block aspect ratio with svg image
</h1>

<h2>
  width to height
</h2>

<div class="row">   
  <div class="block" style="background: lime; height: 120px;">
    <img class="ratio--width-to-height" 
    src="data:image/svg+xml;utf8,&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox='0 0 1 1'&gt;&lt;/svg&gt;">
    <div class="block-content">1 : 1</div>
  </div>

  <div class="block" style="background: cyan; height: 120px;">
    <img class="ratio--width-to-height" 
    src="data:image/svg+xml;utf8,&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox='0 0 2 1'&gt;&lt;/svg&gt;">
    <div class="block-content">2 : 1</div>
  </div>
  
  <div class="block" style="background: orange; height: 120px;">
    <img class="ratio--width-to-height" 
    src="data:image/svg+xml;utf8,&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox='0 0 1 1.25'&gt;&lt;/svg&gt;">
    <div class="block-content">1 : 1.25</div>
  </div>
</div>

<h2>
  height to width
</h2>

<div class="row">   
  <div class="block" style="background: lime; width: 120px;">
    <img class="ratio--height-to-width" 
    src="data:image/svg+xml;utf8,&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox='0 0 1 1'&gt;&lt;/svg&gt;">
    <div class="block-content">1 : 1</div>
  </div>

  <div class="block" style="background: cyan; width: 120px;">
    <img class="ratio--height-to-width" 
    src="data:image/svg+xml;utf8,&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox='0 0 2 1'&gt;&lt;/svg&gt;">
    <div class="block-content">2 : 1</div>
  </div>
  
  <div class="block" style="background: orange; width: 120px;">
    <img class="ratio--height-to-width" 
    src="data:image/svg+xml;utf8,&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox='0 0 1 1.25'&gt;&lt;/svg&gt;">
    <div class="block-content">1 : 1.25</div>
  </div>
</div>

Mismo ejemplo en codepen https://codepen.io/forceuser/pen/MMWBBx

  • Aclare el uso de “html”, no pude encontrarlo en W3School ni en ninguna otra documentación

    – vikramvi

    9 de julio de 2020 a las 10:34

  • Para cualquiera que haya venido aquí por el título de la pregunta, esta es la respuesta que está buscando. Utiliza una etiqueta de imagen secundaria con una proporción de 1: 1 y hace que el ancho de la etiqueta principal sea automático. Para las personas que publican “posible duplicado” por ignorancia, no es un duplicado porque el truco del porcentaje de relleno se basa en el ancho del padre y no en la altura. Por lo tanto, solo funciona si está tratando de hacer que la altura coincida con el ancho, no al revés

    – DanzaSC

    10 mayo 2021 a las 18:53


  • La propiedad de relación de aspecto es técnicamente la mejor manera, pero solo se admite en versiones recientes de algunos navegadores. Este es el mejor por ahora.

    – SRCP

    12 dic 2021 a las 21:58


ancho máximo / altura máxima trabajó para mi:

Una imagen de tamaño definido se establece en un div (.box).

.parent {
       position: absolute;
}

.box {
    width: 100%;
    height: 100%;
}

.box img {
   max-width: 100%;
   max-height: 100%;
}

¿Ha sido útil esta solución?