CSS imagen cambiar el tamaño porcentaje de sí mismo?


Estoy tratando de cambiar el tamaño de un img con un porcentaje de sí mismo. Por ejemplo, solo quiero reducir la imagen a la mitad redimensionándola al 50%. Pero aplicar width: 50%; redimensionará la imagen para que sea el 50% del elemento contenedor (el elemento padre que quizás 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 del lado del servidor? (No tengo información directa del tamaño de la imagen)

Estoy bastante seguro de que no puedes hacer esto, pero solo quiero ver si hay solo solución CSS inteligente. ¡Gracias!

Author: Min Ming Lo, 2011-12-06

9 answers

Tengo 2 métodos para ti.

Método 1. demo en jsFiddle

Este método cambia el tamaño de la imagen solo visual no lo dimensiones reales en DOM, y el estado visual después de cambiar el tamaño centrado en el medio del tamaño original.

Html:

<img class="fake" src="example.png" />

Css:

img {
  -webkit-transform: scale(0.5); /* Saf3.1+, Chrome */
     -moz-transform: scale(0.5); /* FF3.5+ */
      -ms-transform: scale(0.5); /* IE9 */
       -o-transform: scale(0.5); /* Opera 10.5+ */
          transform: scale(0.5);
             /* IE6–IE9 */
             filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.9999619230641713, M12=-0.008726535498373935, M21=0.008726535498373935, M22=0.9999619230641713,SizingMethod='auto expand');
}​

Nota de soporte del navegador: las estadísticas de los navegadores se muestran en línea en css.

Método 2. demo en jsFiddle

Html:

<div id="wrap">
    <img class="fake" src="example.png" />
    <div id="img_wrap">
        <img class="normal" src="example.png" />
    </div>
</div>​

Css:

#wrap {
    overflow: hidden;
    position: relative;
    float: left;
}

#wrap img.fake {
    float: left;
    visibility: hidden;
    width: auto;
}

#img_wrap {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
}

#img_wrap img.normal {
    width: 50%;
}​

Nota: img.normal y img.fake es la misma imagen.
Nota de soporte del navegador: Este método funcionará en todos los navegadores, porque todos los navegadores soportan las propiedades css utilizadas en el método.

El método funciona de esta manera:

  1. '# wrap ' y ' # wrap img.fake ' have flow
  2. #wrap tiene overflow: hidden para establecer #wrap dimensiones idénticas a imagen interior(img.fake)
  3. img.fake es solo el elemento sin absolute o fix posición en #wrap para no romper el resultado del segundo paso.
  4. #img_wrap tiene absolute posición dentro de #wrap y extendido en tamaño a todo el elemento (#wrap)
  5. El resultado del cuarto paso es #wrap_img las mismas dimensiones que la imagen.
  6. Usando responsive images método conjunto width: 50%; de img.normal y ahora tienes tu resultado.
 91
Author: Vladimir Starkov,
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
2012-05-25 11:05:04

HTML:

<span>
    <img src="example.png"/>
</span>

CSS:

span {
    display: inline-block;
}
img {
    width: 50%;
}

Esta tiene que ser una de las soluciones más simples utilizando el enfoque de elemento contenedor.

Cuando se utiliza el enfoque de elemento contenedor, esta pregunta es una variación de esta pregunta. El truco es dejar que el elemento contenedor retraiga la imagen secundaria, para que tenga un tamaño igual al de la imagen sin tamaño. Por lo tanto, al establecer la propiedad width de la imagen como un valor porcentual, la imagen se escala en relación con su escala original.

Algunas de las otras propiedades y valores de propiedades que habilitan shrinkwrapping son: float: left/right, position: fixed y min/max-width, como se menciona en la pregunta vinculada. Cada uno tiene sus propios efectos secundarios, pero display: inline-block sería una opción más segura. Matt ha mencionado float: left/right en su respuesta, pero él erróneamente lo atribuyó a overflow: hidden.

Demostración en jsfiddle


Editar: Como se mencionó por trojan , también puede tomar ventaja de la recién introducida CSS3 módulo de dimensionamiento intrínseco y extrínseco :

HTML:

<figure>
    <img src="example.png"/>
