Używając modelu CSS flex box, jak zmusić obraz do zachowania proporcji?
JS Fiddle: http://jsfiddle.net/xLc2Le0k/2/
Zwróć uwagę, że obrazy rozciągają się lub kurczą, aby wypełnić szerokość pojemnika. W porządku, ale czy możemy też rozciągnąć lub zmniejszyć wysokość, aby zachować proporcje obrazu?
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>
z CSSbackground-image: url(...);background-size:contain; background-repeat:no-repeat
Odpowiedzi:
W przypadku tagów img, jeśli zdefiniujesz jedną stronę, rozmiar drugiej strony zostanie zmieniony, aby zachować proporcje i domyślnie obrazy będą rozszerzane do ich oryginalnego rozmiaru.
Korzystając z tego faktu, jeśli zawiniesz każdy znacznik img w znacznik div i ustawisz jego szerokość na 100% nadrzędnego elementu div, wówczas wysokość będzie zgodna z proporcjami zgodnie z oczekiwaniami.
http://jsfiddle.net/0o5tpbxg/
źródło
Aby zapobiec rozciągnięciu obrazów w obu osiach wewnątrz elastycznego rodzica, znalazłem kilka rozwiązań.
Możesz spróbować dopasować obiekt do obrazu, który np
http://jsfiddle.net/ykw3sfjd/
Lub możesz dodać reguły specyficzne dla flex, które mogą działać lepiej w niektórych przypadkach.
źródło
object-fit: contain;
załatwił mi sprawę, gdy miałem tylko problem w chrome, ff było w porządku.Nie ma potrzeby dodawania zawierającego div.
Domyślną właściwością css „align-items” jest „stretch”, co powoduje rozciąganie obrazów do pełnej pierwotnej wysokości. Ustawienie właściwości css „align-items” na „flex-start” rozwiązuje problem.
źródło
Ale to nie działa zgodnie z oczekiwaniami, jeśli obrazy, które są ustawiane jako bezpośrednie elementy flex z aktualnym modułem układu elastycznego pudełka na poziomie 1 , o ile wiem.
Zobacz te dyskusje, a raporty o błędach mogą być powiązane:
Aby obejść ten problem, możesz owinąć każdy
<img>
znak a<div>
lub a<span>
, lub tak.jsFiddle
Alternatywnie możesz
table
zamiast tego użyć układu CSS, co da podobne wynikiflexbox
, ponieważ będzie działać na większej liczbie przeglądarek, nawet dla IE8.jsFiddle
źródło
.slider > div{min-width:0}
w nowych przeglądarkach, które obsługująmin-width: auto
.auto
wartość jako domyślną wartość dlamin-width
imin-height
(poprzednio była0
). Chrome jeszcze go nie implementuje, więc Twój pierwszy fragment kodu działa. Ale nowe przeglądarki potrzebują tego, aby umożliwić kurczenie elementów elastycznych do rozmiaru mniejszego niż domyślna szerokość obrazów.Ostatnio bawiłem się flexboksem i doszedłem do rozwiązania tego problemu poprzez eksperymenty i następujące rozumowanie. Jednak w rzeczywistości nie jestem pewien, czy dokładnie tak się dzieje.
Jeśli system flex ma wpływ na rzeczywistą szerokość. Więc po osiągnięciu maksymalnej szerokości elementu rodzica dodatkowa szerokość ustawiona w css jest ignorowana. Wtedy można bezpiecznie ustawić szerokość na 100%.
Ponieważ wysokość tagu img pochodzi z samego obrazu, ustawienie wysokości na 0% może coś zrobić. (tutaj nie jestem pewien, co ... ale dla mnie miało sens, że powinien to naprawić)
PRÓBNY
(pamiętaj, że zobaczyłem to najpierw tutaj!)
Działa jeszcze tylko w chromie
źródło
auto
„. Tak dzieje się w przeglądarce Firefox.Takie zachowanie jest oczekiwane. flex container domyślnie rozciągnie wszystkie swoje elementy podrzędne. Obraz nie ma wyjątku. (tj. rodzic będzie miał
align-items: stretch
własność)Aby zachować proporcje, mamy dwa rozwiązania:
align-items: stretch
właściwość domyślną naalign-items: flex-start
lubalign-self: center
itp., Http://jsfiddle.net/e394Lqnt/3/lub
align-self: center
lubalign-self: flex-start
itp http://jsfiddle.net/e394Lqnt/2/źródło
Właściwie dowiedziałem się, że pojemnik z tagiem obrazu musi mieć wysokość, aby zachować proporcje obrazu. na przykład>
wtedy w twoim html twój kontener zawinie obraz tagu
to działa dla IE i innych przeglądarek
źródło
Po prostu miałem ten sam problem. Użyj wyrównania flex, aby wyśrodkować elementy. Musisz użyć
align-items: center
zamiastalign-content: center
. Pozwoli to zachować proporcje, a align-content nie zachowa proporcji.źródło