Как заполнить последнюю строку фальшивыми элементами в адаптивном макете сетки flexbox?

У нас есть типичная адаптивная сетка flexbox с элементами фиксированной ширины и динамическое количество строк в зависимости от разрешения экрана и количества элементов. Например, предположим, что у нас есть семь <div>, это будет выглядеть примерно так:

Как заполнить последнюю строку фальшивыми элементами в адаптивном макете сетки flexbox?

Нам нужно заполнить последнюю строку «фальшивыми» элементами или заполнителями без лишнего HTML:

Как заполнить последнюю строку фальшивыми элементами в адаптивном макете сетки flexbox?

И, если мы изменим разрешение, оно должно пересчитать необходимые заполнители:

Как заполнить последнюю строку фальшивыми элементами в адаптивном макете сетки flexbox?

Возможно ли это с помощью простого CSS?

Мы используем flexbox, но мы открыты для использования макета CSS Grid, если он решит нашу проблему.

Включите свой код, чтобы показать, что вы уже пробовали.

Hidden Hobbes 30.05.2018 11:21

Не совсем, без JS можно обойтись.

VXp 30.05.2018 11:27

@HiddenHobbes Нам нечего показывать, мы просто думаем, можно ли решить эту проблему с помощью простого CSS. Конечно, у нас есть первый случай, но это просто список div внутри контейнера flexbox.

César García Tapia 30.05.2018 11:28

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

Hidden Hobbes 30.05.2018 11:44

Код @HiddenHobbes требуется только для отладочных вопросов "почему не работает этот код". Вопросы, спрашивающие, как сделать что-то с нуля (или спрашивающие, возможно ли что-то), не требуют кода; они просто необычны, потому что большинство из них слишком широкие. Однако это не так.

TylerH 30.05.2018 15:45

@TylerH Достаточно честно, хотя предоставление кода, который у них был до этого момента, обеспечило бы хорошую отправную точку.

Hidden Hobbes 30.05.2018 15:50
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в 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. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
1
6
748
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Это может быть подход.

Уловка состоит в том, чтобы использовать псевдоэлементы (действующие как заполнители) для репликации каждого элемента в той же позиции на строку ниже. И используйте overflow: hidden, чтобы скрыть последний ряд псевдоэлементов, выходящих за пределы гибкого контейнера. Вот картинка, показывающая смещение и переполнение 3px, чтобы помочь понять идею.

The trick

Но, конечно, у него может быть много недостатков в зависимости от ваших конкретных требований.

ul {
  list-style: none;
  margin: 0;
  padding: 0;
}

.flex {
  display: flex;
  flex-wrap: wrap;
  width: 100%;
  overflow: hidden;
}

li {
  position: relative;
  box-sizing: border-box;
  background: #299CFF;
  width: 3em;
  height: 3em;
  margin: 0.25em;
  text-align: center;
  line-height: 3;
  color: white;
}

li::before {
  position: absolute;
  top: calc(3em + 2 * 0.25em);
  content: "X";
  display: block;
  width: 3em;
  height: 3em;
  background: red;
}
<ul class = "flex">
  <li>0</li>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
  <li>6</li>
  <li>7</li>
  <li>8</li>
  <li>9</li>
  <li>10</li>
  <li>11</li>
  <li>12</li>
  <li>13</li>
  <li>14</li>
  <li>15</li>
  <li>16</li>
  <li>17</li>
  <li>18</li>
  <li>19</li>
  <li>20</li>
  <li>21</li>
  <li>22</li>
  <li>23</li>
  <li>24</li>
  <li>25</li>
  <li>26</li>
  <li>27</li>
  <li>28</li>
  <li>29</li>
  <li>30</li>
  <li>31</li>
  <li>32</li>
  <li>33</li>
  <li>34</li>
  <li>35</li>
  <li>36</li>
  <li>37</li>
  <li>38</li>
  <li>39</li>
  <li>40</li>
  <li>41</li>
  <li>42</li>
  <li>43</li>
  <li>44</li>
  <li>45</li>
  <li>46</li>
  <li>47</li>
  <li>48</li>
  <li>49</li>
</ul>

Это замечательно, но при таком подходе вам нужно знать количество столбцов сетки, а мы этого не делаем, потому что нам нужно, чтобы она реагировала. Наша проблема больше похожа на «хорошо, у нас есть 12 элементов шириной 100 пикселей. Просто создайте сетку в доступном пространстве и заполните последнюю строку фальшивыми элементами».

César García Tapia 30.05.2018 11:57

Не совсем. Это отзывчиво. В иллюстративных целях я зафиксировал ширину контейнеров wide и narrow, но просто взгляните на ручку: codepen.io/jordinebot/pen/qKEdbw

Jordi Nebot 30.05.2018 12:03

Вы абсолютно правы, я внимательно посмотрел на то, что вы здесь делаете, и теперь понимаю это. Блестяще!

César García Tapia 30.05.2018 14:25

Просто чтобы получить правильный ответ: что бы вы сделали, если бы неполная (и единственная) строка была первой? Подхода «дублировать и смещать» было бы недостаточно. Любое предложение?

César García Tapia 30.05.2018 15:00

В этом случае я бы разместил псевдоэлементы справа, а не ниже, но вы должны рассчитать расстояние, чтобы покрыть, по крайней мере, количество реальных элементов, которые должны быть уверены, что вы заполнили весь контейнер. И это будет работать, только если у вас заполнена хотя бы половина строки.

Jordi Nebot 30.05.2018 15:39

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

TylerH 30.05.2018 15:44

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