瀑布流就是像瀑布一样的网站——丰富的网站内容,特别是绚美的图片会让你流连忘返。你在浏览网站的时候只需要轻轻滑动一下鼠标滚轮,一切的美妙的图片精彩便可呈现在你面前。瀑布流网站是新兴的一种网站模式——她的典型代表是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);
//获取最低高度图片的Index
var 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, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = handleResponse;
xmlhttp.open("GET",url4girls,true);
xmlhttp.send();
}
function handleResponse(e){
//当 onreadystatechange 事件被触发后,浏览器会把一个 Event 对象传递给指定的处理函数,target 属性则会被设为与此事件关联的XMLHttpRequest
if(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

具体可查看源码

最新文章

  1. 事务日志以及虚拟日志文件(VLFs)概述
  2. Kotlin Groovy Style Builder
  3. USACO 2014 JAN 滑雪录像
  4. [LeetCode] 8. String to Integer (atoi)
  5. CSS3:flex布局应用
  6. maven项目导入,包名出现异常-多出一个java的前缀
  7. windows 文件权限导致的 git 问题
  8. Android开发-API指南-&lt;meta-data&gt;
  9. 洛谷P1215 [USACO1.4]母亲的牛奶 Mother&#39;s Milk
  10. 检查字符串长度 检查字符串是否为空 用正则表达式验证出版物的ISBN号 用正则表达式验证邮证编码 验证字符串中是否含有汉字
  11. reduce + Promise 顺序执行代码
  12. 手把手视频:万能开源Hawk抓取动态网站
  13. ⑤JS返回格式化的当前时间和上周时间
  14. Koltin——最详细的可见性修饰符详解
  15. java网络编程(1)
  16. 【Android应用开发】RecycleView API 翻译 (文档翻译)
  17. SpriteBuilder实现2D精灵光影明暗反射效果(一)
  18. Word 如何设置空白页不编码,其他页码连续
  19. nginx的websock问题解决
  20. 阿里读写分离数据源SELECT LAST_INSERT_ID()获取不到id

热门文章

  1. hdu4812 逆元+树分治
  2. list的遍历
  3. UOJ Round #1 题解
  4. Codeforces 915F Imbalance Value of a Tree
  5. BZOJ1826 [JSOI2010]缓存交换 堆 贪心
  6. 6-5 巡逻机器人 uva1600
  7. 031 分布式中,zookeeper的部署
  8. PhotoShop 常用快捷键
  9. Python String 方法详解
  10. HDU1532 网络流最大流【EK算法】(模板题)