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

缺点:

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

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

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

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

本程序思路:

html结构:

<body><div id="container"><div class="box"><div class="box_img"><img src="img/1.jpg" /></div></div><div class="box"><div class="box_img"><img src="img/2.jpg" /></div></div>...</div>
</body>

一、初始化布局

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: 预先置入部分图片数据

  1 <!DOCTYPE html>
  2 <html>
  3     <head>
  4         <meta charset="UTF-8">
  5         <link rel="stylesheet" type="text/css" href="css/style.css"/>
  6         <script src="js/app.js"></script>
  7         <title>JavaScript瀑布流</title>
  8     </head>
  9     <body>
 10         <div id="container">
 11             <div class="box">
 12                 <div class="box_img">
 13                     <img src="img/1.jpg"/>
 14                 </div>
 15             </div>
 16             <div class="box">
 17                 <div class="box_img">
 18                     <img src="img/2.jpg"/>
 19                 </div>
 20             </div>
 21             <div class="box">
 22                 <div class="box_img">
 23                     <img src="img/3.jpg"/>
 24                 </div>
 25             </div>
 26             <div class="box">
 27                 <div class="box_img">
 28                     <img src="img/4.jpg"/>
 29                 </div>
 30             </div>
 31             <div class="box">
 32                 <div class="box_img">
 33                     <img src="img/5.jpg"/>
 34                 </div>
 35             </div>
 36             <div class="box">
 37                 <div class="box_img">
 38                     <img src="img/6.jpg"/>
 39                 </div>
 40             </div>
 41             <div class="box">
 42                 <div class="box_img">
 43                     <img src="img/7.jpg"/>
 44                 </div>
 45             </div>
 46             <div class="box">
 47                 <div class="box_img">
 48                     <img src="img/8.jpg"/>
 49                 </div>
 50             </div>
 51             <div class="box">
 52                 <div class="box_img">
 53                     <img src="img/9.jpg"/>
 54                 </div>
 55             </div>
 56             <div class="box">
 57                 <div class="box_img">
 58                     <img src="img/10.jpg"/>
 59                 </div>
 60             </div>
 61
 62             <div class="box">
 63                 <div class="box_img">
 64                     <img src="img/1.jpg"/>
 65                 </div>
 66             </div>
 67             <div class="box">
 68                 <div class="box_img">
 69                     <img src="img/2.jpg"/>
 70                 </div>
 71             </div>
 72             <div class="box">
 73                 <div class="box_img">
 74                     <img src="img/3.jpg"/>
 75                 </div>
 76             </div>
 77             <div class="box">
 78                 <div class="box_img">
 79                     <img src="img/4.jpg"/>
 80                 </div>
 81             </div>
 82             <div class="box">
 83                 <div class="box_img">
 84                     <img src="img/5.jpg"/>
 85                 </div>
 86             </div>
 87             <div class="box">
 88                 <div class="box_img">
 89                     <img src="img/6.jpg"/>
 90                 </div>
 91             </div>
 92             <div class="box">
 93                 <div class="box_img">
 94                     <img src="img/7.jpg"/>
 95                 </div>
 96             </div>
 97             <div class="box">
 98                 <div class="box_img">
 99                     <img src="img/8.jpg"/>
100                 </div>
101             </div>
102             <div class="box">
103                 <div class="box_img">
104                     <img src="img/9.jpg"/>
105                 </div>
106             </div>
107
108             <div class="box">
109                 <div class="box_img">
110                     <img src="img/10.jpg"/>
111                 </div>
112             </div>
113
114             <div class="box">
115                 <div class="box_img">
116                     <img src="img/1.jpg"/>
117                 </div>
118             </div>
119             <div class="box">
120                 <div class="box_img">
121                     <img src="img/2.jpg"/>
122                 </div>
123             </div>
124             <div class="box">
125                 <div class="box_img">
126                     <img src="img/3.jpg"/>
127                 </div>
128             </div>
129             <div class="box">
130                 <div class="box_img">
131                     <img src="img/4.jpg"/>
132                 </div>
133             </div>
134             <div class="box">
135                 <div class="box_img">
136                     <img src="img/5.jpg"/>
137                 </div>
138             </div>
139             <div class="box">
140                 <div class="box_img">
141                     <img src="img/6.jpg"/>
142                 </div>
143             </div>
144             <div class="box">
145                 <div class="box_img">
146                     <img src="img/7.jpg"/>
147                 </div>
148             </div>
149             <div class="box">
150                 <div class="box_img">
151                     <img src="img/8.jpg"/>
152                 </div>
153             </div>
154             <div class="box">
155                 <div class="box_img">
156                     <img src="img/9.jpg"/>
157                 </div>
158             </div>
159             <div class="box">
160                 <div class="box_img">
161                     <img src="img/9.jpg"/>
162                 </div>
163             </div>
164             <div class="box">
165                 <div class="box_img">
166                     <img src="img/10.jpg"/>
167                 </div>
168             </div>
169         </div>
170     </body>
171 </html>

