JavaScript实现图片瀑布流和底部刷新


Posted in Javascript onJanuary 02, 2017

瀑布流现在基本上是图片显示网页的标配,主要是为了适配图片和文字块的大小,使显示出的效果没有那么呆板
实现这个功能首先要有html,css和js基础

首先先实现瀑布流

即下一行的图片放在上一行的凹下去的地方

基本的html代码如下

<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>瀑布流</title>
 <link rel="stylesheet" type="text/css" href="css/style.css">
 <!--script不能用<script/>-->
 <script src="js/app1.js"></script>
</head>
<body>
<div id="container">
 <div class="box">
  <div class="img_box">
   <img src="images/1.jpg">
  </div>
 </div>
 <div class="box">
  <div class="img_box">
   <img src="images/2.jpg">
  </div>
 </div>
 <div class="box">
  <div class="img_box">
   <img src="images/3.jpg">
  </div>
 </div>
 <div class="box">
  <div class="img_box">
   <img src="images/4.jpg">
  </div>
 </div>
 <div class="box">
  <div class="img_box">
   <img src="images/5.jpg">
  </div>
 </div>
 <div class="box">
  <div class="img_box">
   <img src="images/6.jpg">
  </div>
 </div>
 <div class="box">
  <div class="img_box">
   <img src="images/1.jpg">
  </div>
 </div>
 <div class="box">
  <div class="img_box">
   <img src="images/2.jpg">
  </div>
 </div>
 <div class="box">
  <div class="img_box">
   <img src="images/3.jpg">
  </div>
 </div>
 <div class="box">
  <div class="img_box">
   <img src="images/4.jpg">
  </div>
 </div>
 <div class="box">
  <div class="img_box">
   <img src="images/5.jpg">
  </div>
 </div>
</div>
</body>
</html>

然后再写一下css

*{
 margin: 0px;
 padding: 0px;
}
/*container为相对布局*/
#container{
 position:relative;
}
/*box向左浮动*/
.box{
 padding:5px;
 float: left;
}
/*加一些边框*/
.img_box{
 padding: 5px;
 border:1px solid #ccc;
 box-shadow:0 0 5px #ccc;
 border-radius: 5px;
}
/*宽度固定,高度自适应,使图片不变形*/
.img_box img{
 width: 150px;
 height: auto;
}

接下来就是这次的核心,写js

//开始加载要执行的方法
window.onload=function(){
 imgLocation("container","box")
}
function imgLocation(parent,content){
 var cparent=document.getElementById(parent);
 var ccontent=getChildElement(cparent,content)
 //图片宽度
 var imgWidth=ccontent[0].offsetWidth;
 //每一行图片个数
 var cols= Math.floor(document.documentElement.clientWidth/imgWidth);
 //使宽度一定,内容居中
 cparent.style.cssText="width:"+imgWidth *cols+"px;margin:0 auto";

 var BoxHeightArr=[];
 for(var i=0;i<ccontent.length;i++){
  //获取第一行图片的高度
  if (i<cols){
   BoxHeightArr[i]=ccontent[i].offsetHeight;
  }else {
   //Math.min对数组要加上apply
   var minheight=Math.min.apply(null,BoxHeightArr);
   var minIndex=getminheightLocation(BoxHeightArr,minheight)
   //设为绝对布局使内容不随屏幕大小改变
   ccontent[i].style.position="absolute";
   ccontent[i].style.top=minheight+"px";
   ccontent[i].style.left=ccontent[minIndex].offsetLeft+"px";
   //该列的高度加上后添加进去图片高度
   BoxHeightArr[minIndex]=BoxHeightArr[minIndex]+ccontent[i].offsetHeight

  }
 }
}
//获取最小高度的位置
function getminheightLocation(BoxHeightArr,minHeight){
 for(var i in BoxHeightArr){
  if (BoxHeightArr[i]==minHeight){
   return i;
  }
 }
}
function getChildElement(parent,content){
 var contentArr=[];
 //获取所有子Element
 var allcontent=parent.getElementsByTagName("*")
 for(var i=0;i<allcontent.length;i++){
  //如果className是box就添加进去
  if (allcontent[i].className==content){
   contentArr.push(allcontent[i]);
  }
 }
 return contentArr
}

这样就简单实现了瀑布流效果

接下来是下拉到底部自动刷新

主要是在滚动时监听是否到底部,到达差不多底部的位置就加载

添加以下代码即可

