思路:

style:

<style type="text/css">body,html{margin: 0;padding:0;}#container{position: relative;margin: 0 auto;text-align: center;}#container div{padding: 10px;position: absolute;}#container div img{padding: 10px;width: 200px;border: 1px solid #ccc;box-shadow: 0 0 5px #ccc;}</style>

html:

    <div id="container"><div><img src="data:images/1.jpg"></div><div><img src="data:images/2.jpg"></div><div><img src="data:images/3.jpg"></div><div><img src="data:images/4.jpg"></div><div><img src="data:images/5.jpg"></div><div><img src="data:images/1.jpg"></div><div><img src="data:images/2.jpg"></div><div><img src="data:images/3.jpg"></div><div><img src="data:images/4.jpg"></div><div><img src="data:images/5.jpg"></div><div><img src="data:images/1.jpg"></div><div><img src="data:images/2.jpg"></div><div><img src="data:images/3.jpg"></div><div><img src="data:images/4.jpg"></div><div><img src="data:images/5.jpg"></div><div><img src="data:images/1.jpg"></div><div><img src="data:images/2.jpg"></div></div>

瀑布流就是等宽不等高的元素进行排列;从第二行开始元素从第一行中高度的数组中获取高度最小的元素开始排列,然后把两个元素合并为一个元素,再次从数组中取出高度最小的值,依次类推

1 需要对所有的元素进行定位absolute;

2 定义子元素的宽度以及padding值,利用outerWidth() 获取元素的宽度(包含padding,不包含margin);

3 获取屏幕的宽度,第一个子元素的宽度(所有的元素等宽),两者取模向下取整数,获取每行的元素的个数 cols;

4 获取第一行子元素的高度值为一个数组 HArr

5 获取数组中的最小值以及最小值的index(就是获取第一行高度最小的元素以及位置)

6 第cols+1个元素的位置就在第一行高度最小的元素的下方

7 修改HArr最小值为原值与第cols+1个元素的高度

8 依次类推

瀑布流定位元素的位置:

    function waterFall(){var childs=$('#container div');var CWidth=$(childs[0]).outerWidth();var cols=Math.floor($(window).width()/CWidth);$('#container').width(CWidth*cols);var hArr=[];childs.each(function(index,item){if(index<cols){hArr.push($(item).outerHeight());$(item).css({left:index*CWidth+'px',top:0+'px'});}else{var minH=Math.min.apply(null,hArr);var mIndex=$.inArray(minH,hArr);$(item).css({left:mIndex*CWidth+'px',top:minH+'px'});hArr[mIndex]+=$(item).outerHeight();}});}

当鼠标滚动到页面底部时开始加载更多的数据:

判断鼠标滚动的位置:

     function checkScrollBottom(){var wHeight=$(window).height()+$(window).scrollTop();var lastItem=$("#container>div").last();var lastP=lastItem.offset().top+($(lastItem).outerHeight()/2);console.log($("#container>div").last());return wHeight>lastP?true:false}

加载更多的数据:

function addData(){console.log('addData');for(var i=1; i<6; i++){$('#container').append('<div><img src="data:images/'+i+'.jpg"/></div>');}waterFall();}

    window.οnlοad=function(){waterFall();}window.onscroll=function(){console.log(checkScrollBottom());if(checkScrollBottom()){addData();}else{waterFall();}}

原生js实现瀑布流:

function waterFall(){var parent=document.getElementById('container');var childs=parent.getElementsByTagName('div');var CWidth=childs[0].offsetWidth;var cols=Math.floor(document.body.clientWidth/CWidth);parent.style.width=CWidth*cols+"px";var hArr=[];for(var i=0; i<childs.length; i++){if(i<cols){hArr.push(childs[i].offsetWidth);childs[i].style.left=i*CWidth+'px';childs[i].style.top='0px';}else{var minH=Math.min.apply(null,hArr);var mIndex=getIndex(minH,hArr);childs[i].style.left=mIndex*CWidth+'px';childs[i].style.top=minH+'px';hArr[mIndex]+=childs[i].offsetHeight;}}        }function getIndex(item,arr){for(var i=0;i<arr.length; i++){if(arr[i]==item){return i;}}}function checkScrollBottom(){var wH=document.documentElement.clientHeight||document.body.clientHeight;var sH=document.documentElement.scrollTop||document.body.scrollTop;var wHeight=wH+sH;var Items=document.getElementById('container').getElementsByTagName('div');var lastItem=Items[Items.length-1];var lastP=lastItem.offsetTop+lastItem.offsetHeight/2;return wHeight>lastP?true:false}function addData(){var parent=document.getElementById('container');for(var i=1; i<6; i++){var divEle=document.createElement('div');parent.appendChild(divEle);var  imgEle=document.createElement('img');imgEle.src="data:images/"+i+".jpg";divEle.appendChild(imgEle);}waterFall();}window.onload=function(){waterFall();}window.onscroll=function(){console.log(checkScrollBottom());if(checkScrollBottom()){addData();}else{waterFall();}}

css3实现瀑布流:

使用column属性:

可以使用column-width 或者column-count:

#container{column-width:242px; -webkit-column-width:242px; -moz-column-width:242px; -o-column-width:242px; -ms-column-width:242px; }//

1 浏览器会自动计算分几列 2 元素宽度不会变 3 会根据屏幕的宽度显示不同的列数,导致元素之间的间隙不一致

