我需要实现一个砖石结构的布局。但是,由于一些原因,我不想使用JavaScript来实现它。
参数:
- 所有元素具有相同的宽度
- 元素具有无法在服务器端计算的高度(图像加上各种数量的文本)
- 如果需要,我可以使用固定的列数
有一个在现代浏览器the column-count
property.中工作的简单解决方案
该解决方案的问题在于元素按列排序:
虽然我需要元素按行排序,但至少大致是这样:
我尝试过但不起作用的方法:
- 制作物品
display: inline-block
:wastes vertical space. - 制作物品
float: left
:lol, no.
现在我 * 可以 * 更改服务器端呈现并重新排序项目,将项目数除以列数,但这很复杂,容易出错(基于浏览器如何决定将项目列表拆分为列),所以如果可能的话,我希望避免使用它。
是否有一些flexbox魔术,使这成为可能?
4条答案
按热度按时间monwx1rj1#
2021更新
CSS网格布局级别3包含
masonry
功能。代码如下所示:
截至2021年3月,它只在Firefox中可用(激活国旗后)。
柔性盒
动态砖石布局是不可能的flexbox,至少不能在一个干净和有效的方式。
弹性框是一维布局系统。这意味着它可以沿水平线或垂直线对齐项目。弹性项目被限制在其行或列中。
真正的网格系统是二维的,这意味着它可以沿水平线和垂直线对齐项。内容项可以同时跨越行和列,而Flex项不能做到这一点。
这就是为什么flexbox构建网格的能力有限,也是为什么W3C开发了另一种CSS3技术Grid Layout的原因。
一个月一个月
在
flex-flow: row wrap
的flex容器中,flex项必须换到新的 * 行 。这意味着弹性项目不能在同一行中的另一个项目下换行*。
注意上面 * div #3 * 是如何在 * div #1 * 下面换行的,创建了一个新行。它不能在 * div #2 * 下面换行。
因此,当项目不是行中最高的项目时,空白会保留下来,从而产生难看的间隙。
column wrap
如果您切换到
flex-flow: column wrap
,则更容易获得类似网格的布局。但是,列方向容器立即存在四个潜在问题:1.容器水平展开,而不是垂直展开(与Pinterest布局类似)。
1.在撰写本文时,它在所有主流浏览器中都存在缺陷。
因此,在这种情况下以及在许多其他情况下,列方向容器都不是一个选项。
CSS网格 * 未定义项目维度 *
网格布局将是一个完美的解决方案,您的问题 * 如果各种高度的内容项目可以预先确定 *。所有其他要求都在网格的能力范围内。
网格项目的宽度和高度必须已知,以便与周围项目闭合间隙。
因此,Grid(CSS为构建水平流动的砖石布局所提供的最佳工具)在这种情况下显得力不从心。
事实上,在CSS技术能够自动填补空白之前,CSS通常没有解决方案。像这样的事情可能需要重排文档,所以我不确定它是否有用或有效。
你需要一个剧本。
JavaScript解决方案倾向于使用绝对定位,它从文档流中删除内容项,以便重新排列它们,使它们之间没有间隙。
Masonry是一个JavaScript网格布局库,它的工作原理是根据可用的垂直空间将元素放置在最佳位置,有点像泥瓦匠在墙上安装石头。
[Pinterest]真的是一个很酷的网站,但我觉得有趣的是这些插接板是如何布局的...所以本教程的目的是重新创建这种响应块效果自己...
CSS网格 *,已定义项目维度 *
对于内容项的宽度和高度已知的布局,下面是一个纯CSS的水平流砖石布局:
x一个一个一个一个x一个一个二个x
∮ ∮ ∮ ∮
1.建立块级网格容器(
inline-grid
是另一个选项)。1.* *
grid-auto-rows
*属性设置自动生成行的高度。在此网格中,每行的高度为50px。1. *
grid-gap
*属性是grid-column-gap
和grid-row-gap
的缩写。此规则在 * 网格项目之间设置10px的间距。(它不适用于项目和容器之间的区域。)1. *
grid-template-columns
**属性设置显式定义的列的宽度。repeat
**符号定义了重复列(或行)的模式。auto-fill
**函数告诉网格在不溢出容器的情况下排列尽可能多的列(或行)。(这可以创建与flex布局的flex-wrap: wrap
类似的行为。)minmax()
**函数为每列(或行)设置最小和最大大小范围。在上面的代码中,每列的宽度最小为容器的30%,最大为可用空间。fr
**单位表示网格容器中可用空间的一部分,相当于flexbox的flex-grow
属性。1.使用**
grid-row
和span
**,我们告诉网格项它们应该跨越多少行。以下是完整的情况:www.example.comhttp://caniuse.com/#search=grid
在Firefox开发工具中,当你检查网格容器时,在CSS声明中有一个很小的网格图标,点击它会在页面上显示网格的轮廓。
更多详情请点击此处:https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/Examine_grid_layouts
bq9c1y662#
这是最近发现的技术涉及flexbox:https://tobiasahlin.com/blog/masonry-with-css/.
这篇文章对我来说有意义,但我还没有尝试使用它,所以我不知道是否有任何警告,除了迈克尔的回答中提到的。
下面是本文中的一个示例,它结合使用了
order
属性和:nth-child
。堆栈代码段
cbwuti443#
我发现这个解决方案,它是最有可能与所有浏览器兼容.
column-count, gap, fillbreak-inside,page-break-inside
注意:
page-break-inside
此属性已替换为break-inside
属性。pftdvrlh4#
最后一个CSS的解决方案,可以轻松地创建砖石布局,但我们需要耐心,因为目前还没有支持它。
此功能是在CSS网格布局模块级别3中引入的
本模块介绍砖石布局作为CSS网格容器的附加布局模式。
然后
通过为网格容器的一个轴指定值砖石,网格容器支持砖石布局。此轴称为砖石轴,另一个轴称为网格轴。
一个基本的例子是:
如果您按如下所述启用该功能,将在Firefox上产生以下结果:https://caniuse.com/?search=masonry
1.打开Firefox并在URL栏中写入:config
1.用砖石建筑进行搜索
1.你会得到一面旗,让它成真
如果我们缩小屏幕,React部分是完美的!