如何使用砌体布局和小部件的特定顺序响应小部件页面?

How to responsive widget page with masonry layout and specific order of widgets?

提问人:Jammar 提问时间:11/14/2023 更新时间:11/14/2023 访问量:26

问:

我希望能够呈现不同高度的小部件(框,从这里开始),但对于特定的位置,它们会根据页面数据而有所不同(应该呈现哪些框,以及哪个顺序 + 高度可以不同)

我不想在盒子之间或盒子内有任何不必要的空间。这是最难的部分!因为如果将盒子放在行中,则一行是固定高度(通常是该行上最高项目的高度)。

以下是我想要实现的目标的两个示例:

example-1example-2

example-1 和 example-2

请注意方框上的不同高度,以及第 1 列如何只有方框 1。

我知道唯一可以做到这一点的方法是有两列(左和右),然后 flexbox 在每列中呈现框。好。

但是,问题来了:

在较小的屏幕尺寸(移动设备)上,我只想要一列。我希望这些框在同一列中,这样我就可以安排它们的顺序。例如,像这样:

example-3

示例-3

注意 box-3 是如何被推到顶部的。

我已经尝试过的

我一直在尝试必须完全不同的渲染,具体取决于断点,但这会使框在更改窗口宽度时重新渲染,这并不理想,因为这会使它们闪烁甚至重新获取数据。

  • pureCSS:css-grid,不适用于通常的行,因为这是一个固定的高度。可以使用两个严格的列,然后每个框内都有自己的行,以便在其中灵活呈现。但是,在转到移动视图(1 列)时,这需要重新渲染框,因为排序不起作用(框 1 与框 2-3-4 分开)

  • pureCSS:flexbox,还需要两个单独的 flexbox 容器(每列一个),它们不会对项目进行排序

  • 砌体:唯一的问题是不让我订购物品!!并且还用 box-2 填充第一列(参见示例)。否则效果很好。

  • react-grid-layout:效果很好,但是,盒子的 dynamicHeight 有问题。假设数据很大,那么小部件/组件高度就会卡住。

如果这很重要,我正在使用 react。也许我可以有两种不同的渲染(桌面 2 列 / 移动 1 列),如果有一种方法可以渲染同一个盒子但在 dom 的不同位置(因此不会让它们重新渲染)?

非常感谢任何有助于更好地理解这个问题的帮助,谢谢。

javascript css reactjs flexbox css-grid

评论


答:

1赞 CBroe 11/14/2023 #1

CSS 列将是实现此目的的简单方法。让第二个元素进入第二列,即使第一个元素下方仍有可用空间,也可以使用以下方法轻松实现:break-before: column

ul {
  columns: 2
}

li {
  width: 50px;
  height: 50px;
  outline: 1px dashed red;
}

li:nth-child(2) {
  break-before: column;
}
<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
</ul>

为了让它在移动设备上看起来不同,请改用那里,这样您就可以将元素 #3 移动到前面。flexorder

编辑:似乎在Firefox中尚未工作。break-before: column

不同的方法:将元素放入两个容器元素中,以便能够轻松获取桌面视图。

对于移动视图,您可以使用以下命令“溶解”这些包装器 - 然后这些项目将再次表现得好像它们只是一个父项的子项 (),您可以再次使用:display: contents.outerorder

.outer {
  display: flex;
  flex-direction: column;
}

.outer div {
  display: contents
}

.foo {
  order: -1
}
<div class="outer">
  <div>
    <span>1</span>
  </div>
  <div>
    <span>2</span>
    <span class="foo">3</span>
    <span>4</span>
  </div>
</div>

评论

0赞 CBroe 11/14/2023
“可以使用break-before:column轻松实现” - 哦,我只是意识到Firefox显然还不支持这一点。
0赞 Jammar 11/14/2023
感谢您的回复,这解决了部分问题,但不允许订购项目(见图片示例-3)。columns
1赞 CBroe 11/14/2023
这就是为什么我说使用 flex 而不是移动列的原因:-)
0赞 CBroe 11/14/2023
我编辑了问题并添加了一种不同的方法,该方法确实为桌面视图使用两个包装元素 - 对于移动视图,它们使用display: contents
0赞 Jammar 11/16/2023
感谢您的努力 CBroe,这不起作用,因为我需要它来工作。给了我一些关于如何继续更改显示的想法:x,在移动设备中。但目前还没有解决方案。