• JavaScript——基本的瀑布流布局及ajax动态新增数据


    本文用纯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{
         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 = ""+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 }

    最终效果:

  • 相关阅读:
    有感:假设在透明的竞争条件下的中国软件企业
    庆祝一下:www.pinstudy.com在GOOGLE 上的PR值为:3
    性能最大化ΔΣ 转换器
    静态时序分析(STA,Static Timing Analysis)基础与应用3
    云计算 Cloud Computing 简介
    CORDIC算法
    Computer Science 计算机科学与技术系 重要国际学术会议
    云上的安全 Cloud Technology
    Electronic Engineering 电子工程系 信息与通信工程一级学科 重要国际学术会议汇总
    Microelectronic 微纳电子学系 重要国际学术会议
  • 原文地址:https://www.cnblogs.com/woodk/p/5128959.html
Copyright © 2020-2023  润新知