Чому flexbox розтягує мій образ, а не зберігає співвідношення сторін?


156

Flexbox має таку поведінку, коли він розтягує зображення до їх природного зросту. Іншими словами, якщо у мене є контейнер flexbox із дочірнім зображенням, і я змінюю його ширину, то висота зовсім не змінюється, і зображення розтягується.

div {
  display: flex; 
  flex-wrap: wrap;
}
img{ 
  width: 50%
}
<div>
    <img src="https://loremflickr.com/400/300" >
    <h4>Appify</h4>
    <p> some text </p>
</div>

Що це викликає?

Я додав цей CodePen, щоб продемонструвати, що я маю на увазі.


5
У Firefox і IE відмінно працює. У Chrome ви можете виправити align-self:flex-start зображення. Я не знаю чому, можливо, значення за замовчуванням у хромі - це розтягнення.

2
Також додавання висоти: 100%; щоб img виправляв проблему, я хотів би знати, чому він також розтягує зображення.
Paran0a

3
@blonfu, типовим значенням у всіх браузерах є align-items: stretch/ align-self: stretch. Якщо додати межу навколо кожного елемента та видалити wrap, ви помітите, що всі елементи розтягуються у всіх браузерах: codepen.io/anon/pen/oLXBVx?editors=1100
Michael Benjamin

Добре, я знаю це, але з зображеннями працюють по-різному в хромі та інших браузерах. Chrome не поважає співвідношення сторін, якщо ви не визначаєте висоту.

@blonfu, так. Немає сумнівів, є невідповідності браузера та більш деталізовані рівні.
Майкл Бенджамін

Відповіді:


365

Він розтягується, оскільки align-selfзначення за замовчуванням є stretch. Набір align-selfдля center.

align-self: center;

Дивіться документацію тут: align-self


Так, але інші браузери підтримують співвідношення сторін у зображеннях. Chrome не застосовує flex-

9
Я думаю, що це align-self: start;може бути сильнішою відповіддю, оскільки зображення повинні вертикально вирівнюватися до ТОП своїх контейнерів (а не в центрі), як будь-яке стиле зображення (без css). Так чи інакше, обидві відповіді фіксують розтяжку. Отже, це залежить від того, чого хоче, звичайно, ОП - просто не склалося такого вертикально-орієнтованого враження від посади ОП.
жаба

Якщо ви не визначите ширину на зображенні, а воно знаходиться у flex-контейнері, воно розтягнеться до 100%. align-self: [flex-start, center...others]не дасть зображенню зайняти 100% ширини гнучких контейнерів. align-self:centerвиправляє це, звичайно, але якщо ви хочете, щоб ваше зображення починалося з початку або в кінці використання контейнерівalign-items: flex-start or flex-end
cacoder

1
Ви також можете поставити align-items: center(або будь-яке вирівнювання, що відповідає вашим потребам) на батьків.
електровір

16

Ключовий атрибут align-self: center:

.container {
  display: flex;
  flex-direction: column;
}

img {
  max-width: 100%;
}

img.align-self {
  align-self: center;
}
<div class="container">
    <p>Without align-self:</p>
    <img src="http://i.imgur.com/NFBYJ3hs.jpg" />
    <p>With align-self:</p>
    <img class="align-self" src="http://i.imgur.com/NFBYJ3hs.jpg" />
</div>


1

Я зіткнувся з тим же питанням із меню Фонду. align-self: center;не працювало для мене.

Моїм рішенням було обернути зображення символом a <div style="display: inline-table;">...</div>


2
Хоча про флексбокс.

Це є рішенням для Flexbox. Зображення та div знаходяться всередині контейнера flexbox.
isapir

0

Додавання marginдля вирівнювання зображень:

Оскільки ми хотіли imageбути left-aligned, ми додали:

img {
  margin-right: auto;
}

Точно так же для imageбути right-aligned, ми можемо додати margin-right: auto;. У фрагменті відображається демонстрація обох типів вирівнювання.

Щасти...

div {
  display:flex; 
  flex-direction:column;
  border: 2px black solid;
}

h1 {
  text-align: center;
}
hr {
  border: 1px black solid;
  width: 100%
}
img.one {
  margin-right: auto;
}

img.two {
  margin-left: auto;
}
<div>
  <h1>Flex Box</h1>
  
  <hr />
  
  <img src="https://via.placeholder.com/80x80" class="one" 
  />
  
  
  <img src="https://via.placeholder.com/80x80" class="two" 
  />
  
  <hr />
</div>


0

Це розтягнення, оскільки значенням за замовчуванням для вирівнювання є розтягнення. Для цього випадку є два рішення: 1. встановити img align-self: center OR 2. set parent-elements-elements: center

img {

   вирівнювати-само: центр
}

АБО

чітко {
  вирівнювати-елементи: центр
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.