用js实现图片自动加载的瀑布流效果

  向下滑动网页的时候能够自动加载图片并显示。

  盛放图片的盒子模型如下:

    <div class="box">
            <div class="box_img">
                <img src="Img/8.jpg">
            </div>
        </div>

  设置img-width为150px,然后box_img添加内边距和阴影效果,box的外边距为0,添加内边距。盒子的宽度是由img-width和边距撑开的。也就是说盒子之间是没有间距的,但是盒子内部有一些边距的效果。这样在js设置位置的时候就不用考虑边距问题,直接调用box的宽度就可以了。

  设置盛放所有box的div的position为relative,这样在设置top值或是left值的时候,就不用考虑最外层的margin属性。

  放置图片的位置:获得第一行图片的高度并且存放在数组里面,接下来的图片设置position为absolute,放置在高度最小的图片的下面,然后设置top和left,并且把数组的最小值加上新放置的图片的高度。也就是说HTML里面原始放置的图片除了第一行以外,其他的图片都是在js里面又重新定位的。

  当滑动页面到底部的时候触发事件函数,紧接着放置一些图片,这样保证图片的无限加载。

  HTML文件:

  1 <!DOCTYPE html>
  2 <html>
  3 <head lang="en">
  4     <meta charset="UTF-8">
  5     <title></title>
  6     <link rel="stylesheet" href="waterfall.css" type="text/css">
  7     <script src="waterfall.js"></script>
  8 </head>
  9 <body>
 10     <div id="content">
 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         <div class="box">
 62             <div class="box_img">
 63                 <img src="Img/1.jpg">
 64             </div>
 65         </div>
 66         <div class="box">
 67             <div class="box_img">
 68                 <img src="Img/2.jpg">
 69             </div>
 70         </div>
 71         <div class="box">
 72             <div class="box_img">
 73                 <img src="Img/3.jpg">
 74             </div>
 75         </div>
 76         <div class="box">
 77             <div class="box_img">
 78                 <img src="Img/4.jpg">
 79             </div>
 80         </div>
 81         <div class="box">
 82             <div class="box_img">
 83                 <img src="Img/5.jpg">
 84             </div>
 85         </div>
 86         <div class="box">
 87             <div class="box_img">
 88                 <img src="Img/6.jpg">
 89             </div>
 90         </div>
 91         <div class="box">
 92             <div class="box_img">
 93                 <img src="Img/7.jpg">
 94             </div>
 95         </div>
 96         <div class="box">
 97             <div class="box_img">
 98                 <img src="Img/8.jpg">
 99             </div>
