【问题标题】:How to fill out the last row with fake items in a responsive flexbox grid layout?如何在响应式 flexbox 网格布局中用假项目填充最后一行?
【发布时间】:2018-11-09 01:56:20
【问题描述】:

我们有典型的响应式 flexbox 网格,具有固定宽度的元素和动态的行数,基于屏幕分辨率和项目数。例如,假设我们有七个<div>s,它将显示如下内容:

我们需要用“假”项目或占位符来完成最后一行,而不需要额外的 HTML:

而且,如果我们改变分辨率,它应该重新计算所需的占位符:

这甚至可以用纯 CSS 实现吗?

我们正在使用 flexbox,但如果它可以解决我们的问题,我们也愿意使用 CSS 网格布局。

【问题讨论】:

  • 请包含您的代码以显示您到目前为止所尝试的内容。
  • 不是真的,不用JS也可以。
  • @HiddenHobbes 我们没有什么可展示的,我们只是在考虑是否可以使用纯 CSS 来解决它。当然,我们有第一种情况,但它只是一个 flexbox 容器中的 div 列表。
  • 请您将其包括在内,因为它总比没有好,并为任何更改提供一个起点。
  • @HiddenHobbes 代码仅用于“为什么此代码不起作用”调试问题。询问如何从头开始做某事(或询问某事是否可能)的问题不需要代码;它们并不常见,因为大多数都太宽泛了。然而,这个不是。

标签: css flexbox responsive


【解决方案1】:

这可能是一种方法。

诀窍是使用伪元素(充当占位符)复制下一行相同位置的每个项目。并使用overflow: hidden 隐藏位于弹性容器之外的最后一行伪元素。这是一张显示3px 位移和溢出的图片,以帮助理解这个想法。

但是,当然,根据您的具体要求,它可能有很多缺陷。

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 像素宽的项目。只需在可用空间中构建网格并用假元素完成最后一行”。
  • 不完全是。这是响应式的。出于说明目的,我固定了 widenarrow 容器的宽度,但请看一下笔:codepen.io/jordinebot/pen/qKEdbw
  • 您说的完全正确,我仔细研究了您在这里所做的事情,现在我明白了。太棒了!
  • 只是为了得到正确的答案:如果不完整的(也是唯一的)行是第一行,你会怎么做? “复制和替换”方法是不够的。有什么建议吗?
  • 在这种情况下,我会将伪元素放置在右侧,而不是下方,但是您应该计算距离以至少覆盖您必须确保填充的实际项目数量整个容器。这只有在您至少填满半行时才有效。
猜你喜欢
  • 2016-12-23
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
相关资源
最近更新 更多