En utilisant le modèle de boîte flexible CSS, comment puis-je forcer une image à conserver ses proportions?
JS Fiddle: http://jsfiddle.net/xLc2Le0k/2/
Notez que les images s'étirent ou se rétrécissent afin de remplir la largeur du conteneur. C'est bien, mais pouvons-nous aussi l'étirer ou réduire la hauteur pour conserver les proportions de l'image?
HTML
<div class="slider">
<img src="http://www.placebacon.net/400/300" alt="Bacn">
<img src="http://www.placebacon.net/400/300" alt="Bacn">
<img src="http://www.placebacon.net/400/300" alt="Bacn">
<img src="http://www.placebacon.net/400/300" alt="Bacn">
</div>
CSS
.slider {
display: flex;
}
.slider img {
margin: 0 5px;
}
<div>
avec le CSSbackground-image: url(...);background-size:contain; background-repeat:no-repeat
Réponses:
Pour les balises img, si vous définissez un côté, l'autre côté est redimensionné pour conserver les proportions et, par défaut, les images se développent à leur taille d'origine.
En utilisant ce fait, si vous enveloppez chaque balise img dans une balise div et définissez sa largeur à 100% de la div parent, la hauteur sera en fonction du rapport hauteur / largeur souhaité.
http://jsfiddle.net/0o5tpbxg/
la source
Pour empêcher les images de s'étirer dans les deux axes à l'intérieur d'un parent flex, j'ai trouvé quelques solutions.
Vous pouvez essayer d'utiliser object-fit sur l'image qui, par exemple
http://jsfiddle.net/ykw3sfjd/
Ou vous pouvez ajouter des règles flex-specfic qui peuvent mieux fonctionner dans certains cas.
la source
object-fit: contain;
a fait l'affaire pour moi, quand je n'avais que le problème de chrome, ff allait bien.Pas besoin d'ajouter un div contenant.
La valeur par défaut de la propriété css "align-items" est "stretch", ce qui provoque l'étirement de vos images à sa hauteur d'origine. La définition de la propriété css "align-items" sur "flex-start" résout votre problème.
la source
Mais cela ne fonctionne pas comme prévu si les images définies comme éléments flexibles directs avec le module de mise en page de boîte flexible actuel de niveau 1 , pour autant que je sache.
Consultez ces discussions et les rapports de bogue peuvent être liés:
Pour contourner ce problème, vous pouvez encapsuler chacun
<img>
avec un<div>
ou un<span>
, ou deux.jsFiddle
Alternativement, vous pouvez utiliser la
table
mise en page CSS à la place, ce qui vous donnera des résultats similaires carflexbox
cela fonctionnera sur plus de navigateurs, même pour IE8.jsFiddle
la source
.slider > div{min-width:0}
les nouveaux navigateurs prenant en chargemin-width: auto
.auto
valeur comme valeur par défaut pourmin-width
etmin-height
(auparavant0
). Chrome ne le met pas encore en œuvre, votre premier extrait de code fonctionne donc. Mais les nouveaux navigateurs en ont besoin pour permettre aux éléments flexibles de rétrécir plus petit que la largeur par défaut des images.J'ai joué avec flexbox ces derniers temps et j'en suis venu à une solution à travers l'expérimentation et le raisonnement suivant. Cependant, en réalité, je ne sais pas si c'est exactement ce qui se passe.
Si la largeur réelle est affectée par le système flex. Ainsi, une fois que la largeur des éléments a atteint la largeur maximale du parent, la largeur supplémentaire définie dans css est ignorée. Ensuite, il est prudent de définir la largeur à 100%.
Étant donné que la hauteur de la balise img est dérivée de l'image elle-même, régler la hauteur à 0% pourrait faire quelque chose. (c'est là que je ne sais pas quoi ... mais il me semblait logique que cela corrige le problème)
DEMO
(rappelez-vous l'avoir vu ici en premier!)
Fonctionne encore uniquement dans Chrome
la source
auto
". C'est ce qui se passe sur Firefox.Ce comportement est attendu. Le conteneur flex étendra tous ses enfants par défaut. L'image n'a pas d'exception. (c'est-à-dire que le parent aura la
align-items: stretch
propriété)Pour conserver les proportions, nous avons deux solutions:
align-items: stretch
propriété par défaut paralign-items: flex-start
oualign-self: center
etc, http://jsfiddle.net/e394Lqnt/3/ou
align-self: center
oualign-self: flex-start
etc. http://jsfiddle.net/e394Lqnt/2/la source
En fait, j'ai découvert que le conteneur de la balise d'image doit avoir une hauteur pour conserver le rapport de l'image. par exemple>
puis dans votre html votre conteneur emballera l'image de la balise
ce travail pour IE et d'autres navigateurs
la source
J'ai juste eu le même problème. Utilisez l'alignement flex pour centrer vos éléments. Vous devez utiliser à la
align-items: center
place dealign-content: center
. Cela maintiendra le rapport hauteur / largeur, tandis que align-content ne conservera pas le rapport hauteur / largeur.la source