使用JS或CSS如何实现瀑布流布局,几种方案介绍


当前第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){

                // colItem = arr[i]

                colIndex = i

            }

        }

        // 修改元素的信息

        // 所属列

        item.line = colIndex;

        // 计算之后的 top 距离

        item.top = arr[colIndex].height+ 'px';

        // 计算之后的 left 距离

        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

        // 把新的元素push到列中

        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》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...