zoukankan      html  css  js  c++  java
  • js瀑布流 原理实现揭秘 javascript 原生实现

      web,js瀑布流揭秘

      瀑布流再很久之前流行,可能如我一样入行晚的 ,可能就没有机会去使用。但是这个技术终究是个挺炫酷的东西,花了一个上午来研究,用原生js实现了一个,下面会附上源码,供大家解读。

      说起瀑布流,其实实现原理特别简单,而且方法有很多,现在说一个大众的方法,所谓瀑布流就是 一堆样式差不多的 盒子排列在一起,排列规则是,插入到高度最低的那一列,所以,实现起来就很简单了,布局分 块,页面分列,计算每一列的高度,然后把块插入到列高度低的那一列,设置定位,left和top值就好了。

      1.从布局开始,基本布局如下:

    <div id="main">

      <div class="box"><div class="fig"><img src="xxxx"></div></div>

    </div>

      main为父级大容器,用来盛放 块 box,所有的box都一样的  

      2.style样式,基本样式如下:

    *{padding: 0; margin: 0; box-sizing: border-box; -webkit-transition: all .3s;}
    #main{
      position: relative; //因为box要绝对定位,所以给父级设置相对定位
    }

    .box{
      padding: 10px 5px 5px 10px;
      float: left;
    }
    .fig{border: 1px #ccc solid; border-radius: 4px; box-shadow: 0 0 5px rgba(0,0,0,.6); padding: 5px;}
    .fig img{ 200px;}

      3. 主要js如下:

      1 ;(function ($){
      2 
      3 
      4 function show(el){
      5     el.style.display = 'block';
      6 }
      7 function hide(el){
      8     el.style.display = 'none';
      9 }
     10 
     11 function getById(id){
     12     return document.getElementById(id);
     13 }
     14 
     15 function getByClass(name,parent){
     16     var parent = parent ? document.getElementById(parent) : document;
     17     var eles = document.getElementsByTagName('*');
     18     var result = [];
     19     for(var i=0, len = eles.length; i < len; i++){
     20         if(eles[i].className == name){
     21             result.push(eles[i]);
     22         }
     23     }
     24     return result;
     25 }
     26 
     27 function getIndex(arr,val){
     28     for(var i in arr){
     29         if(arr[i] == val){
     30             return i;
     31         }
     32     }
     33     return -1;
     34 }
     35 
     36 
     37 var elMark = getById('Mark');
     38 var baseUrl = "./images/";
     39 var dataImg = {
     40     "data" : [
     41         {"src": '1.jpg'},
     42         {"src": '2.jpg'},
     43         {"src": '3.jpg'},
     44         {"src": '4.jpg'},
     45         {"src": '5.jpg'},
     46         {"src": '6.jpg'},
     47         {"src": '7.jpg'},
     48         {"src": '8.jpg'},
     49         {"src": '9.jpg'},
     50         {"src": '10.jpg'},
     51         {"src": '1.jpg'},
     52         {"src": '2.jpg'},
     53         {"src": '3.jpg'},
     54         {"src": '4.jpg'},
     55         {"src": '5.jpg'},
     56         {"src": '6.jpg'},
     57         {"src": '7.jpg'},
     58         {"src": '8.jpg'},
     59         {"src": '9.jpg'},
     60         {"src": '10.jpg'}
     61     ]
     62 }
     63 
     64 function WaterFull(insName){
     65     this.instance = insName;
     66     this.wrap = '';
     67     this.box = '';
     68     this.elwrap = '';
     69 }
     70 WaterFull.prototype = {
     71     init : function (parent, box){
     72         this.wrap = parent;
     73         this.box = box;
     74         this.elwrap = getById(parent);
     75         this.insertHtml();
     76     },
     77     insertHtml : function (){
     78         show(elMark);
     79         var self = this;
     80         for(var i=0, len = dataImg.data.length; i < len; i++){
     81             var url = baseUrl + dataImg.data[i].src;
     82             self.elwrap.appendChild(self.creatHtml(url));
     83         }
     84         setTimeout(function (){
     85             self.setPosition();
     86             hide(elMark);
     87         },400);
     88     },
     89     creatHtml : function (url){
     90         var box = document.createElement('div');
     91         box.className = this.box;
     92         var fig = document.createElement('div');
     93         fig.className = 'fig';
     94         box.appendChild(fig);
     95         var img = new Image();
     96         img.src = url;
     97         fig.appendChild(img);
     98         return box;
     99     },
    100     setPosition : function (){
    101         var hArr = [];
    102         var boxs = getByClass(this.box, this.wrap);
    103         var boxW = boxs[0].offsetWidth;
    104         var cols = Math.floor(document.body.clientWidth / boxW);
    105         this.elwrap.style.cssText = ' '+cols*boxW+'px;'+'margin: 0 auto;';
    106         for(var i=0, len = boxs.length; i < len; i++){
    107             if(i<cols){
    108                 boxs[i].style.position = 'static';
    109                 hArr.push(boxs[i].offsetHeight);
    110             }else{
    111                 var minH = Math.min.apply(null, hArr);
    112                 var colsIndex = getIndex(hArr, minH)
    113                 if(colsIndex == -1){
    114                     alert("查询失败");
    115                     return false;
    116                 }
    117                 boxs[i].style.cssText = "position: absolute; top: "+minH+"px;"+"left: "+boxW*colsIndex+"px";
    118                 hArr[colsIndex] += boxs[i].offsetHeight;
    119             }
    120         }
    121     },
    122     checkLoad : function (){
    123         var boxs = getByClass(this.box, this.wrap);
    124         var lastH = boxs[boxs.length -1].offsetTop + boxs[boxs.length -1].offsetHeight;
    125         var loadH = document.documentElement.clientHeight + document.body.scrollTop || document.documentElement.scrollTop;
    126         return lastH < loadH;
    127     }
    128 }
    129 
    130 function main(){
    131     var waterfull = new WaterFull();
    132     waterfull.init('main','box');
    133     window.onscroll = function (){
    134         if(waterfull.checkLoad.call(waterfull)){
    135             waterfull.insertHtml.call(waterfull);
    136         }
    137     }
    138     window.onresize = function (){
    139         waterfull.setPosition.call(waterfull);
    140     }
    141 }
    142 
    143 $.main = main;
    144 
    145 }(this))
    View Code

    预览

    全部js都在,如果需要全套代码的 ,麻烦联系我一下哈,QQ号:309093631

    更多内容会经常更新,谢谢关注!!!

      

  • 相关阅读:
    BF算法和KMP算法
    Python课程笔记 (五)
    0268. Missing Number (E)
    0009. Palindrome Number (E)
    0008. String to Integer (atoi) (M)
    0213. House Robber II (M)
    0198. House Robber (E)
    0187. Repeated DNA Sequences (M)
    0007. Reverse Integer (E)
    0006. ZigZag Conversion (M)
  • 原文地址:https://www.cnblogs.com/donglegend/p/4721227.html
Copyright © 2011-2022 走看看