it-roy-ru.com

Оставьте заполнение div оставшимся * горизонтальным * пробелом в flexbox

У меня есть 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>
123
Adam Benson

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

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

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

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


Вы писали:

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

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

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

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

Подробнее см. Фактор flex-shrink в ответе здесь:


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

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

191
Michael_B

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

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

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

enter image description here

.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>
15
Brett84c