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

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

效果、原理

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);
            }

        }

    }
}
目录
相关文章
|
3月前
|
缓存 前端开发 JavaScript
如何优化前端页面性能
前端性能优化是网站开发中非常重要的一部分,它直接关系到用户体验和网站的流量以及排名。本文将介绍一些优化前端页面性能的方法,包括减少HTTP请求、压缩代码、使用CDN等。
|
2月前
|
存储 前端开发 JavaScript
【JavaEE初阶】 博客系统项目--前端页面设计实现
【JavaEE初阶】 博客系统项目--前端页面设计实现
|
6月前
|
缓存 前端开发 JavaScript
【前端用法】jquery获取当前页面的URL信息
【前端用法】jquery获取当前页面的URL信息
53 0
|
6月前
|
前端开发 安全 JavaScript
关于前端页面测试和抵御 clickjacking attack 的一些方法
关于前端页面测试和抵御 clickjacking attack 的一些方法
51 0
|
2月前
|
存储 前端开发 安全
无限连接:前端跨页面通信的实现与应用
在前端开发中,有时我们需要在不同的页面之间进行数据传递和交互。这种场景下,前端跨页面通信就显得尤为重要。前端跨页面通信是指在不同的页面之间传递数据、发送消息以及实现页面间的交互操作。本文将详细介绍前端跨页面通信的属性、应用场景以及实现方法,并提供一些代码示例和引用资料,帮助读者深入了解并应用这一重要的技术。
|
7月前
|
开发框架 前端开发 JavaScript
前端框架Layui的使用讲解(Layui搭建登录注册页面)(一)
前端框架Layui的使用讲解(Layui搭建登录注册页面)
436 0
|
3月前
|
移动开发 监控 前端开发
HTML5与CSS3教学:美化员工行为监控软件前端页面的代码技巧
在当今信息时代,企业对员工行为的监控成为了一项必不可少的工作。而员工行为监控软件作为一种高效的管理工具,其前端页面的设计和美化显得尤为重要。本文将介绍如何利用HTML5和CSS3技术,优雅地美化员工行为监控软件前端页面的代码技巧。
217 0
|
4月前
|
JSON 前端开发 Java
(简易详细)spring boot 使用拦截器 实现拦截前端请求并返回json到前端页面
(简易详细)spring boot 使用拦截器 实现拦截前端请求并返回json到前端页面
110 0
|
4月前
|
前端开发
前端知识笔记(十八)———页面首次滑动不可返回
前端知识笔记(十八)———页面首次滑动不可返回
19 0
|
5月前
|
JavaScript 前端开发 Java
在Vue中通过ElementUI构建前端页面【登录,注册】,在IEDA构建后端实现前后端分离
在Vue中通过ElementUI构建前端页面【登录,注册】,在IEDA构建后端实现前后端分离
154 0