95 votes

Image CSS redimensionne-t-elle le pourcentage?

Je suis en train de redimensionner une img, avec un pourcentage de lui-même. Par exemple, je veux juste rétrécir l'image de moitié par la redimensionner à 50%. Mais l'application d' width: 50%; redimensionner l'image à 50% de l'élément conteneur (le parent de l'élément qui est peut-être l' <body> par exemple).

La Question est, puis-je redimensionner l'image avec un pourcentage de lui-même sans l'aide de javascript côté serveur serveur? (Je n'ai pas d'information directe de la taille de l'image)

Je suis sûr que vous ne pouvez pas faire cela, mais je veux juste voir si il y a des intelligents CSS seule solution. Merci!

100voto

Vladimir Starkov Points 5466

J'ai 2 méthodes pour vous.

Méthode 1. démo sur jsFiddle

Cette méthode de redimensionnement de l'image uniquement visuel non dimensions réelles dans les DOM, et de 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');
}​

Prise en charge du navigateur remarque: les navigateurs les statistiques ont montré inline en css.

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

Remarque: img.normal et img.fake est la même image.
Prise en charge du navigateur remarque: Cette méthode fonctionne dans tous les navigateurs, car tous les navigateurs prennent en charge l' css propriétés utilisées dans la méthode.

La méthode fonctionne de cette manière:

  1. '#wrap' et '#wrap img.faux " ont flow
  2. #wrap a overflow: hidden pour configurer #wrap dimensions à l'identique à l'intérieur de l'image (img.fake)
  3. img.fake est le seul élément sans absolute ou fix position en #wrap pour ne pas casser le résultat de la deuxième étape.
  4. #img_wrap a absolute position à l'intérieur d' #wrap et agrandi à l'ensemble de l'élément (#wrap)
  5. Résultat de la quatrième étape est l' #wrap_img les mêmes dimensions que l'image.
  6. À l'aide de responsive images méthode width: 50%; de img.normal et maintenant vous avez votre résultat.

11voto

Emir Akaydın Points 3969

Essayez les propriétés zoom

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

Modifier: Apparemment, FireFox ne prend pas en charge la propriété zoom . Tu devrais utiliser;

 -moz-transform: scale(0.5);
 

pour FireFox.

2voto

Matt Points 33

C’est effectivement possible, et j’ai découvert comment 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 débordement: hidden donne à l'enveloppe la hauteur et la largeur, malgré le contenu flottant, sans utiliser le hack de clearfix. Vous pouvez ensuite positionner votre contenu en utilisant des marges. Vous pouvez même faire de la division wrapper un inline-block.

-1voto

Wesley Points 1307

Je pense que vous avez raison, c'est juste pas possible avec de la pure CSS pour autant que je sais (pas de cross-browser je veux dire).

Edit:

Ok je n'ai pas aimé ma réponse beaucoup donc je laisse perplexe un peu. J'ai peut-être trouvé une idée intéressante qui pourrait aider.. c'EST peut-être possible, après tout (même si pas la plus belle chose jamais):

Edit: Testé et de travail en Chrome, FF et IE 8 et 9. . Il ne fonctionne pas sous 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%;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X