詳解照片瀑布流效果(js,jquery分別實(shí)現(xiàn)與知識(shí)點(diǎn)總結(jié))
更新時(shí)間:2017年01月01日 13:47:37 作者:normol
本篇文章主要介紹了照片瀑布流效果,實(shí)現(xiàn)圖片自動(dòng)加載的瀑布流效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
看了網(wǎng)上的瀑布流教程,自己跟著寫了遍,然后總結(jié)了下知識(shí)點(diǎn)
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/javascript" src="jquery-1.8.3.min.js"/></script>
<script type="text/javascript" src="script2.js"/></script>
<title></title>
<style type="text/css">
*{padding: 0;margin:0;}
#main{
margin-top: 10px;
position: relative;
}
.pin{
margin:0;
padding:0 0 5px 3px;
float:left;
}
.box{
padding: 10px 5px 0 5px;
border:1px solid #ccc;
box-shadow: 0 0 6px #ccc;
border-radius: 5px;
}
.box img{
border:0;
margin:0;
width:200px;
height:auto;
}
</style>
</head>
<body>
<div id="main">
<div class="pin">
<div class="box">
<img src="images/1.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="images/2.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="images/3.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="images/4.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="images/5.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="images/6.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="images/7.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="images/8.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="images/9.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="images/1.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="images/2.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="images/3.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="images/4.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="images/5.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="images/6.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="images/7.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="images/8.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="images/9.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="images/1.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="images/2.jpg"/>
</div>
</div>
<div class="pin">
<div class="box">
<img src="images/3.jpg"/>
</div>
</div>
</div>
</body>
</html>
用js實(shí)現(xiàn)部分:
window.onload=function(){
waterfall('main','box');
var dataimg={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'},{'src':'5.jpg'},{'src':'6.jpg'},{'src':'7.jpg'},{'src':'8.jpg'},{'src':'9.jpg'}]};
window.onscroll=function()
{
if(checkscrollside())
{
var main= document.getElementById('main');
for(var i=0;i<dataimg.data.length;i++)
{
var pin=document.createElement('div');
pin.className='pin';
main.appendChild(pin);
var box=document.createElement('div');
box.className='box';
pin.appendChild(box);
var img=document.createElement('img');
img.src='images/'+dataimg.data[i].src;
box.appendChild(img);
}
waterfall('main','box');
};
}
}
function $$(clsName,ele)
{
//如果當(dāng)前瀏覽器支持通過類名獲取元素,直接返回
if(document.getElementsByClassName)
{
return(ele||document).getElementsByClassName(clsName);
}
else
{
//盡量把這些量存放在變量中,否則
//例如循環(huán)不用len,而用nodes.length,會(huì)每一次循環(huán)都遍歷一次
var nodes=(ele||document).getElementsByTagName("*"),
eles=[],
len=nodes.length
i,
j,
currNode,
clsNames,
clsLen;
for(i=0;i<len;i++)
{
currNode=nodes[i];
clsNames=currNode.className.split(' ');
clsLen=clsNames.length;
for(j=0;j<clsLen;j++)
{
if(clsNames[j]==clsName)
{
eles.push(currNode);
break;
}
}
}
return eles;
}
}
//知識(shí)點(diǎn)一:js中通過屬性offset--等,但padding,margin等只能獲取在內(nèi)聯(lián)html中有的樣式,
//因此,下面這個(gè)函數(shù)是獲取css樣式的通用函數(shù)。
var getStyle = function(dom, attr)
{
return dom.currentStyle ? dom.currentStyle[attr] : getComputedStyle(dom, false)[attr];
}
function waterfall(parent,box){
var main=document.getElementById(parent);
var boxes=$$(box,main);
var pins=$$('pin',main);
//console.log(boxes.length);
var pinw=pins[0];
var boxw=boxes[0].offsetWidth+parseInt(getStyle(pinw,'paddingLeft'));
console.log(boxes[0].clientWidth);
//console.log(boxw+','+main.clientWidth+','+main.offsetWidth+','+getStyle(boxes[0],'margin'));
var cols=Math.floor(document.documentElement.clientWidth/boxw);
console.log(cols);
main.style.width=cols*boxw+'px';
var boxesh=[];
for(var i=0;i<boxes.length;i++){
if(i<cols){
boxesh.push(boxes[i].offsetHeight+parseInt(getStyle(pinw,'paddingBottom')));
}
else{
var minh=Math.min.apply(null,boxesh);
var index=getMinIndex(boxesh,minh);
boxes[i].style.position='absolute';
boxes[i].style.top=minh+'px';
boxes[i].style.left=index*boxw+'px';
boxesh[index]+=boxes[i].offsetHeight+parseInt(getStyle(pinw,'paddingLeft'));
}
}
}
function getMinIndex(arr,val){
for(var i=0;i<arr.length;i++){
if(arr[i]==val)
return i;
}
}
function checkscrollside(){
var main=document.getElementById('main');
var aPin=$$('pin',main);
console.log(aPin.length);
var lastPinH=aPin[aPin.length-1].offsetTop+Math.floor(aPin[aPin.length-1].offsetHeight/2);
var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
var documentH=document.documentElement.clientHeight;//頁(yè)面高度
return (lastPinH<scrollTop+documentH)?true:false;
}
用jQuery實(shí)現(xiàn)部分:
//知識(shí)點(diǎn)一:jquery事件綁定
$(window).on('load',function(){
waterfall();
var dataimg={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'},{'src':'5.jpg'},{'src':'6.jpg'},{'src':'7.jpg'},{'src':'8.jpg'},{'src':'9.jpg'}]};
$(window).on('scroll',function(){
if(checkScrollSlide()){
//知識(shí)點(diǎn)二:數(shù)組遍歷
//知識(shí)點(diǎn)三:value參數(shù)是DOM對(duì)象
$.each(dataimg.data,function(key,value){
//知識(shí)點(diǎn)四:創(chuàng)建DOM元素,不需要createElement('div');
//知識(shí)點(diǎn)五:為元素綁定class,不再是className='';
//知識(shí)點(diǎn)六:往元素中填充元素,不再是obj.appendChild(obj);
//知識(shí)點(diǎn)七:屬性的獲取和設(shè)置,可以直接用attr (注意這是針對(duì)jquey對(duì)象的方法);
var oBox=$('<div>').addClass('pin').appendTo($('#main'));
var oPic=$('<div>').addClass('box').appendTo($(oBox));
$('<img>').attr('src','images/'+value.src).appendTo($(oPic));
})
waterfall();
}
})
})
function waterfall(){
var $boxs=$('#main>.pin');
//知識(shí)點(diǎn)八:jquery中的outerWidth(false)方法==js中的offsetWidth屬性
//innerWidth()==clientWidth;
//width()==width;
var w=$boxs.eq(0).outerWidth(false);
//console.log(w);
var cols=Math.floor($(window).width()/w);
//知識(shí)點(diǎn)九:jquery可以直接css(),js是obj,style.margin: ect;
$('#main').width(cols*w).css('margin','10px auto');
var hArr=[];
//注意,這兒value是DOM對(duì)象
$boxs.each(function(index,value){
var h=$boxs.eq(index).outerHeight(false);
if(index<cols){
hArr.push(h);
}else{
var minH=Math.min.apply(null,hArr);
//知識(shí)點(diǎn)十:jquey中直接封裝了一個(gè)數(shù)組中找取某個(gè)值對(duì)應(yīng)下標(biāo)的方法
var minHIndex=$.inArray(minH,hArr);
$(value).css({
'position':'absolute',
'top':minH+'px',
'left':minHIndex*w+'px',
});
hArr[minHIndex]+=$boxs.eq(index).outerHeight(false);
}
})
//console.log(hArr);
}
function checkScrollSlide(){
//知識(shí)點(diǎn)十一:可以直接last()方法獲取最后一個(gè)元素
var $lastBox=$('#main>div').last();
//知識(shí)點(diǎn)十二:js中的一系列offsetTop等屬性,變成了jquey中的offset().top ect;
var lastBoxDis=$lastBox.offset().top+Math.floor($lastBox.outerHeight(false)/2);
var scrollTop=$(window).scrollTop();
var documentH=$(window).height();
return (lastBoxDis<scrollTop+documentH)?true:false;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- nodejs中的異步編程知識(shí)點(diǎn)詳解
- JS內(nèi)置對(duì)象和Math對(duì)象知識(shí)點(diǎn)詳解
- VsCode與Node.js知識(shí)點(diǎn)詳解
- nodejs連接mysql數(shù)據(jù)庫(kù)及基本知識(shí)點(diǎn)詳解
- JavaScript知識(shí)點(diǎn)總結(jié)(十六)之Javascript閉包(Closure)代碼詳解
- JavaScript知識(shí)點(diǎn)總結(jié)(十一)之js中的Object類詳解
- JavaScript知識(shí)點(diǎn)總結(jié)(四)之邏輯OR運(yùn)算符詳解
- javascript知識(shí)點(diǎn)詳解
相關(guān)文章
詳解JavaScript表單驗(yàn)證(E-mail 驗(yàn)證)
這篇文章主要為大家詳細(xì)介紹了JavaScript表單驗(yàn)證,重點(diǎn)介紹了E-mail驗(yàn)證,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-03-03
javascript中如何快速獲取數(shù)組最后一個(gè)值
這篇文章主要介紹了javascript中如何快速獲取數(shù)組最后一個(gè)值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
javascript斷點(diǎn)調(diào)試心得分享
javascript中程序是怎么可以中斷執(zhí)行,然后一步一步走下去。而且debug的時(shí)候,可以看到變量,調(diào)用棧等東西。這個(gè)是如何實(shí)現(xiàn)的?2016-04-04
關(guān)于JS Lodop打印插件打印Bootstrap樣式錯(cuò)亂問題的解決方案
關(guān)于Lodop打印是個(gè)很牛的打印插件,但是打印Bootstrap的樣式的時(shí)候就容易錯(cuò)亂,下面通過本文給大家分享下這方面的問題2016-12-12

