J'essaye de redimensionner une image avec un pourcentage d'elle-même. Par exemple, je veux juste réduire l'image de moitié en la redimensionnant à 50%. Mais l'application 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 d'elle-même sans utiliser javascript ou côté serveur? (Je n'ai aucune information directe sur la taille de l'image)
Je suis à peu près sûr que vous ne pouvez pas faire cela, mais je veux juste voir s'il existe une solution intelligente uniquement CSS. Merci!
width: <number>%
. Je ne pense pas qu'il y ait moyen de le faire!Réponses:
J'ai 2 méthodes pour vous.
Méthode 1. Démo sur jsFiddle
Cette méthode redimensionne l'image uniquement visuelle, pas ses dimensions réelles dans DOM, et l'état visuel après le redimensionnement centré au milieu de la taille d'origine.
html:
css:
Remarque sur la prise en charge du navigateur : les statistiques des navigateurs sont affichées en ligne dans
css
.Méthode 2. Démo sur jsFiddle
html:
css:
Remarque:
img.normal
etimg.fake
c'est la même image.Remarque sur la prise en charge du navigateur: cette méthode fonctionnera dans tous les navigateurs, car tous les navigateurs prennent en charge
css
propriétés utilisées dans method.La méthode fonctionne de cette manière:
#wrap
et#wrap img.fake
avoir du flux#wrap
aoverflow: hidden
pour que ses dimensions soient identiques à l'image intérieure (img.fake
)img.fake
est le seul élément à l'intérieur#wrap
sansabsolute
positionnement pour ne pas casser la deuxième étape#img_wrap
a unabsolute
positionnement à l'intérieur#wrap
et s'étend en taille à l'ensemble de l'élément (#wrap
)#img_wrap
a les mêmes dimensions que l'image.width: 50%
surimg.normal
, sa taille est50%
de#img_wrap
, et donc50%
de la taille de l' image originale.la source
transform:scale()
solution a cependant un gros problème. Il n'interagit pas bien avec le modèle de boîte CSS. Je veux dire qu'il ne réagit pas avec elle du tout , donc vous obtenez la mise en page qui ressemble tout faux. Voir: jsfiddle.net/kahen/sGEkt/8HTML:
CSS:
Cela doit être l'une des solutions les plus simples utilisant l'approche de l'élément conteneur.
Lorsque vous utilisez l'approche de l'élément conteneur, cette question est une variante de cette question . L'astuce consiste à laisser l'élément conteneur envelopper l'image enfant afin qu'elle ait une taille égale à celle de l'image non dimensionnée. Ainsi, lors de la définition de la
width
propriété de l'image en tant que valeur de pourcentage, l'image est mise à l'échelle par rapport à son échelle d'origine.Certains des autres propriétés permettant de valeurs et feuille rétractable propriété sont:
float: left/right
,position: fixed
etmin/max-width
, comme mentionné dans la question liée. Chacun a ses propres effets secondaires, mais cedisplay: inline-block
serait un choix plus sûr. Matt l'a mentionnéfloat: left/right
dans sa réponse, mais il l'a attribué à tortoverflow: hidden
.Démo sur jsfiddle
Edit: Comme mentionné par Trojan , vous pouvez également profiter du nouveau module de dimensionnement intrinsèque et extrinsèque CSS3 :
HTML:
CSS:
Cependant, toutes les versions de navigateur populaires ne le prennent pas en charge au moment de la rédaction .
la source
<img src="https://www.google.com/images/srpr/logo11w.png"/>
CSS:img { display: inline-block; width: 15%; }
figure
est àwidth: fit-content;
partir de maintenant. La prise en charge des navigateurs est également bien meilleure aujourd'hui.Essayer la
zoom
propriétéEdit: Apparemment, FireFox ne prend pas en charge la
zoom
propriété. Tu devrais utiliser;pour FireFox.
la source
Une autre solution consiste à utiliser:
Il ne validera pas car l'
src
attribut est obligatoire, mais il fonctionne (sauf sur n'importe quelle version d'IE car ilsrcset
n'est pas pris en charge).la source
C'est en fait possible, et j'ai découvert à quel point par accident lors de la conception de mon premier site de conception réactive à grande échelle.
Le débordement: hidden donne la hauteur et la largeur du wrapper, malgré le contenu flottant, sans utiliser le hack clearfix. Vous pouvez ensuite positionner votre contenu en utilisant des marges. Vous pouvez même faire du div wrapper un bloc en ligne.
la source
C'est un fil très ancien mais je l'ai trouvé en cherchant une solution simple pour afficher la capture d'écran de la rétine (haute résolution) sur un écran de résolution standard.
Il existe donc une solution HTML uniquement pour les navigateurs modernes:
Cela indique au navigateur que l'image a deux fois la dimension de sa taille d'affichage prévue. La valeur est proportionnelle et n'a pas besoin de refléter la taille réelle de l'image. On peut également utiliser 2w 1px pour obtenir le même effet. L'attribut src n'est utilisé que par les anciens navigateurs.
Le bel effet de celui-ci est qu'il affiche la même taille sur la rétine ou l'affichage standard, rétrécissant sur ce dernier.
la source
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 en utilisant des paramètres de classe et d'identifiant.
pour en savoir plus, allez ici: https://gist.github.com/jennyvallon/eca68dc78c3f257c5df5
la source
Ceci est une approche pas difficile:
la source
En fait, la plupart des réponses ici ne redimensionnent pas vraiment l'image à la largeur d' elle - même .
Nous devons avoir une largeur et une hauteur d'auto sur l'
img
élément lui-même afin que nous puissions commencer avec sa taille d'origine.Après cela, un élément de conteneur peut mettre l'image à l'échelle pour nous.
Exemple HTML simple:
Et voici les règles CSS. J'utilise un conteneur absolu dans ce cas:
Vous pouvez modifier le positionnement de l'image avec des règles telles que
transform: translate(0%, -50%);
.la source
Je pense que vous avez raison, ce n'est tout simplement pas possible avec du CSS pur pour autant que je sache (pas cross-browser je veux dire).
Éditer:
Ok, je n'aimais pas beaucoup ma réponse alors je me suis 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 (bien que ce ne soit pas la plus jolie chose qui soit):
Edit: testé et fonctionnant sous Chrome, FF et IE 8 & 9. . Cela ne fonctionne pas dans IE7.
jsFiddle exemple ici
html:
css:
la source
inline-block
, c'est pourquoi la largeur#img_wrap
dépend non seulement de la largeur html interne, mais aussi de la largeur du conteneur de contexte.