为方便查看 , 我们让例子中的每个div块高度修改为100% , 并将样式代码修改为:
.item{ height:100%;}.item:first-child{ grid-row-start:1; grid-row-end:span 2;}
在线Demo及完整代码地址:
效果如下:
文章插图
我们对 Grid布局中的第一项添加了 grid-row-start:1和 grid-row-end:span2,令其上边框位于1水平网格线 , 下边框距上边框跨越2个水平网格线 。从效果上看来 , 是不是有点像 瀑布流了呢!
在之前的例子中 , 我们分别指定了 grid-template-columns和 grid-template-rows用于定义几行几列 , 由于行列数的确定 , 其内的每个单元格的宽高也被确定了 , 而实际的 瀑布流布局中 , 宽度是固定的 , 而高度是动态的 , 并且具体的行数也是无法在开始时确定的 , 所以我们需要在 Grid布局中不指定行高(grid-template-rows) 。
介绍另一个属性:
grid-auto-rows:用来设置多余网格的行高
结合刚才说的Grid实现的瀑布流布局中 , 不设置行高(grid-template-rows),此时设置 grid-auto-rows后 , 所有单元格的高度均为 grid-auto-rows指定的值 。
由于 grid-row-start和 grid-row-end可以指定单元格的上边距和下边距位置 , 也就是说可以将单元格的高度拉伸 , 而原有高度由 grid-auto-rows决定 , 我们仅需将 grid-auto-rows设置一个很小的值 , 比如 10px , 然后对其进行拉伸将其高度指定为真实高度 , 每一个单元格都做如下操作 , 那么瀑布流就实现了~
假设第一个单元格内容真实高度为100px , 由于 grid-auto-rows:10px,那么我们可以这样设置:
.item1{ grid-row-start:’auto’; grid-row-end:span 10;}
假设第二个单元格内容真实高度为150px , 由于 grid-auto-rows:10px,那么我们可以这样设置:
.item2{ grid-row-start:’auto’; grid-row-end:span 15;}
当然了 , 在实际情况中 , 瀑布流更多的是为图片的展示而服务的 , 并且由于图片是异步请求加载 , 只有在加载完成后才能获取图片的真实宽高 , 所以不得不使用JS来动态将单元格高度进行拉伸 。
伪代码如下:
//image-dom let img = document.getElementsByTagName(‘img’)[0]; //image-dom 当前宽度 let width = img.width; let image = new Image(); image.src = https://www.fajihao.com/i/‘xxxx.img’; image.onload = function(){ //图片原宽 let w = image.width; //图片原高 let h = image.height; //image-dom的真实高度(依据当前宽度及图片真实宽高) let height = Math.round(h * width / w) //设置当前跨越几个网格(每个网格10px) img.style.gridRowEnd = `span ${~~(height/10)}` }
在线Demo及完整代码地址:
效果如下:
文章插图
Flexbox 实现瀑布流
Flexbox布局到今天已经是使用非常广泛的 , 也算是很成熟的一个特性 。在此就不再介绍 Flexbox布局的相关内容 , 如果还有不是很了解的朋友 , 可参见阮一峰的《Flex 布局教程:语法篇》(http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html)
那接下来我们就看 Flexbox怎么实现瀑布流布局 。
此时 , 我们需要将html结构设计成如下结构:
上面代码中 div.masonry代表当前瀑布流容器 , div.column代表每一列的容器 , div.item代表每一列中的每一项 。
我们需要将 div.masonry和 div.column都通过 display:flex将其设置为 Flex容器 。
不同的是 瀑布流容器主轴方向设置为水平方向 flex-direction:row, 列容器主轴方向设置为垂直方向 flex-direction:column
.masonry { display: flex; // 设置为Flex容器 flex-direction: row; // 主轴方向设置为水平方向} .column { display: flex; // 设置为Flex容器 flex-direction: column; // 主轴方向设置为垂直方向}
由于当前的html结构分为了 瀑布流容器和 列容器 , 并且常见的需求图片均是 从左至右再 从上到下来进行排列 , 所以需要通过 Javascript来区分每一列的具体数据:
假设分为三列 , 伪代码如下:
- 快手推广有效果吗 快手40块钱推广有用吗
- 醋对甲醛有没有效果
- 1500左右的手机哪款拍照效果好
- 什么洗发水去屑止痒效果好 去屑止痒洗发水排行榜
- 如何敷面膜效果最好
- 引流推广效果好的app 引流推广软件
- 小型便利店装修设计 便利店装修效果图大全
- 美白化妆品排行榜 什么化妆品美白效果比较好
- 说说你家小学生的网课效果怎么样呢
- 用ps做雾化效果怎么做的啊