思路:

style:

<style type="text/css">
body,html{
margin:;
padding:;
}
#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.onload=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显示的元素是从上到下的布局,导致元素显示不按顺序

jquery/原生js/css3 实现瀑布流以及下拉底部加载的更多相关文章

  1. 原生js 实现的瀑布流

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

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

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

  3. javacript 实现瀑布流原理和效果, 滚动加载图片【图文解析 附源码】

    先科普下瀑布流吧 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早采用此布局的网站是Pin ...

  4. jQuery的JS库在本地运行项目时提示无法加载

    最近公司有个项目在我本地运行时引用本地的jquery.js,浏览器提示无法加载 <script src="/js/newperson/jquery-1.11.3.min.js" ...

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

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

  6. Android RecyclerView 瀑布流滑动到最后自动加载更多

    mRecycleView.setOnScrollListener(new RecyclerView.OnScrollListener(){ //用来标记是否正在向最后一个滑动,既是否向下滑动 bool ...

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

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

  8. js 实现图片瀑布流效果,可更改配置参数 带完整版解析代码[waterFall.js]

    前言:         本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽.         本篇文章为您分析一下原生JS实现图片瀑布流效果 页面需求 1 ...

  9. 从零开始手把手教你使用原生JS+CSS3实现幸运水果机游戏

    项目体验地址 免费视频教程 游戏介绍 幸运水果机是一款街机游戏,游戏界面由24个方格拼接成一个正方形,每个方格中都有一个不同的水果图形,方格下都有一个小灯.玩家使用游戏币选择希望押注的目标,按下开始后 ...

随机推荐

  1. StringBuilder的append、StringBuffer的append和String str = "a"+"b"的区别?

    大家都知道String+String会开销额外的系统资源,粗略的原因是String是不可变类,每一步操作都会返回新的String变量,占用空间及时间. 其实我的理解不是这样的,我们来看看String+ ...

  2. l两张图片轮播

    在head里面加 <script language="javascript"> function scroll(spanlevel) { if (spanlevel.s ...

  3. Grunt是什么,以及它的一些使用方法

    ♥什么是Grunt Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器.grunt是基于node 更多插件请访问:http://www.gruntjs.n ...

  4. mysql双机热备+heartbeat集群+自动故障转移

    环境说明:本环境由两台mysql 数据库和heartbeat 组成,一台的ip 为 192.168.10.197,一台为192.168.10.198,对外提供服务的vip 为192.168.10.20 ...

  5. 【题解】P3162CQOI2012组装

    [题解][CQOI2012]组装 考虑化为代数的形式,序列\(\left[a_i \right]\)表示选取的\(i\)种类仓库的坐标. \(ans=\Sigma(a_i-x)^2,(*)\),展开: ...

  6. 我的Android进阶之旅------>直接拿来用!最火的Android开源项目

    转载于CSDN,相关链接如下: http://www.csdn.net/article/2013-05-03/2815127-Android-open-source-projects http://w ...

  7. 微软Azure区块链开发工具包三大功能详解

    2018年11月15日,微软宣布了Azure区块链开发工具包,它基于微软的无服务器技术构建,并且利用微软和第三方SaaS,完美集成了区块链.该工具包扩展了微软的区块链开发模板和Azure Blockc ...

  8. php分10个不同等级压缩优化图片(PNG)

    今天找到一个php写的压缩图片程序,可以分10个等级(0-9)来压缩,0等级时压缩比率不是很大,图片不会失真:随着压缩等级不断增大,图片会变得越来越不清晰,通常压缩后图片大小可以减少到原来的50%,压 ...

  9. 如何修改硬盘挂载的名字LABEL

    ➜ ~ df -h Filesystem Size Used Avail Use% Mounted on/dev/sda2 114G 97G 12G 90% /media/brian/4ef34b75 ...

  10. CUDA: 原子操作

    1.1以上计算功能集支持全局内存上的原子操作, 1.2以上支持共享内存上的原子操作. atomicAdd(add,y)将生成一个原子的操作序列,这个操作序列包括读取地址addr处的值,将y增加到这个值 ...