css - tag - javascript title
¿Solución CSS pura? ¿Elementos cuadrados? (6)
Esta pregunta ya tiene una respuesta aquí:
- Mantener la relación de aspecto de un div con CSS 21 respuestas
Si tengo un <div> con un ancho relativo (como el ancho: 50% ), ¿hay una forma sencilla de hacer que tenga el mismo ancho que la altura sin tener que recurrir a JavaScript?
No, y sí (Kinda)
Bien, entonces la respuesta corta es "no", no es posible. La respuesta larga es "sí", dadas ciertas restricciones y concesiones (es decir, marcado HTML adicional y limitaciones sobre lo que se puede hacer).
Dado este CSS:
.square {
position: relative;
margin: 20px;
display: inline-block; /* could be float */
overflow: auto; /* UPDATE: if content may overflow square */
}
.sq-setter-w {
width: 100%;
height: auto;
visibility: hidden;
}
.sq-setter-h {
width: auto;
height: 100%;
visibility: hidden;
}
.sq-content {
position: absolute;
z-index: 1;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
Con este HTML:
<div class="square" style="width: 200px">
<img src="http://dummyimage.com/50x50/000/fff.gif&text=50x50" class="sq-setter-w"/>
<div class="sq-content">Here is content</div>
</div>
<div class="square" style="height: 100px">
<img src="http://dummyimage.com/50x50/000/fff.gif&text=50x50" class="sq-setter-h"/>
<div class="sq-content">Here is content</div>
</div>
<div class="extrawrapper">
<div class="square" style="width: 200px">
<img src="http://dummyimage.com/50x50/000/fff.gif&text=50x50" class="sq-setter-w"/>
<div class="sq-content">Here is content</div>
</div>
</div>
<div class="extrawrapper">
<div class="square" style="height: 100px">
<img src="http://dummyimage.com/50x50/000/fff.gif&text=50x50" class="sq-setter-h"/>
<div class="sq-content">Here is content</div>
</div>
</div>
Puedes conseguir que haga lo que muestra este violín .
Las claves son:
- La imagen utilizada debe ser una imagen cuadrada, ya que está impulsando el tamaño proporcional (el elemento
imges el único elemento que puede hacer ese trabajo proporcional, ya que puede basar su tamaño en la proporción de la imagen en sí). - Debe saber si va a configurar el
widtho elheightpara que pueda configurar la clase de imagen correctamente para su tamaño. Opcionalmente , establezca elwidtho elheighten elimg, entonces no necesita preocuparse por establecer una clase en el valor del100%. Mi demo asumía que establecía el tamaño en el div contenedor (mi clase.square). - Para hacer que el
divcontraiga alrededor delimgque está impulsando el tamaño proporcional que necesita para configurar ladisplay: inline-blocko unfloaten eldiv(como se indica en el css anterior). - Debido al # 3, si quieres que ese
divactúe más "como un bloque", necesitas darles undivenvoltorio adicional como muestran el tercero y el cuarto.
Obviamente, hay una gran cantidad de margen adicional involucrado en esta solución. Así que, en muchos sentidos, es mejor decir "solo use javascript", pero quería probar que se podía hacer (al menos en algunos casos) únicamente con HTML y CSS.
Actualización: para mostrar la posibilidad de tamaño flexible
Vea este violín para conocer los porcentajes que determinan el tamaño , con este ejemplo html ( width establecido en 30% ):
<div class="square" style="width: 30%">
<img src="http://dummyimage.com/50x50/000/fff.gif&text=50x50" class="sq-setter-w"/>
<div class="sq-content">Here is content</div>
</div>
De hecho, es posible lograrlo con este sencillo truco que encontré en este blog.
#square {
width: 100%;
height: 0;
padding-bottom: 100%;
}
Espero que ayude
Esto no se puede hacer con CSS solo. Usando jQuery puedes lograr esto haciendo
var chld = $(''.child'').width();
$(''.child'').css({''height'':chld+''px''});
Ver ejemplo de trabajo en http://jsfiddle.net/4Jnfq/
Puede encontrar una solución solo para CSS here en la última actualización "Cambiar tamaño con contenido".
Aunque se aplica a los círculos, puede eliminar el border-radius: 50% del border-radius: 50% para que funcione con los cuadrados.
Necesitaba lograr algo similar hoy y tuve la misma idea con la imagen. Quería ver otras posibilidades y google me guió aquí.
... realmente no necesitas una imagen src . simplemente puedes usar un hash si quieres un cuadrado. Guarda una solicitud http.
Sin embargo, si quieres obtener una relación de aspecto diferente, debes usar un src . Si desea tener una relación de 16: 9, la imagen debe ser de 16px ancho y 9px alto (ir lo más pequeña posible)
Comparando ambas técnicas (ver otras respuestas en este hilo)
img vs. padding-bottom
Aquí hay un violín para mostrar cuánto más compatible es la versión img (también puede manejar fácilmente el valor de px (un intervalo cambiará el tamaño del "cuadrado" cada segundo)
Si usa valores de porcentaje, ambas técnicas pueden lograr el mismo resultado pero la versión de relleno no necesita el margen de beneficio adicional ( <img src="#"/> )
Conclusión:
Dependiendo de la implementación, cada técnica tiene sus pros y sus contras.
HTML
<div class="floater">
<div class="square square_noImg">
<div class="inner">Hey blue you look totally squared</div>
</div>
<div class="square square_img">
<img src="#"/>
<div class="inner">Hey red you seem off</div>
</div>
</div>
CSS
.floater {
font-size: 0;
}
.square {
position: relative;
display: inline-block;
width: 100px;
margin: 0 5px;
}
.square_noImg {
padding-bottom: 100px;
background: red;
}
.square_img {
background: blue;
}
img{
width: 100%;
height: auto;
border: 0;
visibility: hidden;
}
.inner {
position: absolute;
top: 10%;
right: 10%;
bottom: 10%;
left: 10%;
background: white;
font-size: 14px;
text-align: center;
overflow: hidden;
padding: 10px 5px;
}
No con unidades relativas como % , porque se calcularían en relación con un elemento contenedor. Pero es posible hacer un elemento cuadrado si usas unidades como px o em para establecer ambas dimensiones.
Un enfoque nativo de JS en respuesta al comentario de @Dave en @ praveen-kumar:
var squareElement = function(el) {
el.style.height = el.offsetWidth + ''px'';
}
y usarlo en cualquier lugar
squareElement(document.querySelector(''your-selector''));