js图片瀑布流

一个简单的图片瀑布流

首先准备一个html文件,css用到很少,所以写在html里,还需要一个js文件及几张图片(分辨率随意)

html的代码:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        body {
            margin: 0px;
            padding: 0px;
        }

        #container {
            position: relative;
        }

        .box_img {
            padding: 5px;
            float: left;
        }

        .box_img img {
            width: 300px;
            height: auto;
        }
    </style>
    <script src="js/test.js">
    </script>
</head>
<body>
<div id="container">
    <div class="box_img">
        <img src="1.jpg">
    </div>
    <div class="box_img">
        <img src="2.jpg">
    </div>
    <div class="box_img">
        <img src="3.jpg">
    </div>
    <div class="box_img">
        <img src="4.jpg">
    </div>
    <div class="box_img">
        <img src="5.jpg">
    </div>
    <div class="box_img">
        <img src="6.jpg">
    </div>
    <div class="box_img">
        <img src="7.jpg">
    </div>
    <div class="box_img">
        <img src="8.jpg">
    </div>
    <div class="box_img">
        <img src="9.jpg">
    </div>
    <div class="box_img">
        <img src="5.jpg">
    </div>
    <div class="box_img">
        <img src="6.jpg">
    </div>
    <div class="box_img">
        <img src="7.jpg">
    </div>
    <div class="box_img">
        <img src="8.jpg">
    </div>
    <div class="box_img">
        <img src="9.jpg">
    </div>
</div>
</body>

</html>

可以看出id为container的div包裹了许多class为box_img的div,而这些div中都包含有一张图片, 但是这样仅仅是图片的堆砌,每行图片之间有很大的留白,这时加入js后即可以实现瀑布流的效果

js的代码:

 1 /**
 2  * Created by earthgee on 2015/4/3.
 3  */
 4 window.onload=function(){
 5     imgLocation("container","box_img");
 6
 7     var imgData={"data":[{"src":"2.jpg"},{"src":"3.jpg"},{"src":"4.jpg"},{"src":"5.jpg"},{"src":"6.jpg"}]};
 8
 9     window.onscroll= function () {
10          if(checkflag()){
11              //动态增加图片,实现自动加载
12              var cparent=document.getElementById("container");
13              for(var i=0;i<imgData.data.length;i++)
14              {
15                  var ccontent=document.createElement("div");
16                  ccontent.className="box_img";
17                  cparent.appendChild(ccontent);
18                  var img=document.createElement("img");
19                  img.src=imgData.data[i].src;
20                  ccontent.appendChild(img);
21              }
22              imgLocation("container","box_img");
23          }
24     }
25 }
26
27 //此函数实现自动加载,通过检查当前页面最后一张图片距离顶端的距离,然后和页面高度及滚动距离作比较
28 function checkflag()
29 {
30     var cparent=document.getElementById("container");
31     var cconent=getChildElement(cparent,"box_img");
32     var lastContentHeight=cconent[cconent.length-1].offsetTop;
33     var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
34     var pageHeight=document.documentElement.scrollTop||document.body.scrollTop;
35     if(lastContentHeight<scrollTop+pageHeight)
36     {
37         return true;
38     }
39 }
40
41 //此函数实现瀑布流
42 function imgLocation(parent,content) {
43     var cparent=document.getElementById(parent);
44     var ccontent=getChildElement(cparent,content);   //ccontent为数组
45     var imgWidth=ccontent[0].offsetWidth;       //获得第一张图片的宽度(因为后面要在css中设置每张图片的宽度相同)
46     var cols=Math.floor(document.documentElement.clientWidth/imgWidth); //一行放多少张图片
47     cparent.style.cssText="width:"+imgWidth*cols+"px;margin:0 auto";
48
49     var boxHeightArr=[];
50     for(var i=0;i<ccontent.length;i++)
51     {
52         if(i<cols)     //boxHeightArr存放第一行图片的宽度
53         {
54             boxHeightArr[i]=ccontent[i].offsetHeight;
55
56         }
57         else
58         {
59             var minheight=Math.min.apply(null,boxHeightArr);
60             var minIndex=getminheightLocation(boxHeightArr,minheight);    //找到第一行最短图片的索引
61             ccontent[i].style.position="absolute";
62             ccontent[i].style.top=minheight+"px";
63             ccontent[i].style.left=ccontent[minIndex].offsetLeft+"px";
64             boxHeightArr[minIndex]=boxHeightArr[minIndex]+ccontent[i].offsetHeight;    //将每一张图片放到当前可以找到的最短图片下面,并增加长度
65         }
66     }
67 }
68
69 function getminheightLocation(boxHeightArr,minHeight) {
70     for(var i in boxHeightArr){
71         if(boxHeightArr[i]==minHeight){
72             return i;
73         }
74     }
75 }
76
77
78 //获得parent的所有class为content的子元素,返回一个数组
79 function getChildElement(parent,content){
80     var contentArr=new Array();
81     var allcontent=parent.getElementsByTagName("*");  //匹配所有子元素
82     for(var i=0;i<allcontent.length;i++)
83     {
84         if(allcontent[i].className==content)
85         {
86             contentArr.push(allcontent[i]);
87         }
88     }
89     return contentArr;
90 }

