当前第2页 返回上一页
核心操作就是维护每个元素的 left、top,然后使用 left 和 top 去渲染到正确位置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | getListPosition(){
let col = this .screenWidth / this .itemWidth >> 0;
var arr = [];
for ( var i = 0; i < col; i++) arr.push({
list: [],
height: 0,
})
this .listInfo.forEach((item,idx)=>{
var colIndex = 0;
for ( var i = 1; i < col; i++){
if (arr[colIndex].height > arr[i].height){
colIndex = i
}
}
item.line = colIndex;
item.top = arr[colIndex].height+ 'px' ;
item.left = colIndex * ( this .itemWidth + 10) + 'px'
arr[colIndex].list.push(item);
arr[colIndex].height += item.height + 10;
})
return arr
},
|
通过计算,我们可以到,瀑布流布局下每个元素的位置,通过绝对定位就可以实现。
根据下标,来渲染到不同的通道 idx % 4
因为上个方案用到了绝对定位,那么有没有不用绝对定位的方案呢?回到我们的问题点上 定宽,不定高,那我们完全可以通过分开渲染放弃 absolute 来实现。
1 2 3 4 5 6 7 | jsGroupList(){
return this .list.reduce((s,n,idx)=>{
s[idx % 4].push({idx: idx, item: n})
return s
}, [[],[],[],[],])
},
|
看开头是实现类似的功能的,但是有一个弊端(快来评论区回复呀)。
通过高度计算,然后分通道,避免 absolute
因为上一个方案是按下标分类的,其实瀑布流是按高度分类的,所以我们分类条件换成最低的列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | jsGroupHeightList(){
var list = [
{height: 0, list: []},{height: 0, list: []},
{height: 0, list: []},{height: 0, list: []},
]
for ( var i = 0; i < this .list.length; i++){
if (! this .listInfo[i].height) return list;
var minHeightItem = list[0];
list.forEach(v=>{
if (v.height < minHeightItem.height) minHeightItem = v
})
minHeightItem.height += this .listInfo[i].height
minHeightItem.list.push({idx: i, item: this .list[i]})
}
return list;
},
|
总结
好了,到这里我能想到的方案就都介绍了。你还有什么方案吗?咱们可以在评论区讨论一下可行性。接下来就是我们的方案总结了。
方案 | 优点 | 缺点 | 点评 |
---|
columns | 实现简单、纯 CSS 方案 | 兼容性 | - |
flex | - | 需要固定高度,填充难以控制等问题 | - |
float、inline、bootstrapGrid | - | - | 没点大都用不出这方案 |
grid | - | - | 可以nth-child模拟实现、或者等待兼容性 masonry |
absolute | 效果好 | - | JS计算无限可能 |
js普通通道 | - | 填充难以控制 | - |
js优化通道 | 效果好、无绝对定位 | 在出现夸列等操作的时候不是很好控制 | - |
更多编程相关知识,请访问:编程入门!!
以上就是使用JS或CSS如何实现瀑布流布局,几种方案介绍的详细内容,更多文章请关注木庄网络博客!
返回前面的内容
相关阅读 >>
关于html和css绘制三角形图标的方法
js中如何使用padstart()和padend()格式化字符串?(小技巧)
编写一个javascript程序来列出javascript对象的属性
css border-image-slice属性怎么用
javascript如何改变原数组
javascript定义变量写法
css设置外边距的属性名是什么
css怎么改变div字体颜色
深入理解javascript立即调用函数表达式(iife)
css的加载顺序是什么
更多相关阅读请进入《javascript》频道 >>
人民邮电出版社
本书对 Vue.js 3 技术细节的分析非常可靠,对于需要深入理解 Vue.js 3 的用户会有很大的帮助。——尤雨溪,Vue.js作者
转载请注明出处:木庄网络博客 » 使用JS或CSS如何实现瀑布流布局,几种方案介绍