100         </div>
101         <div class="box">
102             <div class="box_img">
103                 <img src="Img/9.jpg">
104             </div>
105         </div>
106         <div class="box" >
107             <div class="box_img">
108                 <img src="Img/10.jpg">
109             </div>
110         </div>
111         <div class="box">
112             <div class="box_img">
113                 <img src="Img/1.jpg">
114             </div>
115         </div>
116         <div class="box">
117             <div class="box_img">
118                 <img src="Img/2.jpg">
119             </div>
120         </div>
121         <div class="box">
122             <div class="box_img">
123                 <img src="Img/3.jpg">
124             </div>
125         </div>
126         <div class="box">
127             <div class="box_img">
128                 <img src="Img/4.jpg">
129             </div>
130         </div>
131         <div class="box">
132             <div class="box_img">
133                 <img src="Img/5.jpg">
134             </div>
135         </div>
136         <div class="box">
137             <div class="box_img">
138                 <img src="Img/6.jpg">
139             </div>
140         </div>
141         <div class="box">
142             <div class="box_img">
143                 <img src="Img/7.jpg">
144             </div>
145         </div>
146         <div class="box">
147             <div class="box_img">
148                 <img src="Img/8.jpg">
149             </div>
150         </div>
151         <div class="box">
152             <div class="box_img">
153                 <img src="Img/9.jpg">
154             </div>
155         </div>
156         <div class="box" >
157             <div class="box_img">
158                 <img src="Img/10.jpg">
159             </div>
160         </div>
161         <div class="box">
162             <div class="box_img">
163                 <img src="Img/1.jpg">
164             </div>
165         </div>
166         <div class="box">
167             <div class="box_img">
168                 <img src="Img/2.jpg">
169             </div>
170         </div>
171         <div class="box">
172             <div class="box_img">
173                 <img src="Img/3.jpg">
174             </div>
175         </div>
176         <div class="box">
177             <div class="box_img">
178                 <img src="Img/4.jpg">
179             </div>
180         </div>
181         <div class="box">
182             <div class="box_img">
183                 <img src="Img/5.jpg">
184             </div>
185         </div>
186         <div class="box">
187             <div class="box_img">
188                 <img src="Img/6.jpg">
189             </div>
190         </div>
191         <div class="box">
192             <div class="box_img">
193                 <img src="Img/7.jpg">
194             </div>
195         </div>
196         <div class="box">
197             <div class="box_img">
198                 <img src="Img/8.jpg">
199             </div>
200         </div>
201         <div class="box">
202             <div class="box_img">
203                 <img src="Img/9.jpg">
204             </div>
205         </div>
206         <div class="box" >
207             <div class="box_img">
208                 <img src="Img/10.jpg">
209             </div>
210         </div>
211         <div class="box">
212             <div class="box_img">
213                 <img src="Img/1.jpg">
214             </div>
215         </div>
216         <div class="box">
217             <div class="box_img">
218                 <img src="Img/2.jpg">
219             </div>
220         </div>
221         <div class="box">
222             <div class="box_img">
223                 <img src="Img/3.jpg">
224             </div>
225         </div>
226         <div class="box">
227             <div class="box_img">
228                 <img src="Img/4.jpg">
229             </div>
230         </div>
231         <div class="box">
232             <div class="box_img">
233                 <img src="Img/5.jpg">
234             </div>
235         </div>
236         <div class="box">
237             <div class="box_img">
238                 <img src="Img/6.jpg">
239             </div>
240         </div>
241         <div class="box">
242             <div class="box_img">
243                 <img src="Img/7.jpg">
244             </div>
245         </div>
246         <div class="box">
247             <div class="box_img">
248                 <img src="Img/8.jpg">
249             </div>
250         </div>
251         <div class="box">
252             <div class="box_img">
253                 <img src="Img/9.jpg">
254             </div>
255         </div>
256         <div class="box" >
257             <div class="box_img">
258                 <img src="Img/10.jpg">
259             </div>
260         </div>
261     </div>
262 </body>
263 </html>

  CSS文件:

 1 *{
 2     margin: 0;
 3     padding:0;
 4 }
 5 #content{
 6     position: relative;
 7     background-color: #006000;
 8 }
 9 .box{
10     padding: 5px;
11     float: left;
12 }
13 .box_img{
14     padding: 5px;
15     border: 1px solid #cccccc;
16     box-shadow: 0 0 5px #cccccc;
17     border-radius: 5px;
18 }
19 img{
20     width: 150px;
21     height: auto;
22 }

  js文件:

  Math.floor()函数能够向下取整。

  Math.min.apply(null,heightArr);函数能获得heightArr数组的最小值。

  window.onscroll=function(){};滑动页面的时候触发这个函数。

  document.documentElement.clientHeight;浏览器显示出来的高度。

  document.documentElement.scrollTop;滑动的距离。

/**
 * Created by asua on 2016/4/9.
 */
window.onload=function(){
    imgLocation("content","box");
    var lodeImage={"Date":[{"src":"1.jpg"},{"src":"2.jpg"},{"src":"3.jpg"},{"src":"4.jpg"},{"src":"5.jpg"},{"src":"6.jpg"},{"src":"7.jpg"},{"src":"8.jpg"},{"src":"9.jpg"},{"src":"10.jpg"},]}
    window.onscroll=function(){
        if(checkFlag()){
            for(var i=0;i<lodeImage.Date.length;i++){
                var box=document.createElement("div");
                box.className="box";
                var cparent=document.getElementById("content");
                cparent.appendChild(box);
                var box_img=document.createElement("div");
                box_img.className="box_img";
                box.appendChild(box_img);
                var img=document.createElement("img");
                img.src="Img/"+lodeImage.Date[i].src;
                box_img.appendChild(img);
            }
            imgLocation("content","box");
        }
    }
}
function checkFlag(){
    var cparent=document.getElementById("content");
    var ccontent=getChildElement(cparent,"box");
    var lastContentHeight=ccontent[ccontent.length-1].offsetTop;
    var scrollHeight=document.documentElement.scrollTop||document.body.scrollTop;
    var pageHeight=document.documentElement.clientHeight||document.body.clientHeight;
    console.log(lastContentHeight+":"+scrollHeight+":"+pageHeight);
    if(lastContentHeight<scrollHeight+pageHeight){
        return true;
    }
}
function imgLocation(parent,child){
    var cparent=document.getElementById(parent);
    var ccontent=getChildElement(cparent,child);
    var imgwidth=ccontent[0].offsetWidth;
    var cols=Math.floor(document.documentElement.clientWidth/imgwidth);
    cparent.style.cssText="width:"+imgwidth*cols+"px;margin:30px auto";
    var heightArr=[];
    for(var i=0;i<ccontent.length;i++){
        if(i<cols){
            heightArr.push(ccontent[i].offsetHeight);
        }else{
            var minHeight=Math.min.apply(null,heightArr);
            var minIndex=getMinIndex(heightArr,minHeight);
            ccontent[i].style.position="absolute";
            ccontent[i].style.top=minHeight+"px";
            ccontent[i].style.left=ccontent[minIndex].offsetLeft+"px";
            heightArr[minIndex]+=ccontent[i].offsetHeight;
        }
    }
}
function getMinIndex(heightArr,minHeight){
    for(var i=0;i<heightArr.length;i++){
        if(heightArr[i]==minHeight){
            return i;
        }
    }
}
function getChildElement(parent,content){
    var contentArr=[];
    var allcontent=parent.getElementsByTagName("*");
    for(var i=0;i<allcontent.length;i++){
        if(allcontent[i].className==content){
            contentArr.push(allcontent[i]);
        }
    }
    return contentArr;
}

  效果:

