用JavaScript和jQuery實(shí)現(xiàn)瀑布流
大致介紹
在慕課網(wǎng)上學(xué)習(xí)了用原生js和jQuery實(shí)現(xiàn)瀑布流,在這里做個(gè)筆記
用JavaScript實(shí)現(xiàn)
基本結(jié)構(gòu):
<div id="main"> <div class="box"> <div class="pic"><img src="images/1.jpg" alt=""></div> </div> <div class="box"> <div class="pic"><img src="images/2.jpg" alt=""></div> </div> ... ... ... </div>
基本樣式:
*{
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、計(jì)算頁(yè)面中圖片有幾列,并設(shè)置頁(yè)面的寬度
3、找出這幾列中高度最小的列
4、從第二行開(kāi)始,設(shè)置圖片為相對(duì)定位,把一張圖片放到高度最小列的下面
5、更新列的高度,重復(fù)3、4、5步驟,直至圖片加載完
6、根據(jù)最后一張圖片的位置確定是否繼續(xù)加載圖片(懶加載)
實(shí)現(xiàn):
1、獲取#main下的所有.box
//將main下的所有class為box的元素取出來(lái) var oParent = document.getElementById(parent); var oBox = getByClass(oParent,box);
// 根據(jù)class獲取元素
function getByClass(parent,clsname){
var arr = [];//用來(lái)存儲(chǔ)獲取到的所有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、計(jì)算頁(yè)面中圖片有幾列,并設(shè)置頁(yè)面的寬度
//計(jì)算整個(gè)頁(yè)面顯示的列數(shù)(頁(yè)面寬/box的寬) var oBoxW = oBox[0].offsetWidth; var cols = Math.floor(document.documentElement.clientWidth/oBoxW); //設(shè)置main的寬 oParent.style.cssText = 'width:' + oBoxW*cols + 'px;margin:0 auto;';
3、找出這幾列中高度最小的列
4、從第二行開(kāi)始,設(shè)置圖片為相對(duì)定位,把一張圖片放到高度最小列的下面
5、更新列的高度,重復(fù)3、4、5步驟,直至圖片加載完
//存儲(chǔ)每列的高度
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、根據(jù)最后一張圖片的位置確定是否繼續(xù)加載圖片(懶加載)
假設(shè)是后臺(tái)給的數(shù)據(jù)
//數(shù)據(jù)
var dataInt = {'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]};
當(dāng)滾動(dòng)條滾動(dòng)時(shí)執(zhí)行
//滾動(dòng)條滾動(dòng)時(shí)
window.onscroll = function(){
scrollSlide(dataInt);
}
根據(jù)最后一張圖片的位置,來(lái)判斷是否進(jìn)行加載
//判斷是否具有了滾條加載數(shù)據(jù)塊的條件
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;
}
加載圖片
//滾動(dòng)條滾動(dòng)時(shí)執(zhí)行
function scrollSlide(dataInt){
////判斷是否具有了滾條加載數(shù)據(jù)塊的條件
if(checkScrollSlide('main','box')){
var oParent = document.getElementById('main');
//將數(shù)據(jù)塊渲染到當(dāng)前頁(yè)面的尾部
for(var i=0;i<dataInt.data.length;i++){
var oBoxs = document.createElement('div');
oBoxs.className = 'box';
oParent.appendChild(oBoxs);
var oPic = document.createElement('div');
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實(shí)現(xiàn)
用jQuery實(shí)現(xiàn)的思路都是一樣的,就直接放代碼
$(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>div');
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>div').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 = $('<div>').addClass('box').appendTo('#main');
var $Pic = $('<div>').addClass('pic').appendTo($Box);
$('<img>').attr('src','images/' + $(value).attr('src')).appendTo($Pic);
})
waterfall();
}
}
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
- Jquery瀑布流插件使用介紹
- jQuery 瀑布流 浮動(dòng)布局(一)(延遲AJAX加載圖片)
- jQuery瀑布流插件Wookmark使用實(shí)例
- jQuery Masonry瀑布流插件使用詳解
- jQuery 瀑布流 絕對(duì)定位布局(二)(延遲AJAX加載圖片)
- jQuery實(shí)現(xiàn)瀑布流布局
- js實(shí)現(xiàn)的美女瀑布流效果代碼
- javascript自適應(yīng)寬度的瀑布流實(shí)現(xiàn)思路
- 原生JS實(shí)現(xiàn)響應(yīng)式瀑布流布局
- 解析瀑布流布局:JS+絕對(duì)定位的實(shí)現(xiàn)
- 純js實(shí)現(xiàn)瀑布流展現(xiàn)照片(自動(dòng)適應(yīng)窗口大小)
相關(guān)文章
JavaScript獲得當(dāng)前網(wǎng)頁(yè)來(lái)源頁(yè)面(即上一頁(yè))的方法
這篇文章主要介紹了JavaScript獲得當(dāng)前網(wǎng)頁(yè)來(lái)源頁(yè)面(即上一頁(yè))的方法,涉及javascript中document.referrer方法的使用技巧,需要的朋友可以參考下2015-04-04
JavaScript中判斷為整數(shù)的多種方式及保留兩位小數(shù)的方法
這篇文章主要介紹了JavaScript中判斷為整數(shù)的多種方式,以及保留兩位小數(shù)的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
JavaScript實(shí)現(xiàn)文件下載的超簡(jiǎn)單兩種方式分享
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)文件下載的超簡(jiǎn)單兩種方式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
微信小程序分享功能onShareAppMessage(options)用法分析
這篇文章主要介紹了微信小程序分享功能onShareAppMessage(options)用法,結(jié)合具體實(shí)例形式分析了微信小程序分享功能onShareAppMessage(options)具體使用技巧與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-04-04
JavaScript的public、private和privileged模式
公共/私有變量和方法通過(guò)一個(gè)簡(jiǎn)單的的例子,來(lái)展示如何使用JavaScript在類里面創(chuàng)建私有變量和方法2009-12-12
JavaScript日期庫(kù)date-fn.js使用方法解析
這篇文章主要介紹了JavaScript日期庫(kù)date-fn.js使用方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
微信小程序 導(dǎo)入圖標(biāo)實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了微信小程序 導(dǎo)入圖標(biāo)實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10

