照片瀑布流效果(js,jquery分别实现与知识点总结)

看了慕课网的瀑布流教程,自己跟着写了遍,然后总结了下知识点

<!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实现部分:

window.οnlοad=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.οnscrοll=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)  
{  
    //如果当前浏览器支持通过类名获取元素,直接返回  
    if(document.getElementsByClassName)  
    {  
        return(ele||document).getElementsByClassName(clsName);  
    }  
    else  
    {  
        //尽量把这些量存放在变量中,否则  
        //例如循环不用len,而用nodes.length,会每一次循环都遍历一次  
        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;  
    }
}
//知识点一:js中通过属性offset--等,但padding,margin等只能获取在内联html中有的样式,
//因此,下面这个函数是获取css样式的通用函数。
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;//页面高度
    return (lastPinH<scrollTop+documentH)?true:false;
}




用jquery实现部分:

//知识点一: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()){
			//知识点二:数组遍历
			//知识点三:value参数是DOM对象
			$.each(dataimg.data,function(key,value){
				//知识点四:创建DOM元素,不需要createElement('div');
				//知识点五:为元素绑定class,不再是className='';
				//知识点六:往元素中填充元素,不再是obj.appendChild(obj);
				//知识点七:属性的获取和设置,可以直接用attr (注意这是针对jquey对象的方法);
				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');
	//知识点八: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);
	//知识点九:jquery可以直接css(),js是obj,style.margin:  ect;
	$('#main').width(cols*w).css('margin','10px auto');
	var hArr=[];
	//注意,这儿value是DOM对象
	$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);
			//知识点十:jquey中直接封装了一个数组中找取某个值对应下标的方法
			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(){
	//知识点十一:可以直接last()方法获取最后一个元素
	var $lastBox=$('#main>div').last();
	//知识点十二: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;
}


相关知识点链接:

事件绑定:点击

获取元素样式:点击
























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jQuery实现瀑布效果需要先引入jQuery库,然后通过计算每个元素的位置和高度,来实现元素的动态排列。 以下是一个简单的示例代码: HTML部分: ```html <div id="waterfall"> <div class="item">item1</div> <div class="item">item2</div> <div class="item">item3</div> <div class="item">item4</div> <div class="item">item5</div> <div class="item">item6</div> </div> ``` CSS部分: ```css #waterfall { width: 800px; /* 瀑布容器宽度 */ margin: 0 auto; } .item { width: 380px; /* 每个元素宽度 */ margin: 10px; float: left; background-color: #eee; } ``` jQuery部分: ```javascript $(function() { // 获取瀑布容器的宽度 var containerWidth = $('#waterfall').width(); // 获取每个元素的宽度和间距 var itemWidth = $('.item').outerWidth(true); // 计算列数 var cols = Math.floor(containerWidth / itemWidth); // 创建一个数组用于存放每一列的高度 var heightArr = []; for (var i = 0; i < cols; i++) { heightArr.push(0); } // 遍历每个元素 $('.item').each(function() { // 获取元素的高度 var itemHeight = $(this).outerHeight(true); // 找到高度最小的那一列 var minHeight = Math.min.apply(null, heightArr); var minIndex = $.inArray(minHeight, heightArr); // 设置元素的位置 $(this).css({ 'left': minIndex * itemWidth, 'top': minHeight }); // 更新该列的高度 heightArr[minIndex] += itemHeight; }); }); ``` 上述代码实现了一个简单的瀑布效果,可以根据实际需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值