此时就实现了图片瀑布流的效果,可以放在网站里了...

时间: 2024-10-04 04:25:22

js图片瀑布流的相关文章

JS图片瀑布流制作

这里为大家带来了两种通过js制作图片瀑布流的方法. 一.绝对定位法 计算每个元素的绝对位置进行设置. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0">

js 图片瀑布流效果实现

/** * Created by wwtliu on 14/9/5. */$(document).ready(function(){ $(window).on("load",function(){ imgLocation(); var dataImg = {"data":[{"src":"1.jpg"},{"src":"2.jpg"},{"src":"3.j

代码: 两列图片瀑布流(一次后台取数据,图片懒加载。下拉后分批显示图片。图片高度未知,当图片onload后才显示容器)

代码: 两列图片瀑布流(一次后台取数据,无ajax,图片懒加载.下拉后分批显示图片.图片高度未知,当图片onload后才显示容器) [思路]: 图片瀑布流,网上代码有多种实现方式,也有各类插件.没找到合意的,所以根据网上找的一段代码,进行了较大改动. 需引用 zepto 或 jquery. 我这个是应用于手机上的,两列瀑布流,图片高度未知——等图片的onloaded事件触发后,才对容器进行计算和定位. 大容器是 $("#imgList"),容器格子是$(".pin"

一步步教你js原生瀑布流效果实现

一步步教你js原生瀑布流效果实现 什么是瀑布流效果 首先,让我们先看一段动画: 在动画中,我们不难发现,这个动画有以下特点: 1.所有的图片的宽度都是一样的 2.所有的图片的高度是不一样的 3.图片一张挨着一张竖直排列 4.鼠标向下滚动,一直不停的加载图片 5.浏览器的宽度改变,图片的列数会进行相应的更改 那么这种效果类似现实生活中的瀑布,所以我们叫它瀑布流的效果. Js原生瀑布流效果的实现 从上述分析中,我们可以把整个效果分为以下四个部分: html+css界面搭建 瀑布流效果 浏览器向下滚动

原生JS实现瀑布流

浏览网页的时候经常会遇到瀑布流布局的网站.也许有些读者不了解瀑布流.瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.比如下面图片的效果,就是一个典型的瀑布流. 网上有很多JQ的瀑布流插件,而且都写好了兼容,都可以尝试去使用,这里只是跟大家分享一下原生js实现瀑布流的效果,一起学习. 一步一步来: 首先新建一个文件,就叫瀑布流.html吧. <!doctype html> <html

bootstrap+masonry.js写瀑布流

最近在用bootstrap写一个网站,其中有个图文展示的页面要用到瀑布流的效果.因为项目要求,项目要以bootstrap为基准,不准私自添加内联样式.内部样式,所以,自己写瀑布流就不行了,所以,根据要求,百度查找相关资料,看到masonry.js.个人认为这是一个非常好用的瀑布流插件.下面说一下我在引用的过程中遇到的问题,一开始我用bootstrap栅格系统布局,代码如下 <div class="row masonry"> <div class="col-x

ajax抓取网站接口图片瀑布流笔记

用php结合ajax来实现去其它网站抓取图片,在自己本地用! ajax代码部分 <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>图片瀑布流</title> </head> <style>     body{         margin:0;     }    #u

jQuery+HTML5图片瀑布流效果

JavaScript与HTML5实现美女瀑布流布局,本方法是把图片的路径写在了JS的数组里,不过重点好像不是在这里,而是在图片如何自动排列的问题,你可以运行本实例后,点击“加载瀑布流布局”按钮,即可看到图片的瀑布流排列效果,现在很流行这个,希望您从本代码中能找到一些灵感. <!DOCTYPE HTML> <html> <head> <title>jQuery+HTML5图片瀑布流效果丨河北电动叉车|石家庄苗木</title> <style

ios图片瀑布流代码

ios瀑布流,实现简单的瀑布流视图布局,可以显示网络图片,下拉刷新,上拉加载更多. 下载:http://www.huiyi8.com/sc/9087.html ios图片瀑布流代码,布布扣,bubuko.com