jquery/原生js/css3 实现瀑布流以及下拉底部加载
思路:
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 实现瀑布流以及下拉底部加载的更多相关文章
- 原生js 实现的瀑布流
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 原生 JS 实现一个瀑布流插件
更好的阅读体验,点击 原文地址 瀑布流布局中的图片有一个核心特点 -- 等宽不定等高,瀑布流布局在国内网网站都有一定规模的使用,比如pinterest.花瓣网等等.那么接下来就基于这个特点开始瀑布流探 ...
- javacript 实现瀑布流原理和效果, 滚动加载图片【图文解析 附源码】
先科普下瀑布流吧 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早采用此布局的网站是Pin ...
- jQuery的JS库在本地运行项目时提示无法加载
最近公司有个项目在我本地运行时引用本地的jquery.js,浏览器提示无法加载 <script src="/js/newperson/jquery-1.11.3.min.js" ...
- 使用jquery.more.js来实现点击底部更多后, 底部加载出新的数据
<div class="bus-nav-bar ft12"> <div class="navt bor-r-c pos-rel {if $int == ...
- Android RecyclerView 瀑布流滑动到最后自动加载更多
mRecycleView.setOnScrollListener(new RecyclerView.OnScrollListener(){ //用来标记是否正在向最后一个滑动,既是否向下滑动 bool ...
- JS实现动态瀑布流及放大切换图片效果(js案例)
整理了一下当时学js写的一些案例,再次体验了一把用原生JS实现动态瀑布流效果的乐趣,现在把它整理出来,需要的小伙伴可以参考一下. 该案例主要是用HTML+CSS控制样式,通过JS实现全局瀑布流以及点击 ...
- js 实现图片瀑布流效果,可更改配置参数 带完整版解析代码[waterFall.js]
前言: 本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽. 本篇文章为您分析一下原生JS实现图片瀑布流效果 页面需求 1 ...
- 从零开始手把手教你使用原生JS+CSS3实现幸运水果机游戏
项目体验地址 免费视频教程 游戏介绍 幸运水果机是一款街机游戏,游戏界面由24个方格拼接成一个正方形,每个方格中都有一个不同的水果图形,方格下都有一个小灯.玩家使用游戏币选择希望押注的目标,按下开始后 ...
随机推荐
- TP实例化模型的两种方式 M() D()
TP框架中实例化模型的两种方式 #如果使用自己自定义的函数,那么就用D $mode=D('model'); #如果使用是系统自带的函数,那么就是用M $model=M('model');
- c 字符串 函数
c编辑 strcpy 原型:extern char *strcpy(char *dest,char *src); 用法:#include <string.h> 功能:把src所指由NUL结 ...
- Spring属性编辑器详解
1.常见的属性的注入:int,string,list,set,map 2.什么是属性编辑器及作用? (1)将spring配置文件中的字符串转换为相应的java对象 (2)spring内置了一些属性编辑 ...
- activemq 搭建--集群
linux activmemq 集群安装,配置和高可用测试 从 ActiveMQ 5.9 开始,ActiveMQ 的集群实现方式取消了传统的Master-Slave 方式,增加了基于Z ...
- EasyNVR流媒体服务器接入EasyDSS云视频平台快照上传实现
EasyNVR拥有接入EasyDSS云平台的功能 接入EasyDSS云平台会定时向云平台上传快照数据,这个快照数据用于云平台向客户端提供快照展示 遇到的问题 由于快照上传的间隔提供认为修改的功能,则我 ...
- 常见 WEB 安全漏洞(转)
SQL注入 成因:程序未对用户的输入的内容进行过滤,从而直接代入数据库查询,所以导致了sql 注入 漏洞 . 思路:在URL处可以通过 单引号 和 and 1=1 and 1=2 等语句进行手工测试s ...
- 如何在windows上创建文件名以“.”开头的文件
比如要创建.env文件,正常会提示必须输入文件名才能创建的,但是可以在后面再加一个点就能创建了,.env.这样就可以了
- NinjaFramework中文教程(简单版)-手把手教程-从零开始
第一步: 官网http://www.ninjaframework.org/documentation/getting_started/create_your_first_application.htm ...
- nokogiri
Nokogiri的用法我推荐三篇非常给力的文章:http://ruby.bastardsbook.com/chapters/html-parsing/http://ruby.bastardsbook. ...
- 解决webpack不能匹配post请求的问题
解决webpack不能匹配post请求的问题 webpack的dev-server只能匹配get请求,在本地做本地数据的时候会很不方便. 可以使用如下两种办法解决: 1.在webpack.config ...