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 相关文章推荐
jquery form 隐藏的input 选择
Apr 29 Javascript
TypeScript具有的几个不同特质
Apr 07 Javascript
JavaScript中的replace()方法使用详解
Jun 06 Javascript
js实现的Easy Tabs选项卡用法实例
Sep 06 Javascript
jQuery绑定事件的几种实现方式
May 09 Javascript
Bootstrap基本组件学习笔记之面板(14)
Dec 08 Javascript
详解Vuejs2.0之异步跨域请求
Apr 20 Javascript
ReactNative列表ListView的用法
Aug 02 Javascript
Vuejs 页面的区域化与组件封装的实现
Sep 11 Javascript
js的函数的按值传递参数(实例讲解)
Nov 16 Javascript
使用apifm-wxapi模块中的问题及解决方法
Aug 05 Javascript
jquery实现的放大镜效果示例
Feb 24 jQuery
一个例子轻松学会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
对盗链说再见...
2006/10/09 PHP
解析用PHP实现var_export的详细介绍
2013/06/20 PHP
php实现过滤UBB代码的类
2015/03/12 PHP
简单谈谈favicon
2015/06/10 PHP
PHP的HTTP客户端Guzzle简单使用方法分析
2019/10/30 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
在JavaScript中使用inline函数的问题
2007/03/08 Javascript
javascript 用记忆函数快速计算递归函数
2010/03/15 Javascript
JavaScript入门之事件、cookie、定时等
2011/10/21 Javascript
JS高级调试技巧:捕获和分析 JavaScript Error详解
2014/03/16 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
JS实现为表格动态添加标题的方法
2015/03/31 Javascript
学JavaScript七大注意事项【必看】
2016/05/04 Javascript
轻松实现jQuery添加删除按钮Click事件
2017/03/13 Javascript
js获取html页面代码中图片地址的实现代码
2018/03/05 Javascript
vue组件jsx语法的具体使用
2018/05/21 Javascript
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
使用jQuery实现掷骰子游戏
2019/10/24 jQuery
JS实现横向跑马灯效果代码
2020/04/20 Javascript
vue实现几秒后跳转新页面代码
2020/09/09 Javascript
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
Python中使用ElementTree解析XML示例
2015/06/02 Python
Django rest framework工具包简单用法示例
2018/07/20 Python
Python设计模式之职责链模式原理与用法实例分析
2019/01/11 Python
python利用Tesseract识别验证码的方法示例
2019/01/21 Python
PyQt5 加载图片和文本文件的实例
2019/06/14 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
2019/07/22 Python
Python持续监听文件变化代码实例
2020/07/22 Python
pycharm最新激活码有效期至2100年(亲测可用)
2021/02/05 Python
英国最大的奢侈品零售网络商城:Flannels
2016/09/16 全球购物
Forever 21美国官网:美国标志性快时尚品牌
2017/02/20 全球购物
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
JVM是一个编译程序还是解释程序
2012/09/11 面试题
在校大学生的职业生涯规划书
2014/03/14 职场文书
篮球赛新闻稿
2015/07/17 职场文书
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android