本篇文章主要介紹了用JavaScript和jQuery實作瀑布流的方法,具有很好的參考價值。下面跟著小編一起來看下吧
大致介紹
在慕課網上學習了用原生js和jQuery實現瀑布流,在這裡做個筆記
用Javascript實作
基本結構:
<p id="main"> <p class="box"> <p class="pic"><img src="images/1.jpg" alt=""></p> </p> <p class="box"> <p class="pic"><img src="images/2.jpg" alt=""></p> </p> ... ... ... </p>
基本樣式:
*{ margin: 0px; padding: 0px; } #main{ position: relative; } .box{ padding: 15px 0 0 15px; float: left; } .pic{ padding: 10px; border: 1px solid #ccc; border-radius: 5px; box-shadow: 0 0 5px #ccc; }
思路:
#1、取得#main下的所有.box
2.計算頁面中圖片有幾列,並設定頁面的寬度
3、找出這幾列中高度最小的列
4、從第二行開始,設定圖片為相對定位,把一張圖片放到高度最小列的下面
5、更新列的高度,重複3、4、5步驟,直至圖片加載完
6、根據最後一張圖片的位置決定是否繼續載入圖片(懶載入)
實作:
1、取得#main下的所有.box
//将main下的所有class为box的元素取出来 var oParent = document.getElementById(parent); var oBox = getByClass(oParent,box);
// 根据class获取元素 function getByClass(parent,clsname){ var arr = [];//用来存储获取到的所有class为box的元素 var oElement = parent.getElementsByTagName('*'); for(var i=0;i<oElement.length;i++){ if(oElement[i].className == clsname){ arr.push(oElement[i]); } } return arr; }
2、計算頁面中圖片有幾列,並設定頁面的寬度
//计算整个页面显示的列数(页面宽/box的宽) var oBoxW = oBox[0].offsetWidth; var cols = Math.floor(document.documentElement.clientWidth/oBoxW); //设置main的宽 oParent.style.cssText = 'width:' + oBoxW*cols + 'px;margin:0 auto;';
3、找出這幾列中高度最小的列
#4、從第二行開始,設定圖片為相對定位,把一張圖片放到高度最小列的下面
#5、更新列的高度,重複3、4、5步驟,直到圖片載入完
//存储每列的高度 var hArr = []; for(var i=0;i<oBox.length;i++){ if(i<cols){ //第一行图片的高度 hArr.push(oBox[i].offsetHeight); }else{ var minH = Math.min.apply(null,hArr); var index = getMinIndex(hArr,minH); oBox[i].style.position = "absolute"; oBox[i].style.top = minH + 'px'; //oBox[i].style.left = oBoxW*index+'px'; oBox[i].style.left = oBox[index].offsetLeft + 'px'; //更新每列的高度 hArr[index] += oBox[i].offsetHeight; } }
//获取每列高度最小的索引值 function getMinIndex(arr,value){ for(var i in arr){ if(arr[i] == value){ return i; } } }
6、根據最後一張圖片的位置決定是否繼續載入圖片(懶載入)
假設是後台給的資料
//数据 var dataInt = {'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]};
當捲軸捲動時執行
//滚动条滚动时 window.onscroll = function(){ scrollSlide(dataInt); }
根據最後一張圖片的位置,來判斷是否進行載入
//判断是否具有了滚条加载数据块的条件 function checkScrollSlide(parent,clsname){ var oParent = document.getElementById(parent); var oBox = getByClass(oParent,clsname); var lastBoxH = oBox[oBox.length-1].offsetTop + Math.floor(oBox[oBox.length-1].offsetHeight/2); var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; var height = document.documentElement.clientHeight || document.body.clientHeight; return (lastBoxH < scrollTop + height)? true:false; }
載入圖片
//滚动条滚动时执行 function scrollSlide(dataInt){ ////判断是否具有了滚条加载数据块的条件 if(checkScrollSlide('main','box')){ var oParent = document.getElementById('main'); //将数据块渲染到当前页面的尾部 for(var i=0;i<dataInt.data.length;i++){ var oBoxs = document.createElement('p'); oBoxs.className = 'box'; oParent.appendChild(oBoxs); var oPic = document.createElement('p'); oPic.className = 'pic'; oBoxs.appendChild(oPic); var oImg = document.createElement('img'); oImg.src = 'images/' + dataInt.data[i].src; oPic.appendChild(oImg); } waterfall('main','box'); }
用jQurey實作
用jQuery實作的想法都是一樣的,就直接放程式碼
$(window).on('load',function(){ waterfall(); var dataInt={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]}; $(window).on('scroll',function(){ scrollSlide(dataInt); }) }); function waterfall(){ var $oBox = $('#main>p'); var oBoxW = $oBox.eq(0).outerWidth(); var cols = Math.floor($(window).width()/oBoxW); $('#main').css({ 'width' : cols * oBoxW, 'margin' : '0 auto' }); var hArr = []; $oBox.each(function(index,value){ var oBoxH = $oBox.eq(index).height(); if(index<cols){ hArr.push(oBoxH); }else{ var minH = Math.min.apply(null,hArr); var minHIndex = $.inArray(minH,hArr); $(value).css({ 'position' : 'absolute', 'top': minH + 15, 'left' : $oBox.eq( minHIndex ).position().left }); hArr[minHIndex] += $oBox.eq(index).height() + 15; } }); } function checkScrollSlide(){ var $lastBox = $('#main>p').last(); var lastBoxH = $lastBox.offset().top + Math.floor($lastBox.height()/2); var scrollTop = $(window).scrollTop(); var clientH = $(window).height(); return (lastBoxH < scrollTop + clientH) ? true : false; } function scrollSlide(dataInt){ if(checkScrollSlide()){ $.each(dataInt.data,function(index,value){ var $Box = $('<p>').addClass('box').appendTo('#main'); var $Pic = $('<p>').addClass('pic').appendTo($Box); $('<img>').attr('src','images/' + $(value).attr('src')).appendTo($Pic); }) waterfall(); } }
以上是使用JavaScript和jQuery實作瀑布流的範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!