JS——瀑布流无限加载以及动态生成a标签

简介: 瀑布流无限加载以及动态生成a标签

如何实现瀑布流排列效果?看下面这张图

88a4934eeeb24bce872e789e2862d51c.png

通过js去比较每张图片的高度,然后进行排列。

这是一个模拟的瀑布流的list列表项

<div id="main">
      <div class="box">
        <a href="#" class="pic">
          <img src="./images/dangjian-list/1.png">
          <div class="zpic">
           <h1>南辰</h1>
           <p>2022-06-04</p>
         </div>
       </a>
   </div>
</div>

样式如下:

* {
    margin: 0px;
    padding: 0px;
    box-sizing: border-box;
}
.box {
    padding: .05rem;
    float: left;
    margin-top: 1.7rem;
}
.pic {
    display: block;
    float: left;
}
/*将承载图片的容器定制颜色及边框大小和圆角*/
.boximg .box-text{
    width: 3.55rem;
    height: 1.58rem;
    background-color: #E9E9E9;
    padding-top: .24rem;
    box-sizing: border-box;
}
/*定制图片尺寸*/
.boximg {
    margin-top: .1rem;
}
.boximg h4{
    /* text-align: center; */
    margin-left: .3rem;
    /* margin-top: .24rem; */
    margin-bottom: .06rem;
    color: #000000;
    font-size: .3rem;
    font-weight: 500;
    line-height: .36rem;
}
.boximg p{
    margin-left: .3rem;
    color: #929292;
    font-size: .24rem;
    line-height: .36rem;
}
.boximg img {
    width: 3.55rem;
    height: auto;
}
.boximg h4{
    width: 3.05rem;
}
<script type="text/javascript">
        window.onload = function () {
            waterfall('main', 'box');
            dataImg = {
                arr: [
                    { 'src': './images/dangjian-list/1.png', 'name': '2021', 'date': '2022-03-21','href':'#' },
                    { 'src': './images/dangjian-list/2.png', 'name': '打造更有温度、深度和厚度的医院文化', 'date': '2022-03-21','href':'#' },
                    { 'src': './images/dangjian-list/3.png', 'name': '打造更有温度、深度和厚度的医院文化', 'date': '2022-03-21','href':'#' },
                    { 'src': './images/dangjian-list/4.png', 'name': '打造更有温度、深度和厚度的医院文化', 'date': '2022-03-21','href':'#' },
                    { 'src': './images/dangjian-list/5.png', 'name': '打造更有温度、深度和厚度的医院文化', 'date': '2022-03-21' ,'href':'#'},
                    { 'src': './images/dangjian-list/6.png', 'name': '打造更有温度、深度和厚度的医院文化', 'date': '2022-03-21' ,'href':'#'},
                    { 'src': './images/dangjian-list/7.png', 'name': '打造更有温度、深度和厚度的医院文化', 'date': '2022-03-21' ,'href':'#'},
                ],
            },
                window.onscroll = function () {
                    //当滚动到最后一张图片高度一般时刷新新数据
                    var boxs = getClass('box');
                    var oneh2 = boxs[boxs.length - 1].offsetTop;
                    var oneh = boxs[boxs.length - 1].offsetHeight / 2;
                    var top = document.body.scrollTop || document.documentElement.scrollTop;
                    var twoh = document.body.clientHeight || document.documentElement.clientHeight;
                    if (oneh2 + oneh < top + twoh) {
                        for (var i = 0; i < dataImg.arr.length; i++) {
                            var main = document.getElementById('main');
                            var cdiv = document.createElement('div');
                            var cpic = document.createElement('a');
                            // 新增动态链接
                            cpic.setAttribute('href', dataImg.arr[i].href);
                            var zpic = document.createElement('div');
                            cdiv.className = 'box';
                            cpic.className = 'pic';
                            zpic.className = 'zpic'
                            var cimg = document.createElement('img');
                            var h1 = document.createElement('h1');
                            var date = document.createElement('p');
                            cimg.src = dataImg.arr[i].src;
                            h1.innerText = dataImg.arr[i].name
                            date.innerText = dataImg.arr[i].date;
                            // h1.innerText =  dataImg.arr[i].text;
                            console.log(dataImg.arr[i]);
                            main.appendChild(cdiv);
                            cdiv.appendChild(cpic);
                            cpic.appendChild(cimg);
                            cpic.appendChild(zpic);
                            zpic.appendChild(h1)
                            zpic.appendChild(date);
                            zpic.style.backgroundColor = '#E9E9E9'
                            console.log(zpic);
                            /*  for (let j = 0; j < txt.text.length; j++) {
                             // console.log(txt.text);
                             var h1 = document.createElement('h1');
                             h1.innerText =  txt.text[j].name;
                             console.log(txt.text[j]);
                             console.log(cpic);
                             cpic.className = 'pic';
                             cpic.appendChild(h1);
                         } */
                        }
                    }
                    waterfall('main', 'box');
                }
        }
        function waterfall(parent, box) {
            //获取main元素
            var oparent = document.getElementById(parent);
            //获取所有 box 元素
            var obox = getClass('box');
            //获取每行能放多少个 居中摆放
            var w = document.body.clientWidth || document.documentElement.clientWidth;
            //var w =1000;
            var oneWidth = obox[0].offsetWidth;
            var num = Math.round(w / oneWidth);
            // 这里判断一下屏幕如果是奇数的话就减去一个像素,否则总宽度会被+1
            if (w % 2 == 1) {
                main.style.width = num * oneWidth - 1 + 'px';
            } else {
                main.style.width = num * oneWidth + 'px';
            }
            // console.log(oneWidth);
            console.log(num);
            console.log(obox);
            //瀑布流原理  left-下标*图片width top-上面图片高
            var hrr = [];
            for (var i = 0; i < obox.length; i++) {
                if (i < num) {
                    hrr.push(obox[i].offsetHeight);
                } else {
                    var min = Math.min.apply(null, hrr);
                    var index = getindex(hrr, min);
                    obox[i].style.position = 'absolute';
                    obox[i].style.left = index * oneWidth + 'px';
                    obox[i].style.top = min + 'px';
                    hrr[index] += obox[i].offsetHeight;
                }
            }
            console.log(hrr);
        }
        //获取 数组内指定值的 序号
        function getindex(hrr, h) {
            for (var i = 0; i < hrr.length; i++) {
                if (hrr[i] == h) {
                    return i;
                }
            }
        }
        //统计所有指定class名称的元素
        function getClass(a) {
            var doms = document.getElementsByTagName('*');
            var reg = new RegExp('\\b' + a + '\\b');
            //var reg = '/^\b'+a+'\b$/';
            var arr = [];
            for (var i = 0; i < doms.length; i++) {
                if (reg.test(doms[i].className)) {
                    arr.push(doms[i]);
                }
            }
            return arr;
        }
    </script>

