美文网首页
原生js写的瀑布流

原生js写的瀑布流

作者: 陌紫嫣 | 来源:发表于2018-06-29 14:06 被阅读0次

    这里只写了js和css方法,大家有兴趣可以动手写写

    *{
        margin:0;
        padding:0;
    }
    #.container{
     position: relative;
    }
    .box{
        float: left;
        padding: 5px;
    }
    //主要是加了边框效果
    .img_box{
        padding: 5px;
        border: 1px solid #cccccc;
        box-shadow: 0 0 5px #cccccc;
        border-radius: 5px;
    }
    img{
    width: 150px;
    height: auto;//高度自适应
    }
    
     window.onload = function(){
       waterFull('container','box');
       var dataInt={'data':[{'src':'1.jpeg'},{'src':'2.jpeg'},{'src':'3.jpeg'},{'src':'4.jpeg'}]};//这里只是模拟数据库传的数据
       window.scroll = function(){
        if(checkscroll()){
          var oParent = document.getElementById('container');// 父级对象
          for(var i=0;i<dataInt.data.length;i++){
           var child = document.createElement('div'); //添加 元素节点
           child.className = 'box';//添加元素的属性名
           oParent.appendChild(child);//追加到父级对象
          for(var i=0;i<dataInt.data.length;i++){
           var child_img = document.createElement('div'); //添加 元素子节点
           child_img.className = 'img_box';
           child.appendChild(child_img);
           var img = document.createElement('img');
            img.src='images/'+dataInt.data[i].src;
             child_img.appendChild(img);
          }
          waterFull('container','box'); 
        }
       }
     }
    
     function waterFull(parent,pin){
       var oparent = document.getElementById(parent);
       var content = getClassObj(oparent,pin);
       var apinW = content[0].offsetWidth;//获取到图片的宽度
       var num = Math.floor(document.documentElement.clientWidth/apinW)//这里也可以使用document.body.clientWidth(涉及到兼容性问题), Math.floor向下取整
       oparent.style.cssText='width:'+apinW*num+'px;margin:0 auto;';
       var imagesArry = [];//图片高度集合
       for(var i=0;i<content.length;i++){
        var apinH = content[i].offsetHeight;
        if(i<num){
           imagesArry[i] = apinH;//拿到第一行每个图片的高度
        }else{
            var minH=Math.min.apply(null,imagesArry);//拿到数组imagesArry中的最小值minH
            var minHIndex=getminHIndex(imagesArry,minH);
            //给后面的图片依次排到每一行最小高度的盒子下面
            content[i].style.position = 'absolute';
            content[i].style.top = minH+'px';
            content[i].style.left = content[minHIndex].offsetLeft+'px';
            imagesArry[minHIndex]+=content[i].offsetHeight;//更新添加了图片后的列高
        }
       }
     }
    
    //获取到所有图片,并放在一个数组中
     function getClassObj(parent,className){
        var obj=parent.getElementsByTagName('*');//获取 父级的所有子集
        var pinS=[];//创建一个数组 用于收集子元素
        for(var i= 0;i<obj.length;i++){
          if(obj[i].className==className){
            pinS.push(obj[i]);
          }
        };
        return pinS;
     }
    
    
    //获取最小高度图片的下角标
    function getminHIndex(arry,min){
        for(var i= 0;i<arry.length;i++){
          if(arry[i]==min){
            return i;
          }
        };
        return pinS;
     }
    
    //判断何时该加载图片资源了
     function checkscroll(){
       var oParent=document.getElementById('container');
       var content = getClassObj(oparent,'box');
       var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;//注意解决兼容性
       var documentH=document.documentElement.clientHeight;//页面可视高度
       var lastpinH = content[content.length-1].offsetTop;
       if(lastpinH<scrollTop+documentH){
         return true
       }
       else{
        return false
       }
    
     } 
    
    
    

    相关文章

      网友评论

          本文标题:原生js写的瀑布流

          本文链接:https://www.haomeiwen.com/subject/agkayftx.html