CSS image redimensionner pourcentage de lui-même?

J'essaie de redimensionner un img avec un pourcentage de lui-même. Par exemple, je veux juste réduire l'image de moitié en la redimensionnant à 50%. Mais l'application de width: 50%; redimensionnera l'image à 50% de l'élément conteneur (l'élément parent qui peut-être le <body> par exemple).

La Question Est, puis-je redimensionner l'image avec un pourcentage de lui-même sans utiliser javascript ou côté serveur? (Je n'ai aucune information directe sur la taille de l'image)

Je suis sûr que vous ne pouvez pas le faire, mais je je veux juste voir s'il existe une solution CSS intelligente. Merci!

85
demandé sur Min Ming Lo 2011-12-06 12:26:18

9 réponses

J'ai 2 méthodes pour vous.

Méthode 1. démo sur jsFiddle

Cette méthode redimensionner l'image seulement visual pas les dimensions réelles dans DOM, et l'état visuel après redimensionnement centré au milieu de la taille d'origine.

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');
}​

navigateur Soutien note: les statistiques des navigateurs ont montré inline dans css.

Méthode 2. démo sur 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%;
}​

Note: img.normal et img.fake est la même image.
navigateur Soutien note: cette méthode fonctionnera dans tous les navigateurs, car tous les navigateurs prennent en charge les propriétés css utilisées dans method.

La méthode fonctionne de cette façon:

  1. '#wrap' et '#wrap img.faux " ont flow
  2. #wrap a overflow: hidden pour définir #wrap dimensions de manière identique à image intérieure (img.fake)
  3. img.fake est le seul élément sans les absolute ou fix position dans #wrap pour ne pas casser le résultat de la deuxième étape.
  4. #img_wrap a absolute position à l'intérieur de #wrap et agrandi à l'ensemble de l'élément (#wrap)
  5. le résultat de la quatrième étape est #wrap_img les mêmes dimensions que l'image.
  6. Utiliser responsive images méthode set width: 50%; de img.normal et maintenant vous avez votre résultat.
91
répondu Vladimir Starkov 2012-05-25 11:05:04

HTML:

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

CSS:

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

Cela doit être l'une des solutions les plus simples utilisant l'approche de l'élément conteneur.

Lors de l'utilisation de l'élément conteneur approche, cette question est une variante de cette question. L'astuce consiste à laisser l'élément conteneur rétrécirl'image enfant, de sorte qu'elle aura une taille égale à celle de l'image non dimensionnée. Ainsi, lorsque vous définissez la propriété width de l'image en tant que valeur de pourcentage, l'image est mise à l'échelle par rapport à sa l'échelle d'origine.

Certaines des autres propriétés d'activation de shrinkwrapping et valeurs de propriété sont: float: left/right, position: fixed et min/max-width, comme mentionné dans la question liée. Chacun a ses propres effets secondaires, mais display: inline-block serait un choix plus sûr. Matt a mentionné float: left/right dans sa réponse, mais il l'a attribué à tort à overflow: hidden.

Démo sur jsfiddle


Modifier: Comme mentionné par trojan, vous pouvez également profiter de la nouvellement introduite CSS3 module de dimensionnement intrinsèque et extrinsèque :

HTML:

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

CSS:

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

Cependant, toutes les versions de navigateur populaires ne le supportent pas au moment de l'écriture.

32
répondu Community 2017-05-23 10:31:29

Essayez zoom propriété

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

Edit: apparemment, FireFox ne supporte pas la propriété zoom. Vous devriez utiliser;

-moz-transform: scale(0.5);

Pour FireFox.

8
répondu Emir Akaydın 2011-12-06 08:49:38

Cela est en fait possible, et j'ai découvert comment tout à fait par hasard lors de la conception de mon premier site de conception sensible à grande échelle.

<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%; }

Le overflow: hidden donne la hauteur et la largeur du wrapper, malgré le contenu flottant, sans utiliser le hack clearfix. Vous pouvez ensuite positionner votre contenu à l'aide des marges. Vous pouvez même faire du wrapper div un bloc en ligne.

3
répondu Matt 2014-03-30 07:21:40

Une autre solution consiste à utiliser:

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

Il ne validera pas car l'attribut src est requis, mais il fonctionne (sauf sur n'importe quelle version D'IE car srcset n'est pas supporté).

1
répondu benface 2018-01-19 21:01:58

Je pense que vous avez raison, ce n'est tout simplement pas possible avec CSS pur pour autant que je sache (pas cross-browser je veux dire).

Modifier:

Ok, je n'ai pas beaucoup aimé ma réponse, alors j'ai un peu perplexe. J'aurais peut-être trouvé une idée intéressante qui pourrait aider.. peut-être que c'est possible après tout (mais pas la chose la plus jolie jamais):

Modifier: Testé et fonctionnant dans Chrome, FF et IE 8 & 9. . Cela ne fonctionne pas dans IE7.

Jsfiddle exemple ici

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
répondu Wesley 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. 
});

Cette solution utilise js et jquery et redimensionne en fonction uniquement des propriétés de l'image et non du parent. Il peut redimensionner une seule image ou un groupe basé en utilisant les paramètres de classe et d'id.

Pour en savoir plus, allez ici: https://gist.github.com/jennyvallon/eca68dc78c3f257c5df5

0
répondu Jenny Vallon 2016-03-23 18:00:19

C'est un très vieux fil mais je l'ai trouvé en cherchant une solution simple pour afficher la capture d'écran retina (haute résolution) sur l'affichage à résolution standard.

Il existe donc une solution HTML uniquement pour les navigateurs modernes:

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

Cela indique au navigateur que l'image est deux fois la dimension de la taille d'affichage prévue. Les valeurs sont proportionnelles et n'ont pas besoin de refléter la taille réelle de l'image. On peut aussi utiliser 2w 1px pour obtenir le même effet. L'attribut src est utilisé uniquement par les navigateurs hérités.

Le bel effet de celui-ci est qu'il affiche la même taille sur la rétine ou l'écran standard, rétrécissant sur ce dernier.

0
répondu Max_B 2018-04-02 20:31:47

C'est une approche difficile:

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

then in css:
div {
    position: absolute;
}

img, div {
   width: ##%;
   height: ##%;
}
0
répondu nickthehero 2018-05-28 23:08:43