style.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:

 1 window.onload = function(){
 2     imgLocation("container", "box");
 3     //ajax模拟数据
 4     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":"3.jpg"},{"src":"4.jpg"},{"src":"5.jpg"},{"src":"6.jpg"},{"src":"8.jpg"}]}
 5
 6     window.onscroll = function(){
 7         if(checkFlag()){    //判断是否到底部要加载新的数据
 8             var cparent = document.getElementById("container");
 9             //把ajax数据加载进页面
10             for(var i=0; i<imgData.data.length; i++){
11                 var ccontent = document.createElement("div");
12                 ccontent.className="box";
13                 cparent.appendChild(ccontent);
14                 var boximg = document.createElement("div");
15                 boximg.className = "box_img";
16                 ccontent.appendChild(boximg);
17                 var img = document.createElement("img");
18                 img.src = "img/"+imgData.data[i].src;
19                 boximg.appendChild(img);
20             }
21             //把所有图片数据重新定位一次
22             imgLocation("container", "box");
23         }
24     }
25 };
26
27 function checkFlag(){
28     var cparent = document.getElementById("container");
29     var ccontent = getChildElement(cparent, "box");
30
31     //得到最后一张图距顶部的高度,滚动高度,窗口高度
32     var lastContentHeight = ccontent[ccontent.length-1].offsetTop;
33     var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
34     var pageHeight = document.documentElement.clientHeight || document.body.clientHeight;
35     console.log(lastContentHeight+":"+scrollTop+":"+pageHeight);
36
37     if(lastContentHeight < scrollTop + pageHeight){
38         return true;
39     }
40 }
41
42 function imgLocation(parent, content){
43     //将parent下所有的content全部取出
44     var cparent = document.getElementById(parent);
45     var ccontent = getChildElement(cparent, content);
46     //根据当前浏览器窗口的宽度,确定每行图片数并固定,居中
47     var imgWidth = ccontent[0].offsetWidth;    //offsetWidth = width + padding + border
48     var num = Math.floor(document.documentElement.clientWidth / imgWidth);
49     cparent.style.cssText = "width:"+imgWidth*num+"px;margin:0 auto";
50     //alert("pause");
51     //设置一个数组,用来承载第一行的图片信息
52     var BoxHeightArr = [];
53     for(var i=0; i<ccontent.length; i++){
54         if(i<num){
55             //第一行的图片的高度记录下来
56             BoxHeightArr[i] = ccontent[i].offsetHeight;
57             //当ajax数据加载后,程序是将所有图片重新定位,所以第一行的图片要清除position:absolute
58             ccontent[i].style.position = "static";
59         }else{
60             var minHeight = Math.min.apply(null, BoxHeightArr);
61             var minIndex = getminheightLocation(BoxHeightArr, minHeight);
62
63             //把图放在第一行图索引值最小的下面
64             ccontent[i].style.position = "absolute";
65             ccontent[i].style.top = minHeight+"px";
66             ccontent[i].style.left = ccontent[minIndex].offsetLeft+"px";
67
68             //图片放好位置后更新“第一行图片信息的最小高度”,
69             //然后利用for循环重复这个动作到结束
70             BoxHeightArr[minIndex] = BoxHeightArr[minIndex] + ccontent[i].offsetHeight;
71         }
72     }
73 ;}
74
75 //获取第一行图片高度最小的索引值
76 function getminheightLocation(BoxHeightArr, minHeight){
77     for(var i in BoxHeightArr){
78         if(BoxHeightArr[i] == minHeight){
79             return i;
80         }
81     }
82 }
83
84 //获取所有box
85 function getChildElement(parent, content){
86     contentArr = parent.getElementsByClassName(content);
87     return contentArr;
88 }


最终效果:

