思路:

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. activemq 安装-单点

    一,准备工作:首先安装jdk1.7及其以上版本,此环境安装的是jdk-1.8   二.搭建activemq 环境:  192.168.9.25         centos6.5            ...

  2. python classmethod方法 和 staticmethod

    classmethod() 是一个类方法,用来装饰对应的函数.被classmethod 装饰之后就无需实例化,也不需要在函数中传self,但是被装饰的函数第一个参数需要是cls来表示自身类.可以用来调 ...

  3. windowsphone8.1学习笔记之应用数据(二)

    上一篇说了应用数据的应用设置,这篇说说应用文件,应用文件主要分为三种:本地应用文件.漫游应用文件和临时应用文件. 获取根目录方法如下,都是返回一个StorageFolder对象(稍后介绍这个). // ...

  4. 九度OJ 1020:最小长方形 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6019 解决:2849 题目描述:     给定一系列2维平面点的坐标(x, y),其中x和y均为整数,要求用一个最小的长方形框将所有点框在 ...

  5. Python中的staticmethod和classmethod

    谈谈Python中的staticmethod和classmethod 首先值得说明的是staticmethod和classmethod都是python中定义的装饰器,用的时候需要在前面加@ 即@sta ...

  6. python网络爬虫之requests库 二

    前面一篇在介绍request登录CSDN网站的时候,是采用的固定cookie的方式,也就是先通过抓包的方式得到cookie值,然后将cookie值加在发送的数据包中发送到服务器进行认证. 就好比获取如 ...

  7. django 设置静态文件,static 链接

    这篇文章讲的django 静态static 文件设置,还可以,供参考 http://blog.csdn.net/sinat_21302587/article/details/74059078

  8. windows下python安装face_recognition模块

    安装face_recognition出现报错,要先安装dlib 安装dlib时报错,要先安装cmake cmake安装成功后,用pip安装dlib失败 从pypi下载dlib的wheel文件,然后用w ...

  9. Machine Learning No.4: Regularization

    1. Underfit = High bias Overfit = High varience 2. Addressing overfitting: (1) reduce number of feat ...

  10. g2o求解BA 第10章

    1.g2o_bal_class.h1.1 projection.hg2o还是用图模型和边,顶点就是相机和路标,边就是观测,就是像素坐标.只不过这里的相机是由旋转(3个参数,轴角形式,就是theta*n ...