Подтвердить что ты не робот

Firefox flexbox ширина изображения

У меня возникли проблемы с получением моего изображения, чтобы получить не более 100% доступной ширины родительского контейнера. Я только замечаю проблему в Firefox 36 (не IE или Chrome). Так это ошибка firefox или я что-то пропустил здесь?

Примечание. Изображение никогда не должно быть больше оригинального размера.

Chrome:

enter image description here

Firefox:

enter image description here

<!DOCTYPE html>
<html>
  <head>
    <style type="text/css">
.container {
  width:300px;
}
.flexbox {
  display:flex;
}

.flexbox .column {
  flex:1;
  background-color: red;
}

.flexbox .middleColumn {
  flex:3;
}

.flexbox .middleColumn img {
  width:auto;
  height:auto;
  max-width:100%;
  max-height:100%;
  align-self: center;
  display: block;
}
    </style>
  </head>
  <body>
    <div class="container">
      <div class="flexbox">
        <div class="column">This is the left column!</div>
        <div class="middleColumn">
          <img src="http://placehold.it/400/333333">
        </div>
        <div class="column">This is the right column!</div>
      </div>
    </div>
  </body>
</html>
4b9b3361

Ответ 1

Вам нужно добавить min-width:0 в .middleColumn, если вы хотите разрешить ему сжиматься ниже своей минимальной ширины (внутренняя ширина его <img> -child).

В противном случае он получит новый min-width:auto по умолчанию, который на элементе flex в основном заставит отказаться от сжатия ниже его размера, уменьшенного при сжатии.

(Chrome пока не реализовал min-width:auto. Мне сказали, что IE имеет в своем движке рендеринга следующего поколения, поэтому я 'd ожидать, что версия должна вести себя как Firefox здесь - как и Chrome, как только они реализуют эту функцию.)

Фрагмент с фиксированным:

<!DOCTYPE html>
<html>
  <head>
    <style type="text/css">
.container {
  width:300px;
}
.flexbox {
  display:flex;
}

.flexbox .column {
  flex:1;
  background-color: red;
}

.flexbox .middleColumn {
  flex:3;
  min-width:0;
}

.flexbox .middleColumn img {
  width:auto;
  height:auto;
  max-width:100%;
  max-height:100%;
  align-self: center;
  display: block;
}
    </style>
  </head>
  <body>
    <div class="container">
      <div class="flexbox">
        <div class="column">This is the left column!</div>
        <div class="middleColumn">
          <img src="http://placehold.it/400/333333">
        </div>
        <div class="column">This is the right column!</div>
      </div>
    </div>
  </body>
</html>

Ответ 2

Я должен признать, что я не уверен, почему, но почему-то в Firefox кажется, что вы должны дать изображению ширину/высоту (то есть нечто иное, чем "авто" ). Наш старый друг 100%, похоже, делает трюк:

.flexbox .middleColumn img {
    width: 100%;
    height: 100%;
    display: block;
}

Вот скрипка, показывающая рабочее решение. Обратите внимание, что я изменил боковые столбцы на flex:2, чтобы сделать результат более очевидным.

Ответ 3

Мне кажется, что это работает со следующим:

.flexbox {
  display:flex;
}
.flexbox .column {
  flex:1 1 0;
  overflow:hidden;
  background-color: red;
}

.flexbox .middleColumn {
  flex-grow:3;
  flex-shrink:3;
}

.flexbox .middleColumn img {
  max-width:100%;
}

настройка flex:1 1 0; для всех столбцов позволяет им одинаково расти и делать это с четного и минимального базиса 0px.

Затем вы переопределяете рост и сжатие на .middleColumn

max-width:100%; требуется как обычно

волшебство кажется overflow:hidden; на предмет сгибания элемента.

другие вещи на изображении не нужны.

Ответ 4

По моему опыту, подход немного отличается, может быть, странным, но он работает. В основном, я фиксирую максимальную ширину до реальной ширины изображения, поэтому она не будет пикселировать и использовать процентную ширину вместо максимальной ширины. Если у вас есть, скажем, контейнер <ul> (flex), ячейки будут:

li{
   flex-grow: 0;
   flex-shrink: 1;
   flex-basis: auto;
   width: 50%; // for example..

   img{
     display: block;
     max-width: [your real img width in px] // instead of 100%;
     width:100%; // instead of max-width
   }
}