• 前端项目练习01-瀑布流练习


    是我是我又是我,我要在此发誓每个工作日练一个前端小项目,并把大致思路和部分代码以及总结心得发在这里,请诸位监督,鞠躬感谢O(∩_∩)O谢谢

    瀑布流设计主要是计算最小块的高度并自动填充。设计思路如下:

    原生js设计:

    1)分块,整体页面为一个分块,设为main.main中分成若干个cage,cage中再加入photo块,photo块中再放入图片。

    <div id="main">
    	<div class="cage">
    		<div class="photo">
    			<img src="images/0.jpg">
    		</div>
    	</div>	
    		

    2)设计css main设计为绝对定位,photo和cage设计为float:left,就能保证分行排布,photo里的img设置一下宽度,剩下的细节就自己喜欢就好

    *{
    	margin:0;
    	padding: 0;
    
    }
    #main{
    	position: relative;
    }
    .cage{
    	float:left;
    	padding:10px;
    	
    }
    .photo{
    	border-style: solid;
    
    	border-color: #888;
    	box-shadow: 5,5,#ccc;
    	border-radius: 5px;
    
    }
    .photo img{
    	height: auto;
    	225px;
    }

    3)设计js

    瀑布流实现用waterfall函数,

    1)已有图片的瀑布流加载

    (1)在函数中首先取main,然后取cage,取cage封装成一个getByClass函数,易于维护,

    (2)将cage类中所有内容取出来后首先计算一行能放多少张图片,然后将整个类遍历。一行内图片正常存高度,

    (30超过一行的要采取别的措施,首先找出目前高度数组中最小高度的图片序号,然后把待加载的图片的定位设为绝对定位,

    top就是直接最小图片的height,left就是头上图片的offsetleft,同时更新高度数组的最小高度。就能达成已有图片的瀑布流排列。

    	window.onload=function(){
    		waterfall('main','cage');
    
    }	
    	function waterfall(parent,cage){
    		var oParent=document.getElementById(parent);
    		var ocage=getByClass(oParent,cage);//调出cage的块
    		var num=Math.floor(document.documentElement.clientWidth/ocage[0].offsetWidth);//计算一行能放多少张图片
    		console.log(num);
    		var hArr=[];//存放图片高度
    		for(var i=0;i<ocage.length;i++){
    			if(i<num){
    				hArr.push(ocage[i].offsetHeight);
    			}
    			else{
    				var minH=Math.min.apply(null,hArr);
    				var n=getMinIndex(hArr,minH);
    				ocage[i].style.position='absolute';
    				ocage[i].style.top=minH+'px'
    				ocage[i].style.left=ocage[n].offsetLeft+'px';
    				hArr[n]+=ocage[i].offsetHeight;
    
    			}
    
    		}}
    
    	
    	function getByClass(parent,clsName){
    		var pArr=new Array(),
    		oEle=parent.getElementsByTagName('*');
    	for(var i=0;i<oEle.length;i++)
    	{
    			if(oEle[i].className==clsName)
    			{
    				pArr.push(oEle[i]);
    
    			}
    	}
    	return pArr;	
    	}
    
    function getMinIndex(parent,minh){
    	for(var i in parent)
    	{
    		if(parent[i]==minh)
    		{
    			return i;
    		}
    
    	}
    
    }

    2)是鼠标滚动加载的图片:

    (1)判断最后一张图片是否已滑过高度的一半。

    function scrollLoad(){
    		var oParent=document.getElementById('main');
    		var ocage=getByClass(oParent,'cage');
    		var n=ocage.length-1;
    		var lastHeight=ocage[n].offsetTop+Math.floor(ocage[n].offsetHeight/2);//最后一张图片的一半高度
    		var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;//浏览器兼容问题
    
    		var height=document.documentElement.clientHeight||document.body.clientHeight;//浏览器兼容问题
    		return(lastHeight<scrollTop+height)?true:false;
    
    	}

    (2)生成div块自动加载。

    	window.onscroll=function(){
    				if(scrollLoad){
    	      var oParent=document.getElementById('main');
    	          for(var i=0;i<dataInt.data.length;i++)
    	          {
                            //生成cage photo img
    	          	var ocage=document.createElement('div');
    	          	ocage.className='cage';
    	          	oParent.appendChild(ocage);
    	          	var opho=document.createElement('div');
    	          	opho.className='photo';
    	          	ocage.appendChild(opho);
    	          	var oimg=document.createElement('img');
    	          	oimg.src="images/"+dataInt.data[i].src;
    	          	opho.appendChild(oimg);
    
    	          }
    	          waterfall("main","cage");
    
    				}
    			}

    总结:

    1)绝对定位和相对定位的区别

    绝对定位的元素框会在文档流中消失,相当于悬在文档流上,相对定位的元素框并未消失在文档流中,位置还在,但是可以发生偏移

    2)offSetHeight clientwidth 

    offsetheight:返回元素的实际像素高度,包括内边框和边框。

    网页可见区域宽: document.body.clientWidth;
    网页可见区域高: document.body.clientHeight;
    网页可见区域宽: document.body.offsetWidth   (包括边线的宽);
    网页可见区域高: document.body.offsetHeight  (包括边线的宽);
    网页正文全文宽: document.body.scrollWidth;
    网页正文全文高: document.body.scrollHeight;
    网页被卷去的高: document.body.scrollTop;
    网页被卷去的左: document.body.scrollLeft;
    网页正文部分上: window.screenTop;
    网页正文部分左: window.screenLeft;
    屏幕分辨率的高: window.screen.height;
    屏幕分辨率的宽: window.screen.width;
    屏幕可用工作区高度: window.screen.availHeight;

    屏幕可用工作区宽度:window.screen.availWidth;

     

    3)浏览器兼容

    获取scrollTop值

    完美的获取scrollTop 赋值短语 

    var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
    通过这句赋值就能在任何情况下获得scrollTop 值。
  • 相关阅读:
    价值观
    周记 改
    周记
    C语言问卷调查
    icon踩坑记录
    console.log(a)和console.log(window.a)的区别?
    记录一次微信二次分享的优化过程
    在jQuery中使用自定义属性
    10个JS技巧
    日常工作总结 2019/10/10
  • 原文地址:https://www.cnblogs.com/dadaochangcun/p/9806585.html
Copyright © 2020-2023  润新知