基于JavaScript实现瀑布流布局

本文实例讲解了原生JavaScript实现瀑布流布局详细代码,分享给大家供大家参考,具体内容如下

效果图:

具体代码:

HTML

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <link rel="stylesheet" type="text/css" href="css/style.css">
  <script type="text/javascript" src="js/app.js"></script>
</head>
<body>
  <div id="container">
    <div class="box">
       <div class="box_img"> <img src="images/1.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/2.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/3.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/4.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/5.jpg" alt=""></div>
    </div>
  <div class="box">
       <div class="box_img"> <img src="images/6.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/7.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/8.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/9.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/10.jpg" alt=""></div>
    </div>

    <div class="box">
       <div class="box_img"> <img src="images/1.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/2.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/3.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/4.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/5.jpg" alt=""></div>
    </div>
  <div class="box">
       <div class="box_img"> <img src="images/6.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/7.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/8.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/9.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/10.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/1.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/2.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/3.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/4.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/5.jpg" alt=""></div>
    </div>
  <div class="box">
       <div class="box_img"> <img src="images/6.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/7.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/8.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/9.jpg" alt=""></div>
    </div>
    <div class="box">
       <div class="box_img"> <img src="images/10.jpg" alt=""></div>
    </div>

  </div>
</body>
</html>

CSS代码:

*{
   margin: 0px;
   padding: 0px;
}

#container{
   position: relative;
}

.box{
   padding: 5px;
   float: left;
}
.box_img{
   padding: 5px;
   border: 1px solid #cccccc;
   box-shadow: 0 0 5px #ccc;
   border-radius: 5px;
}

.box_img img{
   width: 150px;
   height:auto;
}

js代码:

window.onload=function(){
   imgLocation("container","box");
   var imgData={
     "data":[
       {"src":"2.jpg"},
       {"src":"3.jpg"},
       {"src":"4.jpg"},
       {"src":"5.jpg"},
       {"src":"6.jpg"},
       {"src":"7.jpg"},
       {"src":"8.jpg"},
     ]
   };
   window.onscroll=function(){
    if (checkFlag()) {
      var cparent=document.getElementById("container");
      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="images/"+imgData.data[i].src;
         boximg.appendChild(img);
      }
       imgLocation("container","box");
    }
   }
}