window.onscroll=function(){
 //模拟数据
 var imgData={"data":[{"src":"2.jpg"},{"src":"3.jpg"},{"src":"4.jpg"},{"src":"5.jpg"},{"src":"6.jpg"}]}
 if (checkFlag()){
  var cparent=document.getElementById("container");
  for(var i =0;i<imgData.data.length;i++){
   var ccontent=document.createElement("div");
   ccontent.className="box";
   cparent.appendChild(ccontent);
   var boximg=document.createElement("div");
   boximg.className="img_box";
   ccontent.appendChild(boximg);
   var img=document.createElement("img");
   img.src="images/"+imgData.data[i].src;
   boximg.appendChild(img);
  }
  //按照之前规则排列
  imgLocation("container","box")
 }
}
function checkFlag(){
 var cparent=document.getElementById("container");
 var ccontent=getChildElement(cparent,"box");
 //最后一张图片距离顶部距离
 var lastContentHeight=ccontent[ccontent.length-1].offsetTop;
 //当前距离
 var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
 //该页面显示的高度
 var pageHeight=document.documentElement.clientHeight||document.body.clientHeight;
 //如果差不多到达底部则返回true
 if (lastContentHeight<scrollTop+pageHeight){
  return true;
 }
}

效果图如下

JavaScript实现图片瀑布流和底部刷新

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
DOM节点深度克隆函数cloneNode()用法实例
Jan 12 Javascript
Jquery promise实现一张一张加载图片
Nov 13 Javascript
js enter键激发事件实例代码
Aug 17 Javascript
JavaScript原生节点操作小结
Jan 17 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
Mar 13 Javascript
JavaScript循环_动力节点Java学院整理
Jun 28 Javascript
Vue2.0中集成UEditor富文本编辑器的方法
Mar 03 Javascript
微信小程序使用gitee进行版本管理
Sep 20 Javascript
基于Fixed定位的框选功能的实现代码
May 13 Javascript
vue分页器组件编写方法详解
Jun 28 Javascript
vue移动端模态框(可传参)的实现
Nov 20 Javascript
如何在面试中手写出javascript节流和防抖函数
Oct 22 Javascript
一个例子轻松学会Vue.js
Jan 02 #Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
Jan 01 #Javascript
详解照片瀑布流效果(js,jquery分别实现与知识点总结)
Jan 01 #Javascript
JavaScript cookie详解及简单实例应用
Dec 31 #Javascript
深入理解Angularjs向指令传递数据双向绑定机制
Dec 31 #Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
Dec 31 #Javascript
Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法
Dec 31 #Javascript
You might like
用PHP动态创建Flash动画
2006/10/09 PHP
THINKPHP项目开发中的日志记录实例分析
2014/12/01 PHP
php魔术函数__call()用法实例分析
2015/02/13 PHP
详解PHP中array_rand函数的使用方法
2016/09/11 PHP
thinkPHP+ajax实现统计页面pv浏览量的方法
2017/03/15 PHP
用php+ajax新建流程(请假、进货、出货等)
2017/06/11 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
2020/01/23 PHP
XAMPP升级PHP版本实现步骤解析
2020/09/04 PHP
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
简介AngularJS的HTML DOM支持情况
2015/06/17 Javascript
漫谈JS引擎的运行机制 你应该知道什么
2016/06/15 Javascript
BootStrap与Select2使用小结
2017/02/17 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
2017/03/21 Javascript
react.js CMS 删除功能的实现方法
2017/04/17 Javascript
react 父组件与子组件之间的值传递的方法
2017/09/14 Javascript
微信小程序实现人脸检测功能
2018/05/25 Javascript
ajax跨域访问遇到的问题及解决方案
2019/05/23 Javascript
js 动态校验开始结束时间的实现代码
2020/05/25 Javascript
JS实现简单移动端鼠标拖拽
2020/07/23 Javascript
如何用JS模拟实现数组的map方法
2020/07/30 Javascript
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
python实现DES加密解密方法实例详解
2015/06/30 Python
Python的净值数据接口调用示例分享
2016/03/15 Python
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
Tensorflow使用支持向量机拟合线性回归
2018/09/07 Python
全方位了解CSS3的Regions扩展
2015/08/07 HTML / CSS
分享CSS3制作卡片式图片的方法
2016/07/08 HTML / CSS
公司市场部岗位职责
2013/12/02 职场文书
中学实习教师自我鉴定
2013/12/12 职场文书
实习单位评语
2014/04/26 职场文书
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
奥巴马竞选演讲稿
2014/05/15 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
债务纠纷委托书范本
2014/10/14 职场文书
红色影片观后感
2015/06/18 职场文书
react中useState使用:如何实现在当前表格直接更改数据
2022/08/05 Javascript