</figure>

CSS:

figure {
    width: intrinsic;
}
img {
    width: 50%;
}

Sin embargo, no todas las versiones populares del navegador lo soportan en el momento de escribir.

 32
Author: Community,
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
2017-05-23 10:31:29

Try zoom property

<img src="..." style="zoom: 0.5" />

Editar: Aparentemente, FireFox no soporta la propiedad zoom. Usted debe utilizar;

-moz-transform: scale(0.5);

Para FireFox.

 8
Author: Emir Akaydın,
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
2011-12-06 08:49:38

Esto en realidad es posible, y descubrí cómo por accidente mientras diseñaba mi primer sitio de diseño responsivo a gran escala.

<div class="wrapper">
  <div class="box">
    <img src="/logo.png" alt="">
  </div>
</div>

.wrapper { position:relative; overflow:hidden; }

.box { float:left; } //Note: 'float:right' would work too

.box > img { width:50%; }

El desbordamiento:oculto da la altura y el ancho de la envoltura, a pesar del contenido flotante, sin usar el hack de clearfix. A continuación, puede posicionar su contenido utilizando márgenes. Incluso puedes hacer del wrapper div un bloque en línea.

 3
Author: Matt,
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-30 07:21:40

Otra solución es usar:

<img srcset="example.png 2x">

No se validará porque se requiere el atributo src, pero funciona (excepto en cualquier versión de IE porque srcset no es compatible).

 1
Author: benface,
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-01-19 21:01:58

Creo que tienes razón, simplemente no es posible con CSS puro por lo que sé (no cross-browser me refiero).

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 la cosa más bonita nunca):

Editar: Probado y trabajando en Chrome, FF e IE 8&9. . No funciona en IE7.

Ejemplo de JsFiddle aquí

Html:

<div id="img_wrap">
    <img id="original_img" src="http://upload.wikimedia.org/wikipedia/en/8/81/Mdna-standard-edition-cover.jpg"/>
    <div id="rescaled_img_wrap">
        <img id="rescaled_img" src="http://upload.wikimedia.org/wikipedia/en/8/81/Mdna-standard-edition-cover.jpg"/>
    </div>
</div>

Css:

#img_wrap {
    display: inline-block;       
    position:relative;    
}

#rescaled_img_wrap {
    width: 50%;
}
#original_img {
    display: none;
}
#rescaled_img {
    width: 100%;
    height: 100%;
}
 0
Author: Wesley,
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
2012-05-25 10:31:59
function shrinkImage(idOrClass, className, percentShrinkage){
'use strict';
    $(idOrClass+className).each(function(){
        var shrunkenWidth=this.naturalWidth;
        var shrunkenHeight=this.naturalHeight;
        $(this).height(shrunkenWidth*percentShrinkage);
        $(this).height(shrunkenHeight*percentShrinkage);
    });
};

$(document).ready(function(){
    'use strict';
     shrinkImage(".","anyClass",.5);  //CHANGE THE VALUES HERE ONLY. 
});

Esta solución utiliza 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 un grupo basado en parámetros de clase e id.

Para más información, vaya aquí: https://gist.github.com/jennyvallon/eca68dc78c3f257c5df5

 0
Author: Jenny Vallon,
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-23 18:00:19

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 la pantalla de resolución estándar.

Así que hay una solución solo HTML para los navegadores modernos:

<img srcset="image.jpg 100w" sizes="50px" src="image.jpg"/>

Esto le está diciendo al navegador que la imagen es el doble de la dimensión del tamaño de pantalla previsto. Los valores son proporcionales y no necesitan reflejar el tamaño real de la imagen. Uno puede utilizar 2w 1px también para lograr el mismo efecto. El atributo src solo es utilizado por navegadores heredados.

El efecto agradable es que muestra el mismo tamaño en retina o pantalla estándar, encogiéndose en esta última.

 0
Author: Max_B,
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-04-02 20:31:47

Este es un enfoque no difícil:

<div>
    <img src="sample.jpg" />
</div>

then in css:
div {
    position: absolute;
}

img, div {
   width: ##%;
   height: ##%;
}
 0
Author: nickthehero,
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-05-28 23:08:43