zoukankan      html  css  js  c++  java
  • 瀑布流布局

    瀑布流布局学习

    1. 特点:等宽不等高。
    2. 实现方式:Javascript/Jquery/CSS3多栏布局。
    3. 样例网站:花瓣网-->分类(http://huaban.com/)

    一、JS实现瀑布流

          index.html:页面结构

         

     View Code

          layout.css:页面元素样式

     View Code

          waterfall.js

    复制代码
     1 window.onload=function(){
     2     waterFall('main','box');
     3     //模拟后台相应数据json
     4     var dataInt={
     5         "data":
     6         [
     7          {"src":"0.jpg"},
     8          {"src":"1.jpg"},
     9          {"src":"2.jpg"},
    10          {"src":"3.jpg"},
    11          {"src":"4.jpg"},
    12          {"src":"5.jpg"},
    13          {"src":"6.jpg"}
    14         ]
    15     }
    16     window.onscroll=function(){
    17         if(checkScrollSlide){
    18             //将数据块渲染到当前页面的尾部
    19           var oParent=document.getElementById("main");
    20           for(var i=0;i<dataInt.data.length;i++){
    21               var oBox=document.createElement("div");
    22               oBox.className="box";
    23               oParent.appendChild(oBox);
    24               var oPic=document.createElement("div");
    25               oPic.className="pic";
    26               oBox.appendChild(oPic);
    27               var img=document.createElement("img");
    28               img.setAttribute("src",dataInt.data[i]);
    29               img.src="pic/"+dataInt.data[i].src;
    30               oPic.appendChild(img);
    31          }
    32           dataInt=null;//清空数据块,防止无限加载
    33           waterFall('main','box');//对页面新元素进行布局渲染
    34         }
    35     }
    36 }
    37 function waterFall(parent,box){
    38     //将main下的class为box的所有元素取出来
    39     var oParent=document.getElementById(parent);
    40     var oBoxs=getByClass(oParent,box);
    41     console.log(oBoxs.length);
    42     //计算整个页面显示的列数(页面宽/box宽)
    43     var oBoxW=oBoxs[0].offsetWidth;
    44     // console.log(oBoxW);
    45     var cols=Math.floor(document.documentElement.clientWidth/oBoxW);
    46     // console.log(cols);
    47     //设置main的宽
    48     oParent.style.cssText=""+oBoxW*cols+"px;margin:0 auto;"
    49     var hArr=[];//存放每列高度的数组
    50     for(var i=0;i<oBoxs.length;i++){
    51         if(i<cols){
    52             hArr.push(oBoxs[i].offsetHeight);
    53         }else{
    54             var minH=Math.min.apply(null,hArr);//获取当前数组最小高度值
    55             // console.log(minH);
    56             var index=getMinhIndex(hArr,minH);//获取数组最小高度的索引
    57             //console.log(index);
    58             oBoxs[i].style.position="absolute";//将之后的图片依次绝对定位
    59             oBoxs[i].style.top=minH+"px";
    60             oBoxs[i].style.left=index*oBoxW+"px";//计算新图片所在的位置并赋值
    61             hArr[index]+=oBoxs[i].offsetHeight;//变化数组列的高度值,因为加上了一张图片
    62         }
    63         //console.log(hArr);
    64     }
    65 
    66 }
    67 //根据class获取元素
    68 function getByClass(parent,clsName){
    69    var boxArr=new Array(),//用来存储获取到的所有class为box的元素
    70        oElements=parent.getElementsByTagName("*");
    71        for(var i=0;i<oElements.length;i++){
    72            if(oElements[i].className==clsName){
    73                boxArr.push(oElements[i]);
    74            }
    75        }
    76     return boxArr;
    77 }
    78 function getMinhIndex(arr,val){
    79     for(var i=0;i<arr.length;i++){
    80         if(arr[i]==val){
    81             return i;
    82         }
    83     }
    84 
    85 }
    86 //检测是否具备滚动条加载数据块条件
    87 function checkScrollSlide(){
    88     var oParent=document.getElementById("main");
    89     var oBoxs=getByClass(oParent,"box");
    90     var lastBoxH=oBoxs[oBoxs.length-1].offsetTop+Math.floor(oBoxs[oBoxs.length-1].offsetHeight/2);
    91     var scrollTop=document.body.scrollTop||document.documentElement.scrollTop;//混杂模式和标准模式下的scrollTop获取
    92     //console.log(scrollTop);
    93     var height=document.body.clientHeight||document.documentElement.clientHeight;//混杂模式和标准模式下的浏览器窗口高度获取
    94     return (lastBoxH<scrollTop+height)?true:false;//检测最后一个box高度是否小于滚动高度+窗口高度,返回布尔值
    95 
    96 }
    复制代码

     二、JQuery

           

    复制代码
     1 $( window ).on( "load", function(){
     2     waterfall('main','pin');
     3     var dataInt={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]};
     4     window.onscroll=function(){
     5         if(checkscrollside()){
     6             $.each( dataInt.data, function( index, value ){
     7                 var $oPin = $('<div>').addClass('pin').appendTo( $( "#main" ) );
     8                 var $oBox = $('<div>').addClass('box').appendTo( $oPin );
     9                 $('<img>').attr('src','./images/' + $( value).attr( 'src') ).appendTo($oBox);
    10             });
    11             waterfall();
    12         };
    13     }
    14 });
    15 
    16 /*
    17     parend 父级id
    18     pin 元素id
    19 */
    20 function waterfall(parent,pin){
    21     var $aPin = $( "#main>div" );
    22     var iPinW = $aPin.eq( 0 ).width();// 一个块框pin的宽
    23     var num = Math.floor( $( window ).width() / iPinW );//每行中能容纳的pin个数【窗口宽度除以一个块框宽度】
    24     //oParent.style.cssText=''+iPinW*num+'px;ma rgin:0 auto;';//设置父级居中样式:定宽+自动水平外边距
    25     $( "#main" ).css({
    26         '' : iPinW * num,
    27         'margin': '0 auto'
    28     });
    29 
    30     var pinHArr=[];//用于存储 每列中的所有块框相加的高度。
    31 
    32     $aPin.each( function( index, value ){
    33         var pinH = $aPin.eq( index ).height();
    34         if( index < num ){
    35             pinHArr[ index ] = pinH; //第一行中的num个块框pin 先添加进数组pinHArr
    36         }else{
    37             var minH = Math.min.apply( null, pinHArr );//数组pinHArr中的最小值minH
    38             var minHIndex = $.inArray( minH, pinHArr );
    39             $( value ).css({
    40                 'position': 'absolute',
    41                 'top': minH + 15,
    42                 'left': $aPin.eq( minHIndex ).position().left
    43             });
    44             //数组 最小高元素的高 + 添加上的aPin[i]块框高
    45             pinHArr[ minHIndex ] += $aPin.eq( index ).height() + 15;//更新添加了块框后的列高
    46         }
    47     });
    48 }
    49 
    50 function checkscrollside(){
    51     var $aPin = $( "#main>div" );
    52     var lastPinH = $aPin.last().get(0).offsetTop + Math.floor($aPin.last().height()/2);//创建【触发添加块框函数waterfall()】的高度:最后一个块框的距离网页顶部+自身高的一半(实现未滚到底就开始加载)
    53     var scrollTop = $( window ).scrollTop()//注意解决兼容性
    54     var documentH = $( document ).height();//页面高度
    55     return (lastPinH < scrollTop + documentH ) ? true : false;//到达指定高度后 返回true,触发waterfall()函数
    56 }
    复制代码

    三、CSS多栏布局

         

    复制代码
     1 .container{
     2     -webkit-column-160px;
     3     -moz-column-160px; 
     4       -webkit-column-gap:5px;
     5       -moz-column-gap:5px;
     6 }
     7 
     8 
     9 /*数据块 砖块*/
    10 
    11 .container div{160px;
    12                margin:4px 0;}
    复制代码
    【css3和js实现方法比较】
    --css3方式--
    1:不需要计算,浏览器自动计算,只需设置1列宽,性能高
    2:列宽随着浏览器宽口大小进行改变,用户体验不好;
    3:图片排序按照垂直顺序排列,打乱图片显示顺序
    4.图片加载还是需要js
    --js方式--
    js实现的瀑布流不会有上面的缺点,但是性能相对要差!
    想我所想,思我所思,乐在其中
  • 相关阅读:
    A survey for developing of reinforcement learning environments
    04-STM32+ESP8266+AIR202基本控制篇-功能2-微信小程序使用APUConfig配网绑定ESP8266,并通过MQTT和ESP8266实现远程通信控制
    03-STM32+ESP8266+AIR202基本控制篇-功能1-APP使用APUConfig配网绑定ESP8266,并通过MQTT和ESP8266实现远程通信控制
    02-STM32+ESP8266+AIR202基本控制篇- 基本控制篇概述
    01-STM32+ESP8266+AIR202基本控制篇-硬件使用说明
    深入学习Redis(3):主从复制(转)
    k8s常用命令
    photoshop,3dsmax,maya等图形图像动画学习资料收集
    工业机器人(ABB+Kuka)资料打包下载
    .DS_Store 是什么
  • 原文地址:https://www.cnblogs.com/ONEPIECE-ZY/p/5960656.html
Copyright © 2011-2022 走看看