前端(五):实现页面的瀑布流式布局

简介: 实现页面的瀑布流式布局

效果、原理

image.png

源码

* {
   
   
    padding: 0;
    margin: 0;
    box-sizing: border-box;
    outline: none;
}

html,
body {
   
   
    width: 100%;
    height: 100%;
    position: relative;
    overflow: hidden;
}

#app {
   
   
    position: relative;
    width: 100vw;
    height: 100vh;
    overflow: auto;
}

.pic-item {
   
   
    position: absolute;
    border: 1px solid #000;
}
<div id="app">
    <!-- <img class="pic-item" :src="item" width="200"> -->
</div>
// 添加img标签
const root = document.getElementById('app');
for (let i = 1; i <= 20; i++) {
   
   
    const color = ()=>{
   
   
        let c = '0123456789abcdef'.split('');
        return c[Math.floor(Math.random(0, 1) * 15)];
    }
    let h = Math.floor(Math.random() * 500) + 50;
    let img = document.createElement("img");
    img.className = 'pic-item';
    img.width = 200;
    img.src = `https://dummyimage.com/200x${h}/${color()}${color()}${color()}/fff?text=200x${h} ${i}`;
    root.appendChild(img);
}

// 监听页面当前加载状态
document.onreadystatechange = () => {
   
   
    // 页面加载完成
    if (document.readyState === 'complete') {
   
   

        // 瀑布流
        const picList = document.getElementsByClassName('pic-item');

        // 单张图片宽度
        const w = 200;
        // 定义列数
        const col = 5;

        // 获取第一列图片高度集合
        let heightList = [...picList].slice(0, col).map(el => el.offsetHeight);
        console.log(`第一行 ${
     
     col} 个 图片标签的高度`, heightList);

        // 循环标签
        for (let i = 0; i < picList.length; i++) {
   
   

            // 当前标签
            let ele = picList[i];

            // 第一行(不做处理按原样顺序定位输出)
            if (i < col) {
   
   
                // 修改定位
                ele.style.top = '0px';
                ele.style.left = `${
     
     w * i}px`;
            }

            // 其他行(做处理,按每次获取到的最低高度进行样式定位)
            else {
   
   
                // 找出最小高度
                let minHeight = Math.min.apply(null, heightList);
                // 判断最小高度在数组中的下标(第几列的图片)
                let j = heightList.indexOf(minHeight);

                // 修改定位放到最小的标签的位置的下方
                ele.style.top += `${
     
     minHeight}px`;
                ele.style.left = `${
     
     w * j}px`;

                // 修改定位(修改最小的那个高度为加上当前元素的高度,用于下次循环时判断出另一个最小高度)
                heightList[j] += ele.offsetHeight;
                console.log('修改最小高度后新的高度集合', heightList);
            }

        }

    }
}
目录
相关文章
|
9天前
|
前端开发 数据安全/隐私保护
.自定义认证前端页面
.自定义认证前端页面
5 1
.自定义认证前端页面
|
4月前
|
开发框架 前端开发 JavaScript
循序渐进VUE+Element 前端应用开发(5)--- 表格列表页面的查询,列表展示和字段转义处理
循序渐进VUE+Element 前端应用开发(5)--- 表格列表页面的查询,列表展示和字段转义处理
|
4天前
|
前端开发 安全 JavaScript
在阿里云快速启动Appsmith搭建前端页面
本文介绍了Appsmith的基本信息,并通过阿里云计算巢完成了Appsmith的快速部署,使用者不需要自己下载代码,不需要自己安装复杂的依赖,不需要了解底层技术,只需要在控制台图形界面点击几下鼠标就可以快速部署并启动Appsmith,非技术同学也能轻松搞定。
|
27天前
|
前端开发 JavaScript
回顾前端页面发送ajax请求方式
回顾前端页面发送ajax请求方式
36 18
|
4月前
|
前端开发 JavaScript Java
基于Vue+ElementUI框架实现学生管理系统前端页面设计
基于Vue+ElementUI框架实现学生管理系统前端页面设计
|
2月前
|
前端开发 JavaScript API
前端JS读取文件内容并展示到页面上
前端JavaScript使用FileReader API读取文件内容,支持文本类型文件。在文件读取成功后,可以通过onload事件处理函数获取文件内容,然后展示到页面上。
75 2
前端JS读取文件内容并展示到页面上
|
1月前
|
前端开发 数据安全/隐私保护
angular前端基本页面验证
angular前端基本页面验证
28 1
|
1月前
|
前端开发
搭建个人博客--1、前端页面
搭建个人博客--1、前端页面
20 1
|
3月前
|
开发框架 前端开发 Java
【前端学java】SpringBootWeb极速入门-实现一个简单的web页面01
【8月更文挑战第12天】SpringBootWeb极速入门-实现一个简单的web页面01
68 3
【前端学java】SpringBootWeb极速入门-实现一个简单的web页面01
|
2月前
|
前端开发 JavaScript
前端基础(一)_前端页面构成
本文介绍了前端页面的基本构成,包括HTML(负责页面的结构和语义)、CSS(负责页面的样式和表现)和JavaScript(负责页面的行为和动态效果)。文章通过示例代码展示了如何使用这三种技术来创建一个简单的网页,并解释了HTML文档的结构和语法。
34 0