时间: 2024-08-11 05:42:56

用js实现图片自动加载的瀑布流效果的相关文章

JS实现图片预加载无需等待

网站开发时经常需要在某个页面需要实现对大量图片的浏览;用javascript来实现一个图片浏览器,让用户无需等待过长的时间就能看到其他图片 网站开发时经常需要在某个页面需要实现对大量图片的浏览,如果考虑流量的话,大可以像pconline一样每个页面只显示一张图片,让用户每看一张图片就需要重新下载一下整个页面.不过,在web2.0时代,更多人愿意用javascript来实现一个图片浏览器,让用户无需等待过长的时间就能看到其他图片. 知道了一张图片的地址,需要把它在一个固定大小的html容器(可以是

js图片未加载完显示loading效果

<html> <title>js图片未加载完显示loading效果</title> <body> <style> img{float:left;width:200px;height:200px;margin:0 10px 10px 0} </style> <script> //判断浏览器 var Browser=new Object(); Browser.userAgent=window.navigator.userAge

页面性能优化-原生JS实现图片懒加载

在项目开发中,我们往往会遇到一个页面需要加载很多图片的情况.我们可以一次性加载全部的图片,但是考虑到用户有可能只浏览部分图片.所以我们需要对图片加载进行优化,只加载浏览器窗口内的图片,当用户滚动时,再加载更多的图片.这种加载图片的方式叫做图片懒加载,又叫做按需加载或图片的延时加载.这样做的好处是:1.可以加快页面首屏渲染的速度:2.节约用户的流量. 一.实现思路 1.图片img标签自定义一个属性data-src来存放真实的地址. 2.当滚动页面时,检查所有的img标签,判断是否出现在事业中,如果

html+js实现图片预加载(异步加载)

在前端设计时,为了让某县页面的图片即使缓存到浏览器中,一般使用预加载技术,但更为确切的应该称为异步加载,因为对线程不会造成阻塞. 核心代码 <script type="text/javascript">   function loadImage(id,src,callback)   { var img = new window.Image(); //当图片成功加载到浏览器缓存 img.onload =function(evt)   { if(typeof(img.ready

原生js实现图片懒加载

原理: 将页面中的img标签src指向一张小图片或者src为空,然后定义data-src(这个属性可以自定义命名,我自己用data-src)属性指向真实的图片. src指向一张默认的图片,否则当src为空时也会向服务器发送一次请求.可以指向loading的地址. 代码实现: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title&

Js 之图片懒加载插件

一.PC端(lazyload) 1.引入js文件 <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.lazyload/1.9.1/jquery.lazyload.min.js"></scrip

js获取图片是否加载完毕

Snandy If you cannot hear the sound of the genuine in you, you will all of your life spend your days on the ends of strings that somebody else pulls. JavaScript判断图片是否加载完成的三种方式 有时需要获取图片的尺寸,这需要在图片加载完成以后才可以.有三种方式实现,下面一一介绍. 一.load事件 <!DOCTYPE HTML> <

原生JS实现图片懒加载之一:Element.getBoundingClientRect()

实际项目开放中,特别是电商项目,由于有大量的图片加载必然会影响性能,所以实现图片的懒加载是非常有必要的. 实现图片懒加载的知识点 标签的data-属性 可视区域的监听 实现图片懒加载的原理 <img alt="loading..." data-src="images/1.jpg"> 当我们监听到图片进入可视区域后,就将data-src到值赋值给src属性 <script> var images = document.querySelector

原生js实现图片懒加载原理

背景:页面图片多,加载的图片就多.服务器压力就会很大.不仅影响渲染速度还会浪费带宽.比如一个1M大小的图片,并发情况下,达到1000并发,即同时有1000个人访问,就会产生1个G的带宽.为了解决以上问题,提高用户体验,就出现了懒加载方式来减轻服务器的压力,优先加载可视区域的内容,其他部分等进入了可视区域再加载,从而提高性能. 1.懒加载原理一张图片就是一个<img>标签,浏览器是否发起请求图片是根据<img>的src属性,所以实现懒加载的关键就是: 在图片没有进入可视区域时,先不给