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 相关文章推荐
js类中获取外部函数名的方法与代码
Sep 12 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
Oct 18 Javascript
利用JS进行图片的切换即特效展示图片
Dec 03 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
Mar 18 Javascript
AngularJs 国际化(I18n/L10n)详解
Sep 01 Javascript
在localStorage中存储对象数组并读取的方法
Sep 24 Javascript
JS实现的自动打字效果示例
Mar 10 Javascript
JS实现瀑布流布局
Oct 21 Javascript
JS获取数组中出现次数最多及第二多元素的方法
Oct 27 Javascript
angular.js实现列表orderby排序的方法
Oct 02 Javascript
mpvue+vant app搭建微信小程序的方法步骤
Feb 11 Javascript
详解Vue.js 响应接口
Jul 04 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
Windows7下PHP开发环境安装配置图文方法
2010/05/20 PHP
php脚本运行时的超时机制详解
2016/02/17 PHP
Symfony模板的快捷变量用法实例
2016/03/17 PHP
javascript代码运行不出来执行错误的可能情况整理
2013/10/18 Javascript
控制input输入框中提示信息的显示和隐藏的方法
2014/02/12 Javascript
jquery获取当前点击对象的value方法
2014/02/28 Javascript
网页中表单按回车就自动提交的问题的解决方案
2014/11/03 Javascript
js实现checkbox全选、不选与反选的方法
2015/02/09 Javascript
javascript实现密码强度显示
2015/03/18 Javascript
jQuery插件datepicker 日期连续选择
2015/06/12 Javascript
javascript实现图片上传前台页面
2015/08/18 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
Javascript实现代码折叠功能
2016/08/25 Javascript
JavaScript无阻塞加载和defer、async详解
2017/02/26 Javascript
基于vue实现swipe分页组件实例
2017/05/25 Javascript
Windows下Node.js安装及环境配置方法
2017/09/18 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
2017/10/17 Javascript
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
angular4 JavaScript内存溢出问题
2018/03/06 Javascript
详解Nuxt.js部署及踩过的坑
2018/08/07 Javascript
详解angular2 控制视图的封装模式
2018/12/27 Javascript
详解JavaScript的数据类型以及数据类型的转换
2019/04/20 Javascript
vue配置接口域名方法总结
2019/05/12 Javascript
功能完善的小程序日历组件的实现
2020/03/31 Javascript
[52:39]完美世界DOTA2联赛PWL S3 CPG vs Forest 第一场 12.16
2020/12/17 DOTA
python通过urllib2获取带有中文参数url内容的方法
2015/03/13 Python
Python面向对象之类的封装操作示例
2019/06/08 Python
高考考python编程是真的吗
2020/07/20 Python
优秀管理者获奖感言
2014/02/17 职场文书
2014信息公开实施方案
2014/02/22 职场文书
股权投资意向书
2014/04/01 职场文书
地球一小时倡议书
2014/04/15 职场文书
爱心捐书活动总结
2014/07/05 职场文书
高中生第一学年自我鉴定
2014/09/12 职场文书
综合素质评价个性发展自我评价
2015/03/06 职场文书
小区环境卫生倡议书
2015/04/29 职场文书