提问人:Jammar 提问时间:11/14/2023 更新时间:11/14/2023 访问量:26
如何使用砌体布局和小部件的特定顺序响应小部件页面?
How to responsive widget page with masonry layout and specific order of widgets?
问:
我希望能够呈现不同高度的小部件(框,从这里开始),但对于特定的位置,它们会根据页面数据而有所不同(应该呈现哪些框,以及哪个顺序 + 高度可以不同)
我不想在盒子之间或盒子内有任何不必要的空间。这是最难的部分!因为如果将盒子放在行中,则一行是固定高度(通常是该行上最高项目的高度)。
以下是我想要实现的目标的两个示例:
example-1 和 example-2
请注意方框上的不同高度,以及第 1 列如何只有方框 1。
我知道唯一可以做到这一点的方法是有两列(左和右),然后 flexbox 在每列中呈现框。好。
但是,问题来了:
在较小的屏幕尺寸(移动设备)上,我只想要一列。我希望这些框在同一列中,这样我就可以安排它们的顺序。例如,像这样:
示例-3
注意 box-3 是如何被推到顶部的。
我已经尝试过的
我一直在尝试必须完全不同的渲染,具体取决于断点,但这会使框在更改窗口宽度时重新渲染,这并不理想,因为这会使它们闪烁甚至重新获取数据。
pureCSS:css-grid,不适用于通常的行,因为这是一个固定的高度。可以使用两个严格的列,然后每个框内都有自己的行,以便在其中灵活呈现。但是,在转到移动视图(1 列)时,这需要重新渲染框,因为排序不起作用(框 1 与框 2-3-4 分开)
pureCSS:flexbox,还需要两个单独的 flexbox 容器(每列一个),它们不会对项目进行排序
砌体:唯一的问题是不让我订购物品!!并且还用 box-2 填充第一列(参见示例)。否则效果很好。
react-grid-layout:效果很好,但是,盒子的 dynamicHeight 有问题。假设数据很大,那么小部件/组件高度就会卡住。
如果这很重要,我正在使用 react。也许我可以有两种不同的渲染(桌面 2 列 / 移动 1 列),如果有一种方法可以渲染同一个盒子但在 dom 的不同位置(因此不会让它们重新渲染)?
非常感谢任何有助于更好地理解这个问题的帮助,谢谢。
答:
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 移动到前面。flex
order
编辑:似乎在Firefox中尚未工作。break-before: column
不同的方法:将元素放入两个容器元素中,以便能够轻松获取桌面视图。
对于移动视图,您可以使用以下命令“溶解”这些包装器 - 然后这些项目将再次表现得好像它们只是一个父项的子项 (),您可以再次使用:display: contents
.outer
order
.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>
评论
columns
display: contents
评论