瀑布流就是像瀑布一样的网站——丰富的网站内容,特别是绚美的图片会让你流连忘返。你在浏览网站的时候只需要轻轻滑动一下鼠标滚轮,一切的美妙的图片精彩便可呈现在你面前。瀑布流网站是新兴的一种网站模式——她的典型代表是pinterest、美丽说、蘑菇街这类型的网站。

下面是效果:

核心内容:

1.先设置布局

主要HTML代码如下

<div id="container"><div class="box"><div class="content"><img src="../imgs/Girls/01.jpg"></div></div>...
</div>

然后设置宽度固定,高度自适应,.box 相对布局,向左浮动:

.box { position: relative; float: left; }
.content { padding: 2px; border: 1px solid #ccc; border-radius: 2px; }
.content img { width: 234px; height: auto; }
#container { background: #fff none repeat scroll 0 0;  margin: 0 auto; width: auto; }

2.图片位置摆放

因为图片的高度不一致,先根据页面大小获取第一行的图片数量,然后把第二行第一个张图片放到第一行高度最低的图片下面,以此类推:

function imgLocation() {var cparent = document.getElementById("container");//获取所有类名为box的元素var ccontent = getChildElement(cparent,"box");//第一张图片的宽度var imgWidth = ccontent[0].offsetWidth;//第一列图片数量var numLine = Math.floor(document.documentElement.clientWidth/imgWidth);//设置父容器的宽度cparent.style.cssText = "width:"+ imgWidth * numLine + "px";//获取每一张图片的高度var  boxHeightArr = [];for(var i=0;i<ccontent.length;i++){if(i<numLine){//把第一行元素的高度添加到数组中去boxHeightArr[i] = ccontent[i].offsetHeight;}else {//获取第一行图片高度最低的图片,然后把第二行第一种图片放在其下面,以此类推var minHeight = Math.min.apply(null,boxHeightArr);//获取最低高度图片的Indexvar minIndex = getMinHeightIndex(boxHeightArr,minHeight);ccontent[i].style.position = "absolute";ccontent[i].style.top = minHeight+"px";ccontent[i].style.left = ccontent[minIndex].offsetLeft+"px";//重新计算高度boxHeightArr[minIndex] += ccontent[i].offsetHeight;}}
}
function getMinHeightIndex(boxHeightArr, minHeight) {for(var i in boxHeightArr){if(boxHeightArr[i] === minHeight){return i;}}
}
function getChildElement(parent,className) {var contentArr = [];var allcontent = parent.getElementsByTagName("*");for(var i=0;i<allcontent.length;i++){if(allcontent[i].className === className){contentArr.push(allcontent[i]);}}return contentArr;
}

3.滚动加载

然后通过判断鼠标是否滑动到底部,确定是否自动加载数据。

先判断是否滑到页面底部:

function isScrollBottom(){var cparent = document.getElementById("container");var ccontent = getChildElement(cparent,"box");//最后一张图片出现一半时的页面高度var lastContentHeight = ccontent[ccontent.length - 1].offsetTop + Math.floor(ccontent[ccontent.length - 1].offsetHeight/2);// 当前页面的高度var pageHeight = document.documentElement.clientHeight||document.body.clientHeight;// 鼠标滚动的高度var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;//是否允许滚动return (lastContentHeight < (pageHeight + scrollTop))?true:false;
}

然后监听滚动事件,当满足加载条件时,加载图片:

window.onscroll = function () {//最后一张图片出现一半时加载if(isScrollBottom()){//加载图片var cparent = document.getElementById("container");for(var i=0;i<dataImg.data.length;i++){var box = document.createElement("div");box.className = "box";cparent.appendChild(box);var content = document.createElement("div");content.className = "content";box.appendChild(content);var img = document.createElement("img");img.src = dataImg.data[i].src;content.appendChild(img);}//重新设置图片位置
        imgLocation();}
}

PS:也可以通过Ajax 初始化图片HTML 代码:

function initializeImgs() {var xmlhttp;if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safarixmlhttp=new XMLHttpRequest();}else{// code for IE6, IE5xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}xmlhttp.onreadystatechange = handleResponse;xmlhttp.open("GET",url4girls,true);xmlhttp.send();
}
function handleResponse(e){//当 onreadystatechange 事件被触发后,浏览器会把一个 Event 对象传递给指定的处理函数,target 属性则会被设为与此事件关联的XMLHttpRequestif(e.target.readyState == XMLHttpRequest.DONE && e.target.status == 200){ //请求成功
        addImgBox(e.target.responseText);}
}
function addImgBox(data) {//解析返回的XML文件var imgArr = loadXMLString(data).getElementsByTagName("string");var cparent = document.getElementById("container");for(var i=0;i<imgArr.length;i++){var box = document.createElement("div");box.className = "box";cparent.appendChild(box);var content = document.createElement("div");content.className = "content";box.appendChild(content);var img = document.createElement("img");img.src = imgArr[i].innerHTML;content.appendChild(img);}imgLocation();
}

