1. 程式人生 > >jQuery 實現瀑布流佈局及下滑載入頁面

jQuery 實現瀑布流佈局及下滑載入頁面

蘑菇街商品的資訊,一個接一個,銜接緊密,根據瀏覽器大小有幾列,元素等寬不等高,向下滑動載入 就是常見的瀑布流佈局,

實現瀑布流佈局有三種方式,JavaScript原生,jQuery,和CSS3 column方法。

我寫了JavaScript 和jQuery兩種。

jQuery相對於js的優點就是,獲取,定義,遍歷元素方便,有很多封裝的函式,支援連綴,隱式迭代。

如要獲取一個類名為box的元素,js需要寫一個函式,而jQuery 只需要$('#main>div),

如果要遍歷元素,js需要寫一個for函式,而jQuery只需要each函式,

如果要獲取陣列中指定元素的索引,js需要寫一個函式,而jQuery只需要inArray函式,

如果要寫元素的樣式,js需要單獨定義style,而jQuery只需要css函式。

jQuery思路就是

1、 html寫好整體的盒子框架,div塊,

2、css 設定好圖片的相對定位,樣式,塊元素,浮動,

3、jquery

封裝成一個函式 waterfall() 

(1)根據瀏覽器的寬度和定義的圖片的統一的寬度來計算有幾列。

(2)獲取第一行圖片的高度,找到最矮的索引讓第二行第一個元素排列在下面。

(3)定點陣圖片的位置要修改css樣式,並要實時更新高度陣列,以便下一個圖片定位到正確的位置。

封裝成一個函式 checkScrollSlide()

(4)判斷是否要載入的情況,規定當最後一個圖片露出一半的時候開始載入。

(5)如何判斷,比較  最後一個圖片到父元素盒子的高度加上自身一半的高度  和 瀏覽器視窗的高度加上滾動條滾過的高度,

因為前者是固定的,後者隨著滑動變化,如果前者大於後者,說明還沒滑到,如果小於後者,就說明是時候載入了。

                              

(6)返回true後,定義載入事件,建立html元素,渲染後臺的資料,新增到頁面後面,注意最後要繼續呼叫waterfall()函式。

注意:有的引數如value,獲取的是DOM物件,而jQuery方法不能直接對DOM物件進行操作,所以需要用$() 轉化成jQuery物件。

大體的思路就這個了,細節的如何實現,看接下來放上js原始碼。

$(window).on('load',function(){
	waterfall();
        //模擬後臺資料
	var dataInt ={"data":[{"src":"1.jpg"},{"src":"2.jpg"},{"src":"3.jpg"}]}
	$(window).on('scroll',function(){
		if (checkScrollSlide){
			// 遍歷後臺的資料
			$.each(dataInt.data,function(key,value){
				// 直接用jQuery方法就可以建立元素,新增類名,新增到父元素後面,方法可以通過.迭代 
			var oBox = $('<div>').addClass('box').appendTo('#main');
			var oPic = $('<div>').addClass('pic').appendTo($(oBox));
			var oImg = $('<img>').attr('src','img/'+ $(value).attr('src')).appendTo($(oPic));
		})
			waterfall();
		}
	})
})

function waterfall(){
	//包含選擇器, 空格選擇器會選擇所有的子元素
	// > 取mian元素的第一個子元素
	var $boxs = $('#main>div');
	// 列寬  width()只能獲得圖片的寬度,
	// outerWidth()能獲得包括邊界的寬度
	var w = $boxs.eq(0).outerWidth();
	var cols = Math.floor($(window).width()/w);
	$('#main').width(cols*w).css('margin', '0 auto');
	var hArr=[];
	// jquery的遍歷方法
	$boxs.each(function(index,value){
		//console.log(value); 列印的是dom物件,
		// 獲取每個圖片的高
		var h=$boxs.eq(index).outerHeight();
		if (index<cols){
			// 獲取第一行的高度
			hArr[index]=h;
		}
		else{
			// 獲取最矮的圖片的索引
			var minH = Math.min.apply(null,hArr);
			// inArray函式能獲取指定數值的索引
			var minHIndex = $.inArray(minH,hArr);
			// value是dom物件,不能直接用jQuery方法直接操作
			// 要轉換為jQuery物件
			$(value).css({
				'position':'absolute',
				'top':minH +'px',
				'left':minHIndex*w +'px'
			})
			// 在else迴圈中  改變的是加上下一行元素後的高度
			hArr[minHIndex] += $boxs.eq(index).outerHeight();
		}				
	})
//console.log(hArr);
}

function checkScrollSlide(){
	// 獲取最後一個圖片
	var $lastBox = $('main>div').last();
	// 最後一個圖片距離父元素的高度和自身一半的高度
	var lastBoxDis = $lastBox.offset().height+Math.floor($lastBox.outerHeight());
	// 劃過的高度
	var scrollTop = $(window).scrollTop();
	// 瀏覽器的高度
	var documentH = $(window).height();
	return(lastBoxDis<scrollTop+documentH)?true:false;
}

注:如果有錯誤的言詞,可以提醒我更正。