微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

纯js实现瀑布流布局及ajax动态新增数据

本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能

缺点:

1. 程序不是响应式,不能实时调整页面宽度;

2. 程序中当新增ajax模拟数据图片后,是将整个页面的所有图片都重新定位一次。

3. 程序是等所有图片加载完成后再读取图片的尺寸,实际中肯定不能这样做。

4. 实际项目中,应该由后台程序给出图片尺寸值,在js代码中直接使用图片的width属性

本程序思路:

html结构:

rush:xhtml;">
Box">
Box_img">
Box">
Box_img">
...

一、初始化布局

1. 设置#container为position:relative;

2. 设置.Box为float:left;

3. 网页加载后对所有图片进行定位;

  3.1 图片宽度是固定的,计算出当前页面每行能容纳的图片数num,并得出#container的宽度,然后设置页面居中;

  3.2 循环遍历所有图片,前num个图片认float布局作为第一行,并存入数组BoxHeightArr = [];

  3.3 第一行布局完成后,排布下一个图片,并更新BoxHeightArr[]:

    3.3.1 将下一个图片放到第一行最矮图片的下方(用position:absolute定位),也就是BoxHeightArr[]中高度最小的那一列,记录下列数的索引值:minIndex;

    3.3.2 更新BoxHeightArr[]中最小的那个值(BoxHeightArr[minIndex]+当前图片的高度);

  3.4 重复循环3.3步骤,直到所有图片都排布完成

二、实时监测滚动高度,是否要加载新数据

1.初始化完成后得到最后一个图片距离顶部的高度: lastContentHeight

2.用window.onscroll = function(){...}

  实时监测当前页面的滚动高度为:scrollTop

  实时监测当前页面视窗高度为:pageHeight

3. 当页面监测到:lastContentHeight < scrollTop + pageHeight 时,用ajax获取新增图片的json数据。

三、页面底部新增内容

1. 用一个循环,先创建一个新的图片容器,添加底部,然后将json数据中相应的图片数据如路径等信息写入该容器完成添加图片

2. 所有新增图片添加完成后,对整个页面的所有图片及布局重新执行步骤一的初始化操作。

项目文件夹:

index.html: 预先置入部分图片数据

rush:xhtml;"> <Meta charset="UTF-8"> JavaScript瀑布流
Box">
Box_img">
Box">
Box_img">
Box">
Box_img">
Box">
Box_img">
Box">
Box_img">
Box">
Box_img">
Box">
Box_img">
Box">
Box_img">
Box">
Box_img">
Box">
Box_img">

<div class="Box">
<div class="Box_img">
<img src="img/1.jpg"/>

Box">
Box_img">
Box">
Box_img">
Box">
Box_img">
Box">
Box_img">
Box">
Box_img">
Box">
Box_img">
Box">
Box_img">
Box">
Box_img">

<div class="Box">
<div class="Box_img">
<img src="img/10.jpg"/>

<div class="Box">
<div class="Box_img">
<img src="img/1.jpg"/>

Box">
Box_img">
Box">
Box_img">
Box">
Box_img">
Box">
Box_img">
Box">
Box_img">
Box">
Box_img">
Box">
Box_img">
Box">
Box_img">
Box">
Box_img">
Box">
Box_img">

style.css:

rush:css;"> *{ margin: 0; padding: 0; } #container{ position: relative; } .Box{ padding: 5px; float: left; } .Box_img{ padding: 5px; border: 1px solid #ccc; Box-shadow: 0 0 5px #ccc; border-radius: 5px; } .Box_img img{ width: 150px; height: auto; }

app.js:

rush:js;"> window.onload = function(){ imgLocation("container","Box"); //ajax模拟数据 var imgData = {"data":[{"src":"2.jpg"},{"src":"3.jpg"},{"src":"4.jpg"},{"src":"5.jpg"},{"src":"6.jpg"},{"src":"8.jpg"},{"src":"2.jpg"},{"src":"8.jpg"}]}

window.onscroll = function(){
if(checkFlag()){ //判断是否到底部要加载新的数据
var cparent = document.getElementById("container");
//把ajax数据加载进页面
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 = "Box_img";
ccontent.appendChild(Boximg);
var img = document.createElement("img");
img.src = "img/"+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;
console.log(lastContentHeight+":"+scrollTop+":"+pageHeight);

if(lastContentHeight < scrollTop + pageHeight){
return true;
}
}

function imgLocation(parent,content){
//将parent下所有的content全部取出
var cparent = document.getElementById(parent);
var ccontent = getChildElement(cparent,content);
//根据当前浏览器窗口的宽度,确定每行图片数并固定,居中
var imgWidth = ccontent[0].offsetWidth; //offsetWidth = width + padding + border
var num = Math.floor(document.documentElement.clientWidth / imgWidth);
cparent.style.csstext = "width:"+imgWidth*num+"px;margin:0 auto";
//alert("pause");
//设置一个数组,用来承载第一行的图片信息
var BoxHeightArr = [];
for(var i=0; i<ccontent.length; i++){
if(i<num){
//第一行的图片的高度记录下来
BoxHeightArr[i] = ccontent[i].offsetHeight;
//当ajax数据加载后,程序是将所有图片重新定位,所以第一行的图片要清除position:absolute
ccontent[i].style.position = "static";
}else{
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";

//图片放好位置后更新“第一行图片信息的最小高度”,
//然后利用for循环重复这个动作到结束
BoxHeightArr[minIndex] = BoxHeightArr[minIndex] + ccontent[i].offsetHeight;
}
}
;}

//获取第一行图片高度最小的索引值
function getminheightLocation(BoxHeightArr,minHeight){
for(var i in BoxHeightArr){
if(BoxHeightArr[i] == minHeight){
return i;
}
}
}

//获取所有Box
function getChildElement(parent,content){
contentArr = parent.getElementsByClassName(content);
return contentArr;
}

效果图:

以上就是本文的全部内容,希望对大家学习javascript程序设计有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