相关文件

index_by_javascript.html
index_by_javascript.js
index_by_javascript_ajax.html
index_by_javascript_ajax.js
yctools.js
waterfall.css

具体可查看源码

本文转自叶超Luka博客园博客,原文链接:http://www.cnblogs.com/yc-755909659/p/6554232.html,如需转载请自行联系原作者

【Javascript Demo】图片瀑布流实现相关推荐

  1. 用原生JavaScript实现图片瀑布流的浏览效果

    学习JS,活跃思维,灵活运用的一个较为典型的学习案例.同一个瀑布流的效果但实现方式却很多,利用递归.冒泡等等手法都可以达到你想要的目的.这次要说的就是利用类似递归来实现此效果的原创方案.此方案个人认为 ...

  2. jQuery图片瀑布流demo效果示例(整理)jQuery瀑布流效果

    效果图: <!DOCTYPE html> <html lang="zh"><head><meta charset="UTF-8& ...

  3. React单页面图片瀑布流——Macy.js

    图片瀑布流 需求:一个数组里的图片按两列排列,图片尺寸不一样. 问题:如果只是简单的数组分成两个数组,有可能一组图片高度加起来远远高于另一组,视觉效果太差. 想了想简单的js实现逻辑: 1.一个图片数 ...

  4. 图片瀑布流加载和购物车

    图片瀑布流加载 注释中为详细注释 动态添加元素 // 创建图片数组方便后续添加图片路径时使用var img = ["1.jpg", "2.jpg", " ...

  5. Vue原生图片瀑布流

    图片瀑布流可以节省图片的排版空间,美观图片的排列,避免图片排列的参差不齐. 实现图片瀑布流可以固定宽(花瓣),也可以固定高(百度图片),看个人需求,我的需求是宽固定. 如果图片的排列不适用瀑布流的话, ...

  6. Android RecyclerView实现图片瀑布流

    1.图片瀑布流现在几乎基本上是app比较常见的图片展示方式,此文简单介绍下RecyclerView + Glide结合实现图片瀑布流的效果的实现方法之一,先上效果: 2.具体实现如下: // 1.设置 ...

  7. jaliswall.js图片瀑布流插件

    下载地址 jaliswall.js图片瀑布流插件,jQuery响应式瀑布流布插件jaliswall dd:

  8. 微信小程序 简单实现图片瀑布流

    简单实现图片瀑布流 <view class="container"><view class="box" wx:for='{{show}}' w ...

  9. Android初学二之仿微信APP实现RecyclerView控件的设计开发,实现点击事件及图片瀑布流

    目录 0 实验环境 1 界面展示 2 功能说明 3 核心代码 3.1 实现RecyclerView控件的设计开发 3.2 添加了文字库assets 3.3 实现点击事件对item中的每个LinearL ...

  10. 图片瀑布流ios中部分显示空白

    @ios中的web页面图片布局闪动或者显示空白之类问题的解决方法 出现问题的代码(问题现象:ios手机中 商品图片 只有少部分加载成功其余出现大量空白 ) 现在购买再送 80% .pro_img im ...

最新文章

  1. 树莓派实时(30fps)手势识别,从数据集采集开始,全部流程开源
  2. JavaFX技巧31:遮罩/剪切/ Alpha通道
  3. hive创建分区表 指定分隔符_HIVE 对于分区表的操作
  4. NLP《词汇表示方法(四)负采样》
  5. 将一个包含汉字的字符串逐个转化为数字,并得出该字符串的十进制和
  6. Auto layout 的使用
  7. Java教程_软件开发基础
  8. 玩玩直播,搭建一个流媒体服务器
  9. 线性调频信号的脉冲压缩
  10. html语言怎么修改form边框,form表单样式案例 定义html表单细边框样式
  11. mysql 自动化运维开发_Python自动化运维开发----基础(十三)Mysql数据库基础
  12. JavaScript沙箱(环境,黑盒)
  13. 小猿圈python之练习小例子
  14. 实现所有网站的qq登录返回登录后的cookie信息
  15. piaget读法_罗读音【罗读音英语头条】- 罗读音知识点 - 中企动力
  16. 大自然背景的清晨闹铃.wav
  17. 封装型号对照_多图预警,17种元器件PCB封装图鉴
  18. 《比尔总动员》新生驾到 层层有礼
  19. Python脚本可以统计项目代码行数
  20. PandoraBox client模式——承继其他Wi-Fi热点共享给有线

热门文章

  1. Android自动调整TextView的大小
  2. hibernate一级缓存_Hibernate缓存–一级缓存
  3. ios标签控制器怎么用_带故事板的iOS标签栏控制器
  4. 如何在Linux和Mac中清除Bash历史记录
  5. 通过ssh访问git项目
  6. C# 基础补遗(未完待续)
  7. 在微服务中,Kubernetes软件组件有哪些?
  8. 开课吧课堂:人工智能行业走向如何?
  9. C++进阶教程之文件和流
  10. Hadoop_28_MapReduce_自定义 inputFormat