看了网上的瀑布流教程,自己跟着写了遍,然后总结了下知识点
<!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.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)
{
//如果当前浏览器支持通过类名获取元素,直接返回
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;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# js瀑布流效果
# 照片瀑布流
# jquery瀑布流照片墙
# nodejs中的异步编程知识点详解
# JS内置对象和Math对象知识点详解
# VsCode与Node.js知识点详解
# nodejs连接mysql数据库及基本知识点详解
# JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解
# JavaScript知识点总结(十一)之js中的Object类详解
# JavaScript知识点总结(四)之逻辑OR运算符详解
# javascript知识点详解
# 可以直接
# 遍历
# 绑定
# 这是
# 放在
# 看了
# 不需要
# 写了
# 装了
# 大家多多
# 而用
# 中找
# 变成了
# 网上
# 总结了
# height
# body
# width
# images
# id
相关文章:
导航网站建站方案与优化指南:一站式高效搭建技巧解析
如何通过可视化优化提升建站效果?
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
音响网站制作视频教程,隆霸音响官方网站?
如何做网站制作流程,*游戏网站怎么搭建?
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
如何用好域名打造高点击率的自主建站?
官网建站费用明细查询_企业建站套餐价格及收费标准指南
建站之星安装提示数据库无法连接如何解决?
微信小程序 五星评分(包括半颗星评分)实例代码
建站之星后台密码遗忘或太弱?如何重置与强化?
招商网站制作流程,网站招商广告语?
如何用虚拟主机快速搭建网站?详细步骤解析
一键网站制作软件,义乌购一件代发流程?
h5在线制作网站电脑版下载,h5网页制作软件?
如何用狗爹虚拟主机快速搭建网站?
北京的网站制作公司有哪些,哪个视频网站最好?
网站制作话术技巧,网站推广做的好怎么话术?
哈尔滨网站建设策划,哈尔滨电工证查询网站?
西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
婚礼视频制作网站,学习*后期制作的网站有哪些?
如何快速搭建高效服务器建站系统?
Python多线程使用规范_线程安全解析【教程】
如何在阿里云域名上完成建站全流程?
建站之星会员如何解锁更多建站功能?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
广州营销型建站服务商推荐:技术优势与SEO优化解析
零基础网站服务器架设实战:轻量应用与域名解析配置指南
制作网站怎么制作,*游戏网站怎么搭建?
高端建站如何打造兼具美学与转化的品牌官网?
建站之星如何快速更换网站模板?
建站org新手必看:2024最新搭建流程与模板选择技巧
怀化网站制作公司,怀化新生儿上户网上办理流程?
建站之星如何保障用户数据免受黑客入侵?
建站主机选虚拟主机还是云服务器更好?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
简单实现Android验证码
如何挑选最适合建站的高性能VPS主机?
建站主机选购指南:核心配置与性价比推荐解析
如何用已有域名快速搭建网站?
宝塔建站教程:一键部署配置流程与SEO优化实战指南
建站之星安装模板失败:服务器环境不兼容?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
如何快速生成可下载的建站源码工具?
建站之星安装失败:服务器环境不兼容?
如何通过远程VPS快速搭建个人网站?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
*请认真填写需求信息,我们会在24小时内与您取得联系。