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个方格拼接成一个正方形,每个方格中都有一个不同的水果图形,方格下都有一个小灯.玩家使用游戏币选择希望押注的目标,按下开始后 ...
随机推荐
- Two stage U-Boot design
In AM335x the ROM code serves as the bootstrap loader, sometimes referred to as the Initial Program ...
- 【Python】Selenium元素定位错误之解决办法
当使用class定位元素时发现报错: 错误信息:selenium.common.exceptions.InvalidSelectorException: Message: Compound class ...
- css选择器参考手册
选择器 例子 例子描述 CSS .class .intro 选择 class="intro" 的所有元素. 1 #id #firstname 选择 id="firstna ...
- 图像处理之基础---卷积及其快速算法的C++实现
头文件: /* * Copyright (c) 2008-2011 Zhang Ming (M. Zhang), zmjerry@163.com * * This program is free so ...
- Javaweb之 servlet 开发具体解释1
1.1 Tip:Servlet简单介绍 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发 ...
- python之Matplotlib 和Numpy
1.matplotlib http://www.cnblogs.com/TensorSense/p/6802280.html https://wenku.baidu.com/view/e1c15c9d ...
- Python 字符串操作(截取/替换/查找/分割)
Python 截取字符串使用 变量[头下标:尾下标],就可以截取相应的字符串,其中下标是从0开始算起,可以是正数或负数,下标可以为空表示取到头或尾. # 例1:字符串截取 str = '1234567 ...
- Mac版 Intellij IDEA 激活
第一步:修改这两个文件夹 进入跳转路径,输入 /private/etc/ 点击[前往] 同时加上: # Intellij IDEA0.0.0.0 account.jetbrains.com 第二部:在 ...
- php异步任务处理: gearman
Gearman是一个用来把工作委派给其他机器.分布式的调用更适合做某项工作的机器.并发的做某项工作在多个调用间做负载均衡 准备软件包 gearmand-1.1.12.tar.gz gearman-1. ...
- 请求时token过期自动刷新token
1.在开发过程中,我们都会接触到token,token的作用是什么呢?主要的作用就是为了安全,用户登陆时,服务器会随机生成一个有时效性的token,用户的每一次请求都需要携带上token,证明其请求的 ...