动态添加a标签的方法使用setAttribute:("属性":"名称")

var cpic = document.createElement('a');
// 新增动态链接
cpic.setAttribute('href', dataImg.arr[i].href);


相关文章
|
2月前
|
缓存 JavaScript 前端开发
高效打造跨平台桌面应用:Electron加载服务器端JS
【9月更文挑战第17天】Electron 是一个基于 Chromium 和 Node.js 的开源框架,允许使用 HTML、CSS 和 JavaScript 构建跨平台桌面应用。加载服务器端 JS 可增强应用灵活性,实现代码复用、动态更新及实时通信。通过 HTTP 请求、WebSocket 或文件系统可实现加载,但需注意安全性、性能和兼容性问题。开发者应根据需求选择合适方法并谨慎实施。
123 3
|
3天前
|
缓存 前端开发 JavaScript
优化CSS和JavaScript加载
Next.js和Nuxt.js在优化CSS和JavaScript加载方面提供了多种策略和工具。Next.js通过代码拆分、图片优化和特定的CSS/JavaScript优化措施提升性能;Nuxt.js则通过代码分割、懒加载、预渲染静态页面、Webpack配置和服务端缓存来实现优化。两者均能有效提高应用性能。
|
5月前
|
Web App开发 前端开发 JavaScript
技术心得记录:瀑布流的布局原理分析(纯CSS瀑布流与JS瀑布流)
技术心得记录:瀑布流的布局原理分析(纯CSS瀑布流与JS瀑布流)
54 0
|
30天前
|
JavaScript API
深入解析JS中的visibilitychange事件:监听浏览器标签间切换的利器
深入解析JS中的visibilitychange事件:监听浏览器标签间切换的利器
89 0
|
2月前
|
Web App开发 前端开发 JavaScript
HTML/CSS/JS学习笔记 Day3(HTML--网页标签 下)
HTML/CSS/JS学习笔记 Day3(HTML--网页标签 下)
|
3月前
|
编解码 缓存 算法
Three.js如何降低3D模型的大小以便更快加载
为加快600MB的3D模型在Three.js中的加载速度,可采用多种压缩方法:1) 减少顶点数,使用简化工具或LOD技术;2) 压缩纹理,降低分辨率或转为KTX2等格式;3) 采用高效文件格式如glTF 2.0及draco压缩;4) 合并材质减少数量;5) 利用Three.js内置优化如BufferGeometry;6) 按需分批加载模型;7) Web Workers后台处理;8) 多模型合并减少绘制;9) 使用Texture Atlas及专业优化工具。示例代码展示了使用GLTFLoader加载优化后的模型。
396 12
|
3月前
|
JavaScript 前端开发 UED
小白请看! 大厂面试题 :如何用JS实现瀑布流
小白请看! 大厂面试题 :如何用JS实现瀑布流
|
3月前
|
前端开发 JavaScript Linux
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
|
3月前
|
JavaScript 前端开发
JavaScript引入全攻略:提升网页加载速度的秘诀!
JavaScript引入全攻略:提升网页加载速度的秘诀!
|
3月前
|
资源调度 JavaScript 前端开发
如何大幅减少 Vue.js 中的包大小和加载时间,提升用户体验!
如何大幅减少 Vue.js 中的包大小和加载时间,提升用户体验!