用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ì)算頁面中圖片有幾列,并設(shè)置頁面的寬度
3、找出這幾列中高度最小的列
4、從第二行開始,設(shè)置圖片為相對定位,把一張圖片放到高度最小列的下面
5、更新列的高度,重復(fù)3、4、5步驟,直至圖片加載完
6、根據(jù)最后一張圖片的位置確定是否繼續(xù)加載圖片(懶加載)
實(shí)現(xiàn):
1、獲取#main下的所有.box
//將main下的所有class為box的元素取出來 var oParent = document.getElementById(parent); var oBox = getByClass(oParent,box);
// 根據(jù)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、計(jì)算頁面中圖片有幾列,并設(shè)置頁面的寬度
//計(jì)算整個(gè)頁面顯示的列數(shù)(頁面寬/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、從第二行開始,設(shè)置圖片為相對定位,把一張圖片放到高度最小列的下面
5、更新列的高度,重復(fù)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、根據(jù)最后一張圖片的位置確定是否繼續(xù)加載圖片(懶加載)
假設(shè)是后臺給的數(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ù)最后一張圖片的位置,來判斷是否進(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)前頁面的尾部 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(); } }
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
- Jquery瀑布流插件使用介紹
- jQuery 瀑布流 浮動(dòng)布局(一)(延遲AJAX加載圖片)
- jQuery瀑布流插件Wookmark使用實(shí)例
- jQuery Masonry瀑布流插件使用詳解
- jQuery 瀑布流 絕對定位布局(二)(延遲AJAX加載圖片)
- jQuery實(shí)現(xiàn)瀑布流布局
- js實(shí)現(xiàn)的美女瀑布流效果代碼
- javascript自適應(yīng)寬度的瀑布流實(shí)現(xiàn)思路
- 原生JS實(shí)現(xiàn)響應(yīng)式瀑布流布局
- 解析瀑布流布局:JS+絕對定位的實(shí)現(xiàn)
- 純js實(shí)現(xiàn)瀑布流展現(xiàn)照片(自動(dòng)適應(yīng)窗口大小)
相關(guān)文章
JavaScript實(shí)現(xiàn)導(dǎo)入導(dǎo)出excel的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript語言實(shí)現(xiàn)導(dǎo)入導(dǎo)出excel文件的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-07-07js實(shí)現(xiàn)跟隨鼠標(biāo)移動(dòng)且?guī)шP(guān)閉功能的圖片廣告實(shí)例
這篇文章主要介紹了js實(shí)現(xiàn)跟隨鼠標(biāo)移動(dòng)且?guī)шP(guān)閉功能的圖片廣告,實(shí)例分析了javascript操作鼠標(biāo)事件及html元素的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02Javascript中各種trim的實(shí)現(xiàn)詳細(xì)解析
這篇文章主要是對Javascript中各種trim的實(shí)現(xiàn)進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下,希望對大家有所幫助2013-12-12引用其它js時(shí)如何同時(shí)處理多個(gè)window.onload事件
引用其它js時(shí),其js卻使用了window.onload事件,這樣的話,引入的頁面的onload事件就有可能執(zhí)行不了,那么該如何解決呢?祥看下文2014-09-09JavaScript中valueOf函數(shù)與toString方法深入理解
基本上,所有JS數(shù)據(jù)類型都擁有valueOf和toString這兩個(gè)方法,null除外。它們倆解決javascript值運(yùn)算與顯示的問題,本文將詳細(xì)介紹,有需要的朋友可以參考下2012-12-12JS基于FileSystemObject創(chuàng)建一個(gè)指定路徑的TXT文本文件
這篇文章主要介紹了JS基于FileSystemObject創(chuàng)建一個(gè)指定路徑的TXT文本文件,涉及javascript使用ActiveXObject控件中FileSystemObject對象模型的基本技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08關(guān)于javascript DOM事件模型的兩件事
DOM事件模型的兩件事:事件捕捉(Event Capture)的實(shí)現(xiàn)問題以及IE的高級事件處理模型的問題。2010-07-07