Заставить div заполнить оставшееся * горизонтальное * пространство во flexbox

205

У меня есть 2 деления бок о бок в flexbox. Правая рука всегда должна быть одинаковой ширины, и я хочу, чтобы левая рука просто занимала оставшееся пространство. Но это не будет, если я специально не установлю его ширину.

Таким образом, на данный момент он установлен на 96%, что выглядит нормально, пока вы действительно не нажмете на экран - тогда правый div немного лишится места, которое ему нужно.

Я думаю, я мог бы оставить все как есть, но это не так - как будто должен быть способ сказать:

правильный всегда один и тот же; Вы слева - вы получаете все, что осталось

.ar-course-nav {
  cursor: pointer;
  padding: 8px 12px 8px 12px;
  border-radius: 8px;
}
.ar-course-nav:hover {
  background-color: rgba(0, 0, 0, 0.1);
}
<br/>
<br/>
<div class="ar-course-nav" style="display:flex; justify-content:space-between;">
  <div style="width:96%;">
    <div style="overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">
      <strong title="Course Name Which is Really Quite Long And Does Go On a Bit But Then When You Think it's Stopped it Keeps on Going for even longer!">
                Course Name Which is Really Quite Long And Does Go On a Bit But Then When You Think it's Stopped it Keeps on Going for even longer!
            </strong>
    </div>
    <div style="width:100%; display:flex; justify-content:space-between;">
      <div style="color:#555555; margin-right:8px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;" title="A really really really really really really really really really really really long department name">
        A really really really really really really really really really really really long department name
      </div>
      <div style="color:#555555; text-align:right; white-space:nowrap;">
        Created: 21 September 2016
      </div>
    </div>
  </div>
  <div style="margin-left:8px;">
    <strong>&gt;</strong>
  </div>
</div>

Адам Бенсон
источник

Ответы:

325

Используйте flex-growсвойство, чтобы гибкий элемент занимал свободное место на главной оси .

Это свойство будет максимально расширять элемент, приспосабливая длину к динамическим средам, таким как изменение размера экрана или добавление / удаление других элементов.

Типичный пример является flex-grow: 1или, используя сокращенное свойство, flex: 1.

Следовательно, вместо width: 96%вашего div, используйте flex: 1.


Вы написали:

Таким образом, на данный момент он установлен на 96%, что выглядит нормально, пока вы действительно не нажмете на экран - тогда правый div немного лишится места, которое ему нужно.

Сведение элемента div с фиксированной шириной связано с другим свойством flex: flex-shrink

По умолчанию для гибких элементов задано значение, flex-shrink: 1которое позволяет им уменьшаться во избежание переполнения контейнера.

Чтобы отключить эту функцию, используйте flex-shrink: 0.

Для получения более подробной информации см В flex-shrinkфактор раздел в ответ здесь:


Узнайте больше о гибком выравнивании вдоль главной оси здесь:

Узнайте больше о гибком выравнивании вдоль поперечной оси здесь:

Майкл Бенджамин
источник
1
У меня была та же самая ситуация, и использование flex-grow: 1не имело таких же эффектов, как flex: 1. Может быть, вы знаете, почему это отличается? (Я исправил свою проблему с последним,
спасибо
4
При flex-grow: 1этом flex-basisсвойство остается autoравным значению по умолчанию. При flex: 1этом flex-basisсвойство изменяется на 0. Смотрите мой ответ здесь для подробного обзора: stackoverflow.com/q/43520932/3597276 @WhGandalf
Майкл Бенджамин,
Flex-Shrink был ключом для меня :)
pixelearth
25

По сути, я пытался заставить свой код иметь среднюю секцию в «строке» для автоматической настройки на содержимое с обеих сторон (в моем случае - разделитель пунктирной линии). Как предложил @Michael_B, ключ используется display:flexв контейнере строк и, по крайней мере, должен убедиться, что ваш средний контейнер в строке имеет flex-growзначение как минимум на 1 больше, чем внешние контейнеры (если к внешним контейнерам не применены какие-либо flex-growсвойства, средний контейнер нужно только 1 для flex-grow).

Вот фотография того, что я пытался сделать, и пример кода для решения.

Изменить: Пунктирная нижняя граница, вероятно, будет выглядеть странно в зависимости от того, как ваш браузер отображает ее. Я лично рекомендовал бы использовать черный кружок SVG в качестве повторяющегося фонового изображения, надлежащего размера и расположенного в нижней части среднего контейнера. Я добавлю это альтернативное решение, когда у меня будет время.

введите описание изображения здесь

.row {
  background: lightgray;
  height: 30px;
  width: 100%;
  display: flex;
  align-items:flex-end;
  margin-top:5px;
}
.left {
  background:lightblue;
}
.separator{
  flex-grow:1;
  border-bottom:dotted 2px black;
}
.right {
  background:coral;
}
<div class="row">
  <div class="left">Left</div>
  <div class="separator"></div>
  <div class="right">Right With Text</div>
</div>
<div class="row">
  <div class="left">Left With More Text</div>
  <div class="separator"></div>
  <div class="right">Right</div>
</div>
<div class="row">
  <div class="left">Left With Text</div>
  <div class="separator"></div>
  <div class="right">Right With More Text</div>
</div>

Brett84c
источник