以前做的瀑布流

放这个图片是因为, 里面的姑娘都挺好看, 哈哈
20170822164246.jpg
之前做的瀑布流

可以拽下代码: 之后按照 md文件中 的步骤装个本地服务器 查看下加载效果

git clone https://github.com/kingdujiabo/Pubuliu.git
拽下代码后如果想查看效果可以执行下面的命令,
  • 安装本地服务器, 已安装的跳过

    npm install http-server -g 全局安装本地服务器

  • 启动服务器

    http-server 启动服务器

HTML
<!DOCTYPE HTML>
<html lang="en-US">
<head>
    <meta charset="UTF-8">
    <title>阿杜的瀑布流</title>
    <link rel="stylesheet" href="css/pubu.css" />
</head>
<body>


    <div id="main">
        <div class="box">
            <div class="pic">
                ![](imgp/1.jpg)
            </div>
        </div>
        <div class="box">
            <div class="pic">
                ![](imgp/2.png)
            </div>
        </div>
        <div class="box">
            <div class="pic">
                ![](imgp/3.jpg)
            </div>
        </div>
        <div class="box">
            <div class="pic">
                ![](imgp/4.jpg)
            </div>
        </div>
        <div class="box">
            <div class="pic">
                ![](imgp/5.jpg)
            </div>
        </div>
        <div class="box">
            <div class="pic">
                ![](imgp/6.jpg)
            </div>
        </div>
        <div class="box">
            <div class="pic">
                ![](imgp/7.jpg)
            </div>
        </div>
        <div class="box">
            <div class="pic">
                ![](imgp/8.jpg)
            </div>
        </div>
        <div class="box">
            <div class="pic">
                ![](imgp/9.jpg)
            </div>
        </div>
        <div class="box">
            <div class="pic">
                ![](imgp/10.jpg)
            </div>
        </div>
        <div class="box">
            <div class="pic">
                ![](imgp/11.jpg)
            </div>
        </div>
        <div class="box">
            <div class="pic">
                ![](imgp/12.jpg)
            </div>
        </div>
        <div class="box">
            <div class="pic">
                ![](imgp/13.png)
            </div>
        </div>
        <div class="box">
            <div class="pic">
                ![](imgp/14.jpg)
            </div>
        </div>
        <div class="box">
            <div class="pic">
                ![](imgp/15.jpg)
            </div>
        </div>

    </div>

    <script type="text/javascript" src="js/pubu1.js"></script>
</body>
</html>

CSS
*{margin:0;padding:0;}


#main{position:relative;}



.box{
    padding:15px 0 0 15px;
    float:left;
}

.pic{
    padding:10px;
    border:1px solid #ccc;
    border-radius:5px;
    box-shadow:0 0 5px #ccc;
    background:#FFF;

}

.pic img{
    width:236px;
    height:auto;
    opacity: 1;
}

.pic:hover img{opacity:0.7;}

JS
// 1: window.onload时  把现在加载 的图片排序一次

var loading = false; // 如果没有加载,就可以加载

window.onload = function () {
  // 排序
  waterfall('main','box');

  //滚轮加载, 符合条件时, 当滚轮滚到最后一个div 的一半时执行ajax请求, 请求新的数据
  window.onscroll = function () {
    if (getMore()) {
      // 这里是 ajax 请求, 如果没有加载,就可以加载, 加载完成后就设置为false未加在状态
      if (!loading) {
        loading = true;
        console.log('发起请求, 加载更多');
        // 模拟加载完成,后设置状态为false
        // setTimeout(function() {
        //   loading = false ;
        //   console.log('加载完成')
        // },3000)
        putDate();   // 请求数据
      }
    }
  }

  waterfall('main','box');

}