转载于:https://www.cnblogs.com/woodk/p/5128959.html

JavaScript——基本的瀑布流布局及ajax动态新增数据相关推荐

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

    本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax ...

  2. Python爬虫4.2 — ajax(动态网页数据抓取)用法教程

    Python爬虫4.2 - ajax[动态网页数据]用法教程 综述 AJAX 介绍 什么是AJAX 实例说明 请求分析 获取方式 实例说明 其他博文链接 综述 本系列文档用于对Python爬虫技术的学 ...

  3. Echarts3通过ajax动态获取数据,30秒定时图表数据,设置图表线条颜色和粗细

    Echarts3通过ajax动态获取数据,30秒定时图表数据,设置图表线条颜色和粗细 代码块 <!DOCTYPE html> <head><meta charset=&q ...

  4. ajax点击事件无法触发,解决jQuery Ajax动态新增节点无法触发点击事件的问题_婳祎_前端开发者...

    在写ajax加载数据的时候发现,后面添加进来的demo节点元素,失去了之前的点击事件.为什么点击事件失效,我们该怎么去解决呢? 其实最简单的方法就是直接在标签中写οnclick="" ...

  5. JS实现瀑布流布局(动态新增数据)

    本文旨在用JS写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,在页面滚动到底部后模拟ajax数据加载新图片功能. 实现思路: 1.首先对第一行图片进行布局,提取出高度最小一列的高度. 2.第二行开 ...

  6. jsp ajax动态添加数据,jquery Ajax实现Select动态添加数据

    jquery Ajax实现Select动态添加数据,具体内容如下 1.背景 最近在工作中,遇到了一个关于select的问题.一般情况下,select下拉框中的数据都是固定的或者直接在jsp中读取列表值 ...

  7. python爬虫抓取动态网页数据_python网络爬虫抓取ajax动态网页数据:以抓取KFC门店地址为例...

    一,尝试用BeautifulSoup抓取 先打开KFC网站门店列表页面:http://www.kfc.com.cn/kfccda/storelist/index.aspx 可以看到门店列表如下图: 打 ...

  8. crawler:AJAX动态网页数据抓取、Selenium使用

    什么是AJAX: AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML.过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新.这意 ...

  9. echarts在.Net中使用实例(二) 使用ajax动态加载数据

    通过上一篇文章可以知道和echarts参考手册可知,series字段就是用来存储我们显示的数据,所以我们只需要用ajax来获取series的值就可以. option 名称 描述 {color}back ...

最新文章

  1. R语言构建xgboost模型并评估模型(测试集、训练集每一轮):误分类率指标(misclassification rate)、logloss
  2. xmindcore.java_求解Xmind问题
  3. oshi.systeminfo 获取cpu的数量_CPU 的基础知识
  4. linux 内核rt,实时操作系统kernel rt
  5. 23 FI配置-财务会计-未清和关账过账期间
  6. Spring boot的Maven配置依赖
  7. 设计模式笔记十:装饰器模式
  8. 高德地图拾取经纬度 + 搜索 + 标记
  9. 【转】分辨率。各种vga和各种dpi
  10. ffmpeg命令操作 合并视频 取图片帧数 获取音频
  11. paypal接入指南
  12. 【大数据存储】Java操作jena练习
  13. python:pass关键字的作用
  14. 从社交图谱看Web3.0在社交领域的探索
  15. 应用程序无法启动,因为应用程序的并行配置不正确...解决方法
  16. 战地之王Awesonmium
  17. 图解Attention
  18. 频谱聚类|拉普拉斯矩阵
  19. 创业中的“投名状”—leo看赢在中国(2)
  20. 全国计算机二级今年更难吗,全国计算机二级好过吗

热门文章

  1. css中 margin: 0px 254px 0px 254px; 是什么意思。
  2. JSONObject.fromObject--JSON与对象的转换
  3. C语言求随机两个向量乘积,用C语言生成2个随机的矩阵并进行乘法运算
  4. 第十七届全国大学生智能车竞赛开始啦
  5. 印制塑料卡片中的IC芯片
  6. 第十六届全国大学生智能汽车竞赛--百度智慧交通(东部赛区)
  7. 从0开始构建Arduino_STM32
  8. 全国大学生智能汽车竞赛-讯飞智慧餐厅
  9. 音叉晶体振荡器-32.768Hz
  10. 2020人工神经网络第一次作业-解答第一部分