或者#container{column-count:5; -webkit-column-count:5; -moz-column-count:5; -o-column-count:5; -ms-column-count:5; }//

1 浏览器自动计算宽度 2 元素的列数不会变,但是会导致元素的宽度不一致

js与css实现瀑布流的区别:

1 css性能高,浏览器自动计算不需要js一个一个元素计算

2 css元素显示不是很美观,元素之间的间隙不一致

3 js计算的元素是按顺序显示的,css显示的元素是从上到下的布局,导致元素显示不按顺序

转载于:https://www.cnblogs.com/xiaofenguo/p/10609088.html

jquery/原生js/css3 实现瀑布流以及下拉底部加载相关推荐

  1. js 下拉底部加载|滑轮滚动到页面底部ajax加载数据的实例

    转载链接:http://www.cnblogs.com/thinksley/archive/2013/05/12/3074237.html 滚动下拉到页面底部加载数据是很多瀑布流网站的做法,那来看看配 ...

  2. jq js css3 实现瀑布流

    css3:只是设置列宽属性  简单明了 大要实现无限下拉还是需要靠js <!doctype html> <html lang="en"> <head& ...

  3. 原生 JS 实现一个瀑布流插件

    更好的阅读体验,点击 原文地址 瀑布流布局中的图片有一个核心特点 -- 等宽不定等高,瀑布流布局在国内网网站都有一定规模的使用,比如pinterest.花瓣网等等.那么接下来就基于这个特点开始瀑布流探 ...

  4. 使用jquery.more.js来实现点击底部更多后, 底部加载出新的数据

    <div class="bus-nav-bar ft12"><div class="navt bor-r-c pos-rel {if $int == 0 ...

  5. RecyclerView瀑布流的形式利用Gilde加载网络图片

    RecyclerView的简单介绍 RecyclerView 是在Android5.0之后推出的,是一个比ListView更加灵活更加高效的适配器类型控件.但是RecyclerView不同于其他类型的 ...

  6. jQuery实现简单实用的H5(手机端)下拉分页加载(所谓的懒加载!!!)

    话不多说,直接码上 . <div> <div>展示内容列表块</div> //now当前页数   num总页数  这些需要在列表初始化的时候计算好,并赋值给此属性 ...

  7. JS实现动态瀑布流及放大切换图片效果(js案例)

    整理了一下当时学js写的一些案例,再次体验了一把用原生JS实现动态瀑布流效果的乐趣,现在把它整理出来,需要的小伙伴可以参考一下. 该案例主要是用HTML+CSS控制样式,通过JS实现全局瀑布流以及点击 ...

  8. JS结合PHP瀑布流,JavaScript_原生JS实现响应式瀑布流布局,原生JS实现的瀑布流布局,代 - phpStudy...

    原生JS实现响应式瀑布流布局 原生JS实现的瀑布流布局,代码及demo代码地址:https://github.com/leozdgao/responsive_waterfall Demo:http:/ ...

  9. html鼠标点击有手势出来,用原生js+css3撸的一个下拉手势事件插件

    ; (function () { var DropDown = function (dropId = 'dropDwon', distance = 60, callBack = () => {} ...

最新文章

  1. PCB铜箔厚度、线宽与允许通多电流大小的关系
  2. C语言 链表 头插法
  3. KeyError: 报错_python系列学习笔记
  4. c 导入数据到oracle,excel中数据导入到Orcale数据库表中的方法 | 学步园
  5. python查找文件是否存在_python脚本查找文件是否存在的方法
  6. 知云文献翻译打不开_文献翻译工具-知云文献翻译
  7. python包含html5么_python-HTML(HTML5级别)
  8. html静态页面制作教程,静态网页制作技术教程(HTML/CSS/JavaScript)
  9. 冰心吴文藻的爱情始于留学远洋客轮上
  10. PMI2016大会最全资料集合
  11. RingAllreduce和NCCL
  12. [python]的functools.partial(偏函数)
  13. 微信小程序之实现地图定位(使用腾讯位置服务插件)
  14. 自动驾驶道路曲率计算
  15. 知乎上发现的高赞 20 款网页神器,免费又高效,用过后就离不开了!
  16. 金蟾论金:4.12黄金涨势不足重启跌势-晚间走势操作建议
  17. 前端基础之《Bootstrap(13)—JavaScript插件_标签页、工具提示、弹出框、折叠效果和幻灯片》
  18. SpringSecurity Oauth2 认证授权(二)springboot快速入门与底层介绍
  19. 全球社交软件月活排行 微信排第五
  20. C/C++中野指针产生的三种情况

热门文章

  1. 【TensorFlow】TensorFlow从浅入深系列之十一 -- 教你深入理解卷积神经网络中的卷积层
  2. 经验 | 深度学习如何挑选GPU?
  3. C++编程积累——C++实现十进制与二进制之间的互相转换
  4. 牛津学霸的20条读博建议
  5. oracle空间整理,ORACLE数据库空间整理心得
  6. 深度学习 | Why and How:神经网络中的权重初始化
  7. 计算机视觉 | Python OpenCV 3 使用背景减除进行目标检测
  8. 数据结构(十三)树的遍历
  9. zentao怎么卸载linux,linux下搭建ZenTaoPMS项目管理软件
  10. 勤哲linux客户端,Excel在线编辑