// 排序方法
// 获取大盒子. 获取 小盒子
// 计算大盒子里能放 几列 小盒子
// 计算 哪个盒子所在的位置的 offsetTop 最小
// 获取这个最小盒子的 offsetTop 加上自己的 offsetHeight  作为下一个盒子的position : top 的值
waterfall = (parent, box) => {
  // 获取大盒子. 获取 小盒子
  let parentBox = document.getElementById(parent);
  let theBox = document.getElementsByClassName(box);

  // 计算大盒子里能放 几列 小盒子
  let mainWidth = document.documentElement.clientWidth;
  let contentWidth = theBox[0].offsetWidth;
  let clo = Math.floor(mainWidth/contentWidth);

  // 给大盒子设置宽度
  parentBox.style.cssText = `width: ${contentWidth*clo}px; margin: 0 auto;`;


  /* 计算 哪个盒子所在的位置的 offsetTop 最小
    创建一个数组, 把现在屏幕宽度能设置的列数,比如最大时4列, 把前4 个div的高度放进数组中,
    然后超过 4 的开始计算,
    1: 数组中谁最小,
    2: 获取他的值 作为这个将要定位的div 的 top值, 下标*contentWidth 作为 left的定位
    3: 更改数组, 把这个div的 offsetHeight + 最小值 更新这个值
  */

  let arr = [];
  [...theBox].map((item,index) =>{
    if (index < clo ) {
      arr.push(item.offsetHeight)
    } else {
      let getMinNum = Math.min.apply( null, arr);             // 获取最小值
      let getMinNumIndex = arr.findIndex(function(item) { return item === getMinNum}) // 获取最小值所在的Index
      theBox[index].style.cssText = `position: absolute; top: ${getMinNum}px; left: ${getMinNumIndex*contentWidth}px`;
      arr[getMinNumIndex] += theBox[index].offsetHeight;
    }

  })
  // console.log();
};

// 条件, 当滚动到最后一个 div 的 中间位置, 就加载
// 即 div.offsetTop +  div.offsetHeight/2  小于 scrollTop(滚动到上面看不到的距离) + clientHeight (现在可视区域的高度) 时就加载
getMore = () => {
  let theBox = document.getElementsByClassName('box');
  let len = theBox.length;
  let ele = theBox[len - 1 ];

  // 获取div的 offsetTop ,offsetHeight
  let divTop = ele.offsetTop + ele.offsetHeight/2 ;

  // 获取 scrollTop(滚动到上面看不到的距离)
  let scrollT = document.body.scrollTop || document.documentElement.scrollTop;

  //获取 clientHeight (现在可视区域的高度)
  let clitH = document.body.clientHeight || document.documentElement.clientHeight;

  return divTop < scrollT + clitH
  console.log(clitH)
}


//后台请求数据

function putDate(){
  var xhr = ajaxContent();
  xhr.onreadystatechange = function(){

    if(xhr.readyState == 4 && xhr.status == 200) {
      var res = JSON.parse(xhr.responseText);
      var oparent = document.getElementById('main');
      [...res].map ((item,index) => {
          var url = item.src;
          var str ='<div class="pic">![](imgp/'+url+')</div>';
          var mdiv = document.createElement('div');
          mdiv.setAttribute('class','box')
          mdiv.innerHTML = str;
          oparent.appendChild(mdiv);
          waterfall('main','box');          //请求一次做一次定位
          loading = false;
      })
    }

  }
  xhr.open('get','../config/data.js',true);

  xhr.send();


}


function ajaxContent(){
  var xhr= null;
  if(window.XMLHttpRequest){
    xhr = new XMLHttpRequest();
  }else{
    xhr =  new ActiveXObjext('Microsoft.XMLHTTP');
  }

  return xhr;
}

config/data.js
[{"src":"1.jpg"},{"src":"2.png"},{"src":"3.jpg"},{"src":"4.jpg"},{"src":"5.jpg"},{"src":"6.jpg"},{"src":"7.jpg"},{"src":"8.jpg"},{"src":"9.jpg"},{"src":"10.jpg"},{"src":"11.jpg"},{"src":"12.jpg"},{"src":"13.png"},{"src":"14.jpg"},{"src":"15.jpg"},{"src":"16.jpg"},{"src":"17.jpg"},{"src":"18.jpg"},{"src":"19.jpg"},{"src":"20.jpg"},{"src":"21.jpg"},{"src":"22.jpg"},{"src":"23.jpg"},{"src":"24.jpg"},{"src":"25.jpg"},{"src":"26.jpg"},{"src":"27.jpg"},{"src":"28.png"},{"src":"29.jpg"},{"src":"30.jpg"}]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容