用JS原生写瀑布流

效果图

在这里插入图片描述

html

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .container {
            width: 840px;
            background: #cccccc;
            margin: auto;
            padding-left: 10px;
            overflow: hidden;
        }

        .container ul {
            width: 200px;
            margin-right: 10px;
            float: left;
            list-style: none;

        }

        .container ul li {
            width: 200px;
            position: relative;
            background: white;
            margin-top: 10px;

        }

        .container ul li img {
            width: 100%;
            height: 90%;
            background: url("./images/timg.gif") no-repeat center;
        }

        .container ul li p {
            height: 30px;
            line-height: 30px;
            text-align: center;

        }

        .container ul li a {
            display: none;
            width: 60px;
            height: 25px;
            line-height: 25px;
            background: pink;
            text-align: center;
            color: white;
            position: absolute;
            left: 30px;
            top: 10px;
            text-decoration: none;
        }

        .container ul li:hover a {
            display: block;
        }
    </style>
</head>

<body>
    <div class="container">
        <ul>
            <!-- <li>
                <img trueSrc="./images/1.jpg" alt="">
                <p>人生不止有代码 诗和远方</p>
                <a href="javascript:;">采集</a>
            </li> -->
        </ul>
        <ul>
            <!-- <li>
                <img trueSrc="./images/1.jpg" alt="">
                <p>人生不止有代码 诗和远方</p>
                <a href="javascript:;">采集</a>
            </li> -->
        </ul>
        <ul>
            <!-- <li>
                <img trueSrc="./images/1.jpg" alt="">
                <p>人生不止有代码 诗和远方</p>
                <a href="javascript:;">采集</a>
            </li> -->
        </ul>
        <ul>
            <!-- <li>
                <img trueSrc="./images/1.jpg" alt="">
                <p>人生不止有代码 诗和远方</p>
                <a href="javascript:;">采集</a>
            </li> -->
        </ul>

    </div>
    <script src="../../utils.js"></script>
    <script src="./index.js"></script>

</body>

</html>

js

var oUl = document.getElementsByTagName("ul");
var arr = Array.from(oUl);// 把类数组转成真正的数组;
// 获取数据并且绑定数据
var data;
// 1.创建ajax实例
var xhr = new XMLHttpRequest();
// 2. 打开一个路径
xhr.open("get","data.txt",false);
// 3. 监听ajax的状态
xhr.onreadystatechange = function(){
    if(xhr.readyState===4&&/^2\d{2}$/.test(xhr.status)){
        data=JSON.parse(xhr.responseText);
    }
}
// 发送请求
xhr.send();

// 绑定数据
function bindHtml(){
    for(var i=0;i<50;i++){
        // 产生一个随机的数字
        var  num = Math.round(Math.random()*7);
        var  cur = data[num];// 随机取一条数据
        var li = document.createElement("li");
        var  a = document.createElement("a");
        a.innerHTML ="采集";
        a.href="javascript:;";
        li.appendChild(a);
        var img = document.createElement("img");
        // 设置图片的高度时200--350之间;
        // 把图片的真实路径给了当前图片的行间属性
        img.setAttribute("trueImg",cur.src);
        img.style.height = Math.round(Math.random()*(350-200)+200)+"px";
        li.appendChild(img);
        var p = document.createElement("p");
        p.innerHTML = cur.title;
        li.appendChild(p);
        // 在li放入ul之前,先对所有的ul进行排序,把最新创建的li插入到高度最小的ul中;
        arr.sort(function(a,b){
            return a.scrollHeight-b.scrollHeight;
        })
        arr[0].appendChild(li);
    }
}
bindHtml();
// 多张图片延迟加载
var  imgs = document.getElementsByTagName("img");
function delay(){
    for(var i=0;i<imgs.length;i++){
        checkImg(imgs[i])
    }
}
// 获取浏览器可视窗口的高度
var winH = utils.win("clientHeight");
// 检验一张图片是否应该显示;
function checkImg(curImg){
    if(curImg.load){
        // 如果该图片的load属性是true,不需要再次加载;
        return;
    }
    var curH = curImg.offsetHeight;
    var curT = utils.offset(curImg).t;
    var winT = utils.win("scrollTop");
    // 如果卷起的高度+可视窗口的高度>当前盒子底边框距离body上边的高度时,让该盒子显示真实的图片;
    if(winH + winT>curH+curT){
        var  address = curImg.getAttribute("trueImg");
        var  img = new Image;// 实例就是一个img的DOM元素对象
        img.src=address;
        // 当图片路径没有问题,会执行下面的onload事件;
        img.onload=function(){
            curImg.src = address;
            curImg.load=true;
        }
    }
}
delay();
var  container = document.getElementsByClassName("container")[0];
// 当滚动条滚动时,不断校验每一张图片;
window.onscroll = function(){
    console.log(100);
    
    // 时时刻刻获取最新的container的高度
    var containerH = container.offsetHeight;
    var curT = utils.win("scrollTop");
    if(curT+winH +300 > containerH){
        // 如果滚动条卷起的高度+可视窗口的高度 如果距离页面底端还有300像素,就立即再次执行绑定数据
        bindHtml();
    }
    delay();
}


data.txt

[
  {"src": "./images/1.jpg","title":"人生不止有代码 诗和远方","height": "200px"},
  {"src": "./images/2.jpg","title":"人生不止有代码 诗和远方","height": "220px"},
  {"src": "./images/3.jpg","title":"人生不止有代码 诗和远方","height": "250px"},
  {"src": "./images/4.jpg","title":"人生不止有代码 诗和远方","height": "300px"},
  {"src": "./images/5.jpg","title":"人生不止有代码 诗和远方","height": "170px"},
  {"src": "./images/6.jpg","title":"人生不止有代码 诗和远方","height": "280px"},
  {"src": "./images/7.jpg","title":"人生不止有代码 诗和远方","height": "160px"},
  {"src": "./images/8.jpg","title":"人生不止有代码 诗和远方","height": "230px"}
]

资源

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布了51 篇原创文章 · 获赞 13 · 访问量 3075

猜你喜欢

转载自blog.csdn.net/Sheng_zhenzhen/article/details/103944829