Estoy tratando de cambiar el tamaño de una imagen con un porcentaje de sí mismo. Por ejemplo, solo quiero reducir la imagen a la mitad cambiando su tamaño al 50%. Pero la aplicación width: 50%;
cambiará el tamaño de la imagen para que sea el 50% del elemento contenedor (el elemento principal, que tal vez sea, <body>
por ejemplo).
La pregunta es, ¿puedo cambiar el tamaño de la imagen con un porcentaje de sí misma sin usar javascript o el lado del servidor? (No tengo información directa del tamaño de la imagen)
Estoy bastante seguro de que no puede hacer esto, pero solo quiero ver si hay una única solución de CSS inteligente. ¡Gracias!
width: <number>%
. ¡No creo que haya una forma de hacerlo!Respuestas:
Tengo 2 métodos para ti.
Método 1. demostración en jsFiddle
Este método cambia el tamaño de la imagen solo visualmente, no sus dimensiones reales en DOM, y el estado visual después del cambio de tamaño se centra en el medio del tamaño original.
html:
css:
Nota de compatibilidad del navegador : las estadísticas de los navegadores se muestran en línea en
css
.Método 2. demostración en jsFiddle
html:
css:
Nota:
img.normal
yimg.fake
es la misma imagen.Nota de compatibilidad con el navegador: este método funcionará en todos los navegadores, porque todos los navegadores admiten las
css
propiedades utilizadas en el método.El método funciona de esta manera:
#wrap
y#wrap img.fake
tener flujo#wrap
tieneoverflow: hidden
para que sus dimensiones sean idénticas a la imagen interior (img.fake
)img.fake
es el único elemento dentro#wrap
sinabsolute
posicionar para que no rompa el segundo escalón#img_wrap
tieneabsolute
posicionamiento en el interior#wrap
y se extiende en tamaño a todo el elemento (#wrap
)#img_wrap
tiene las mismas dimensiones que la imagen.width: 50%
enimg.normal
, su tamaño es50%
de#img_wrap
, y por lo tanto50%
del tamaño de la imagen original.fuente
transform:scale()
embargo, la solución tiene un gran problema. No interactúa bien con el modelo de caja CSS. Con lo que quiero decir que no interactúa con él en absoluto , por lo que obtienes un diseño que se ve mal. Ver: jsfiddle.net/kahen/sGEkt/8HTML:
CSS:
Esta tiene que ser una de las soluciones más simples que utilizan el enfoque del elemento contenedor.
Cuando se utiliza el enfoque del elemento contenedor, esta pregunta es una variación de esta pregunta . El truco consiste en dejar que el elemento contenedor envuelva la imagen secundaria para que tenga un tamaño igual al de la imagen sin tamaño. Por lo tanto, al establecer la
width
propiedad de la imagen como un valor porcentual, la imagen se escala en relación con su escala original.Algunas de las otras propiedades shrinkwrapping de habilitación y los valores de propiedad son:
float: left/right
,position: fixed
ymin/max-width
, como se mencionó en la pregunta vinculada. Cada uno tiene sus propios efectos secundarios, perodisplay: inline-block
sería una opción más segura. Matt lo ha mencionadofloat: left/right
en su respuesta, pero lo atribuyó erróneamente aoverflow: hidden
.Demostración en jsfiddle
Editar: como lo mencionó el troyano , también puede aprovechar el módulo de tamaño intrínseco y extrínseco CSS3 recién introducido :
HTML:
CSS:
Sin embargo, no todas las versiones de navegadores populares lo admiten en el momento de escribir este artículo .
fuente
<img src="https://www.google.com/images/srpr/logo11w.png"/>
CSS:img { display: inline-block; width: 15%; }
figure
es awidth: fit-content;
partir de ahora. El soporte del navegador también es mucho mejor hoy.Probar
zoom
propiedadEditar: Aparentemente, FireFox no es compatible con la
zoom
propiedad. Deberías usar;para FireFox.
fuente
Otra solución es utilizar:
No se valida porque el
src
atributo es obligatorio, pero funciona (excepto en cualquier versión de IE porquesrcset
no es compatible).fuente
De hecho, esto es posible, y descubrí cómo por accidente mientras diseñaba mi primer sitio de diseño receptivo a gran escala.
El overflow: hidden le da al contenedor alto y ancho, a pesar del contenido flotante, sin usar el truco clearfix. Luego puede colocar su contenido usando márgenes. Incluso puede hacer que el contenedor div sea un bloque en línea.
fuente
Este es un hilo muy antiguo, pero lo encontré mientras buscaba una solución simple para mostrar la captura de pantalla retina (alta resolución) en una pantalla de resolución estándar.
Por tanto, existe una única solución HTML para navegadores modernos:
Esto le dice al navegador que la imagen tiene el doble de dimensión del tamaño de visualización previsto. Los valores son proporcionales y no es necesario que reflejen el tamaño real de la imagen. También se pueden usar 2w 1px para lograr el mismo efecto. El atributo src solo lo utilizan los navegadores heredados.
El buen efecto de esto es que muestra el mismo tamaño en retina o pantalla estándar, encogiéndose en esta última.
fuente
Esta solución usa js y jquery y cambia el tamaño basándose solo en las propiedades de la imagen y no en el padre. Puede cambiar el tamaño de una sola imagen o de un grupo usando parámetros de clase e identificación.
para obtener más información, vaya aquí: https://gist.github.com/jennyvallon/eca68dc78c3f257c5df5
fuente
Este es un enfoque no difícil:
fuente
En realidad, la mayoría de las respuestas aquí no escalan la imagen al ancho de sí misma .
Necesitamos tener un ancho y alto de auto en el
img
elemento mismo para que podamos comenzar con su tamaño original.Después de eso, un elemento contenedor puede escalar la imagen por nosotros.
Ejemplo de HTML simple:
Y aquí están las reglas de CSS. Yo uso un contenedor absoluto en este caso:
Podría modificar el posicionamiento de la imagen con reglas como
transform: translate(0%, -50%);
.fuente
Creo que tienes razón, simplemente no es posible con CSS puro hasta donde yo sé (no entre navegadores, quiero decir).
Editar:
Ok, no me gustó mucho mi respuesta, así que me desconcerté un poco. Podría haber encontrado una idea interesante que podría ayudar ... tal vez ES posible después de todo (aunque no es la cosa más bonita):
Editar: probado y funcionando en Chrome, FF e IE 8 y 9. . No funciona en IE7.
Ejemplo de jsFiddle aquí
html:
css:
fuente
inline-block
, por eso el ancho#img_wrap
depende no solo del ancho interno del html, sino también del ancho del contenedor de contexto.