博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模拟瀑布流
阅读量:4986 次
发布时间:2019-06-12

本文共 4816 字,大约阅读时间需要 16 分钟。

  <!DOCTYPE html>
  <html lang="en">
  <head>
  <meta charset="UTF-8">
  <title></title>
  <style>
  * {
  margin: 0;
  padding: 0;
  }
   
  .box {
  float: left;
  border: 1px solid #ccc;
  padding: 5px;
  }
  </style>
  </head>
  <body>
  <div id="container">
  <!--(.box>img[src="images/P_00$.jpg"])*9-->
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  <div class="box"><img src="" alt=""/></div>
  </div>
  <script>
  //因为涉及到了图片宽高 所以要写在window.onload里面
   
  //第一行是通过左浮动 自然摆放
  //后面是通过JS计算 高度最小的那一行 然后把图片放到那个位置
  window.onload = function () {
  //找人
  var container = document.getElementById("container");
  var boxes = container.children;//所有的盒子
  //1.找出谁是第一行
  //计算第一行有多少张 或者也就是 页面上有多少列
  //一行有多少张实际上 就是 页面的宽度 / 盒子的宽度
  //页面宽度
  var pageWidth = window.innerWidth;
  //盒子的宽度
  var boxWidth = boxes[0].offsetWidth;
  var column = Math.floor(pageWidth / boxWidth);//都是整数 所以要向下取整
  //console.log(column);
  //2.用一个数组保存 每一列的高度 找出最小值 和最小值的索引
  var arrHeight = [];
  //把每一列的初始高度 保存到数组中
  function waterfall() {
  //找出所有的盒子并处理
  for (var i = 0; i < boxes.length; i++) {
  //先只找出第一行的所有的盒子
  if (i < column) {
  //boxes[i]//第一行的盒子
  //把第一行的盒子的高度放到数组中
  arrHeight[i] = boxes[i].offsetHeight;
  } else {
  //第一行盒子之后的盒子
  //根据 保存每行高度的数组中的 最小值去摆放
  var minHeight = getMin(arrHeight).value;//最小的高度
  var minHeightIndex = getMin(arrHeight).index;//高度最小的那一列
  //摆放盒子其实就是设置盒子的top和left
  //要想设置位置 先要加定位
  boxes[i].style.position = "absolute";
  //设置top值 top值就是高度最小的那一列现在的高度
  boxes[i].style.top = minHeight + "px";
  //设置left值 left值就是 高度最小的那一列所有图片的offsetLeft
  //其中第一行的最好找
  boxes[i].style.left = boxes[minHeightIndex].offsetLeft + "px";
  //放置图片后 当前列的高度发生了变化 我们要对数组的值进行更新
  //然后 后续的循环才能根据新的数组 来重新寻找最小值
   
  //给数组中之前 数值最小的那一项 加上当前这个图片的高度
  //在之前的高度的基础上 再加上 新加入的图片的高度
  arrHeight[minHeightIndex] = minHeight + boxes[i].offsetHeight;
  }
  }
  }
   
  waterfall();
  //console.log(arrHeight);
  //console.log(minHeight);
  //console.log(minHeightIndex);
   
  //5.判断触底
  window.onscroll = function () {
  if (bottomed()) {
  //alert("触底了,要加载图片了");
  //加载图片
  var json = [
  {"src": "images/P_000.jpg"},
  {"src": "images/P_001.jpg"},
  {"src": "images/P_002.jpg"},
  {"src": "images/P_003.jpg"},
  {"src": "images/P_004.jpg"},
  {"src": "images/P_005.jpg"},
  {"src": "images/P_006.jpg"},
  {"src": "images/P_007.jpg"},
  {"src": "images/P_008.jpg"},
  {"src": "images/P_009.jpg"},
  ];
  //.box>img
  for (var i = 0; i < json.length; i++) {
  //json[i]//每一条数据
  var div = document.createElement("div");
  div.className = "box";
  container.appendChild(div);
  var img = document.createElement("img");
  img.src = json[i].src;
  div.appendChild(img);
  //新加载出来的盒子 样式有问题 需要重新通过JS设置位置
  waterfall();
   
  }
  }
  };
   
  function bottomed() {
  //窗口的高度+页面被卷去的头部 > 最后一个盒子的offsetTop
  //窗口的高度
  var clientHeight = window.innerHeight;
  //页面被卷去的头部
  var scrollTop = window.pageYOffset;
  //最后一个盒子的offsetTop
  var lastBox = boxes[boxes.length - 1];//最后的盒子
  var lastBoxTop = lastBox.offsetTop;
  //窗口的高度+页面被卷去的头部 > 最后一个盒子的offsetTop
  if (clientHeight + scrollTop > lastBoxTop) {
  return true;//表示触底了
  }
  return false;//没有触底
  }
   
  };
   
   
  function getMin(arr) {
  var min = {};
  min.index = 0;//最小值的索引
  min.value = arr[min.index];//最小值的值
  //遍历数组 一个一个比较
  for (var i = 0; i < arr.length; i++) {
  if (min.value > arr[i]) {
  min.value = arr[i];
  min.index = i;
  }
  }
  return min;
  }
   
  </script>
  </body>
  </html>

转载于:https://www.cnblogs.com/ffxf/p/6515032.html

你可能感兴趣的文章
Wireshark-win64-2.4.3
查看>>
《Unity游戏开发实战》pdf
查看>>
jsday24
查看>>
(二十)WebGIS中图层树功能的设计和实现
查看>>
ORA-10456:cannot open standby database;media recovery session may be in process
查看>>
session服务器Nginx+Tomcat+Memcached集群Session共享
查看>>
javascript的时间描述图怎么写
查看>>
Maximum Gap 164
查看>>
Robot Framework Share 4
查看>>
【LeetCode】155. Min Stack
查看>>
【LeetCode】214. Shortest Palindrome
查看>>
现有资源和jsapi的融合一种方式
查看>>
UICollectionViewController的简单使用及一些注意点(json)
查看>>
Vue.js 源码分析(十三) 基础篇 组件 props属性详解
查看>>
Ubuntu系统升级内核方法
查看>>
Spring Bean单例与线程安全
查看>>
EasyUI datagrid.getSelections 没有返回正确的选择行数
查看>>
分享一个随机重排函数(C#)
查看>>
Asp.Net Core在CentOS部署与注意
查看>>
自反+递归 实现评论的无限引用
查看>>