function checkFlag(){
   var cparent=document.getElementById("container");
   var ccontent=getChildnode(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;
   if (lastContentHeight<scrollTop+pageHeight) {
    return true;
   }
}
function imgLocation(parent,content){
     var cparent=document.getElementById(parent);
     var ccontent=getChildnode(cparent,content);
     var imgWidth=ccontent[0].offsetWidth;
     var cols=Math.floor(document.documentElement.clientWidth/imgWidth);
     cparent.style.cssText="width:"+imgWidth*cols+"px;margin:0 auto";

   //把第二排的左起第一张图片放到第一排高度最小的那张下面
     var imgHeightArr=[];
     for (var i = 0; i < ccontent.length; i++) {
        if (i<cols) {
            imgHeightArr[i]=ccontent[i].offsetHeight;
        }else{
            var minHeight=Math.min.apply(null,imgHeightArr);
            var minHeightIndex=getMinHeightLoc(imgHeightArr,minHeight);
            console.log("minHeightIndex"+minHeightIndex);
      ccontent[i].style.position="absolute";
      ccontent[i].style.top=minHeight+"px";
      ccontent[i].style.left=ccontent[minHeightIndex].offsetLeft+"px";
      imgHeightArr[minHeightIndex]=imgHeightArr[minHeightIndex]+ccontent[i].offsetHeight;
        console.log(imgHeightArr[i]);
        console.log("高度最低:"+minHeight);
        }

    }

}

function getChildnode(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;
}

function getMinHeightLoc(imgHeightArr,minHeight){
   for(var i in imgHeightArr){
      if (imgHeightArr[i]==minHeight) {
       return i;
      }
   }
}

希望本文所述对大家学习javascript程序设计有所帮助。

(0)

相关推荐

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

    本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax模拟数据图片后,是将整个页面的所有图片都重新定位一次. 3. 程序是等所有图片加载完成后再读取图片的尺寸,实际中肯定不能这样做. 4. 实际项目中,应该由后台程序给出图片尺寸值,在js代码中直接使用图片的width属性. 本程序思路: html结构: <body> <div id="

  • 原生JS实现响应式瀑布流布局

    原生JS实现的瀑布流布局,代码及demo代码地址:https://github.com/leozdgao/responsive_waterfall Demo:http://leozdgao.github.io/demo/responsive_waterfall/ 演示图: 核心代码: responsive_waterfall.js (function() { var Waterfall = function(opts) { var minBoxWidth; Object.defineProper

  • 原生JavaScript实现瀑布流布局

    本文实例讲解了原生JavaScript实现瀑布流布局详细代码,分享给大家供大家参考,具体内容如下 效果图: 具体代码: window.onload=function(){ waterfall('main','pin'); var dataInt={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]}; window.onscroll=function(){ if(checkscrollside()){

  • 原生js实现瀑布流布局

    用js实现瀑布流布局以及通过模拟的数据加载图片,已标记注释 效果如图: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>瀑布流布局-JS实现</title> </head> <style type="text/css"> *{ margin: 0; paddin

  • javascript瀑布流布局实现方法详解

    本文实例讲述了javascript瀑布流布局实现方法.分享给大家供大家参考,具体如下: html结构: <div id="waterfall"> <div class="mod-box"> <div class="mod-img">...</div> </div> <div class="mod-box"> <div class="mod-

  • 基于JavaScript实现瀑布流布局(二)

    本文实例讲解了JavaScript实现瀑布流布局详细代码,分享给大家供大家参考,具体内容如下 1.建立Html模版 想法是先用一个div container承载所有内容,然后div box用来放置图片,最后div box_border来当图片框,代码如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>瀑布流</title> </head

  • 深入学习js瀑布流布局

    本文实例为大家分享了js瀑布流布局学习资料,供大家参考,具体内容如下 特点:等宽不等高. 实现方式:Javascript/Jquery/CSS3多栏布局. 样例网站:花瓣网-->分类 一.JS实现瀑布流 index.html:页面结构 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>瀑布流布局</titl

  • 解析瀑布流布局:JS+绝对定位的实现

    绝对定位方式的瀑布流布局: 一.布局 1.包围块框的容器: 复制代码 代码如下: <div id="main">    ... ...<div> 2.一个块框: 复制代码 代码如下: <div class="pin">    <div class="box">        <img src="./images/g (1).jpg"/>    </div>

  • JavaScript瀑布流布局实现代码

    先说一下什么是瀑布流布局. 就是一堆等宽不等高的数据块组成的页面,如图: 现在好多网站都采用这种瀑布流布局,如蘑菇街.美丽说等等. 首先要实现它就要明白它是怎样排列的. 每一行的列数都是根据图片的宽度和页面的宽度算比例算下来的.. 第一行就是按顺序排列,其他的数据块都是在每一列中挑选出最低的那一列依次排进去的. 首先实现框架. <div id = "main"> <div class = "box"> <div class = &quo

  • 原生JS实现美图瀑布流布局赏析

    自pinterest网站爆红以来,国内一度掀起"仿PIN"狂潮,诸如花瓣.蘑菇街等等.正是如此,"瀑布流"式布局受到广大网民的青睐.众多知名JS库,也相继出现"瀑布流"布局插件,譬如jQuery的Masonry插件.KISSY的waterfall插件等.今天闲来无聊,我也自己动手弄了段原生JS代码,实现了简单的"瀑布流"布局效果,当然肯定不能和以上那些优秀插件相提并论,有兴趣的朋友,可以去看看,希望能带给你或多或少的收获. 1

随机推荐