Flex-wrap: ширина теперь не включает дочерние элементы

Разве флексбокс с flex-wrap: nowrap не должен быть шириной его дочерних элементов?

По какой-то причине это только ширина его родителя. Можно ли заставить его получить ширину своих дочерних элементов?

В этот код вы можете видеть, что фон не распространяется на всю ширину всех дочерних элементов.

.flex {
  display: flex;
  flex-wrap: nowrap;
  background-color: lightblue;
}

.flex div {
  flex-basis: 75%;
  flex-shrink: 0;
}
<div class = "flex">
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
</div>

Редактировать: Я использовал "должен", предполагая, что типичный div с white-space: nowrap, примененным к встроенным дочерним элементам, будет расти, чтобы вместить свои дочерние элементы; однако это тоже не похоже на правду (https://codepen.io/robgordon/pen/gEvjpL).

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

Bryce Howitson 14.03.2019 19:52

background-color так не работает. stackoverflow.com/q/45497031/3597276

Michael Benjamin 14.03.2019 20:05

применение одного inline-flex не является решением для этого конкретного случая, потому что flex-basis используется с процентным соотношением, поэтому решение/объяснение включает в себя больше, чем просто inline-flex, поэтому это не дубликат

Temani Afif 15.03.2019 15:14
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
7
3
1 124
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш элемент является блочным элементом, что означает, что его ширина составляет 100% ширины содержащего его блока, и в данном случае это элемент body.

Добавьте границу к элементу body, чтобы лучше видеть:

.flex {
  display: flex;
  flex-wrap: nowrap;
  background-color: lightblue;
}

.flex div {
  flex-basis: 75%;
  flex-shrink: 0;
}

body {
  border:2px solid green;
}
<div class = "flex">
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
</div>

То же самое можно сказать и об элементе body, если вы добавите границу в html, поскольку он также является блочным элементом:

.flex {
  display: flex;
  flex-wrap: nowrap;
  background-color: lightblue;
}

.flex div {
  flex-basis: 75%;
  flex-shrink: 0;
}

body {
  border:2px solid green;
}
html {
  border:2px solid red;
}
<div class = "flex">
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
</div>

Таким образом, все ваши элементы ограничены размером вашего экрана. Из спецификация у нас есть это правило:

'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' = width of containing block

Поскольку у нас нет отступов/маржа/границы, у нас будет width = width of containing block.

Эта логика применяется ко всем нашим элементам, пока мы не достигнем области просмотра:

The containing block in which the root element lives is a rectangle called the initial containing block. For continuous media, it has the dimensions of the viewport and is anchored at the canvas origin; it is the page area for paged media. The 'direction' property of the initial containing block is the same as for the root element.


Кроме того, в вашем случае нет возможности содержать все элементы просто потому, что вы определяете ширину своих элементов, используя процент, который (во всех случаях) будет больше, чем родитель. У вас есть 4*75%, который всегда больше, чем 100%.

Итак, что бы вы ни делали, у вас всегда будет переполнение:

.flex {
  display: flex;
  flex-wrap: nowrap;
  background-color: lightblue;
}

.flex div {
  flex-basis: 75%;
  flex-shrink: 0;
}

body {
  border:2px solid green;
}
<div class = "flex" style = "display:inline-flex">
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
</div>

<div class = "flex" style = "width:50%;">
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
</div>

<div class = "flex" style = "width:500%;">
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
</div>

<div class = "flex" style = "width:200px;">
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
</div>

Но если ширина определяется, например, с помощью пикселя (давайте рассмотрим 500 пикселей), то родительский элемент может содержать дочерний элемент с настройкой inline-flex.

.flex {
  display: flex;
  flex-wrap: nowrap;
  background-color: lightblue;
}

.flex div {
  width: 500px;
  flex-shrink: 0;
}

body {
  border:2px solid green;
}
<div class = "flex" style = "display:inline-flex">
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
</div>

<div class = "flex" >
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
</div>

В этом случае ширина представляет собой ширину Уменьшать до размеров, описанную ниже:

Calculation of the shrink-to-fit width is similar to calculating the width of a table cell using the automatic table layout algorithm. Roughly: calculate the preferred width by formatting the content without breaking lines other than where explicit line breaks occur, and also calculate the preferred minimum width, e.g., by trying all possible line breaks. CSS 2.1 does not define the exact algorithm. Thirdly, find the available width: in this case, this is the width of the containing block minus the used values of 'margin-left', 'border-left-width', 'padding-left', 'padding-right', 'border-right-width', 'margin-right', and the widths of any relevant scroll bars.

Then the shrink-to-fit width is: min(max(preferred minimum width, available width), preferred width).


Обратите внимание, что использование flex-basis со значением в пикселях не даст того же результата, что и width

.flex {
  display: flex;
  flex-wrap: nowrap;
  background-color: lightblue;
}

.flex div {
  flex-basis: 500px;
  flex-shrink: 0;
}

body {
  border:2px solid green;
}
<div class = "flex" style = "display:inline-flex">
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
</div>

<div class = "flex" >
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
  <div>hi</div>
</div>

Подробнее здесь: https://stackoverflow.com/a/34355447/8620333


nowrap is the default value of flex-wrap so it can be omitted in the below examples

Другие вопросы по теме