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个方格拼接成一个正方形,每个方格中都有一个不同的水果图形,方格下都有一个小灯.玩家使用游戏币选择希望押注的目标,按下开始后 ...
随机推荐
- cocos2dx 3.2+ 项目创建与问题总汇
本文为Cocos2d-x 3.x 全平台(Android,iOS)新手开发配置教程攻略,希望对大家有所帮助.由于这篇文章是面对新手的. 所以有些地方会啰嗦一些,请勿见怪. 假设教程中有错误.欢迎指正. ...
- convert from EST/EDT to GMT
TimeZoneInfo est = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); DateTime ...
- [Android基础]Android中使用HttpURLConnection
HttpURLConnection继承了URLConnection,因此也能够向指定站点发送GET请求.POST请求.它在URLConnetion的基础上提供了例如以下便捷的方法. int getRe ...
- Eclipse中执行Tomcat源代码
1. 到http://archive.apache.org/dist/tomcat/tomcat-7下载Tomcat源码,本文用到的是apache-tomcat-7.0.19-src.zip: 注意: ...
- Android 实现的EditText响应drawableRight的点击事件
1.自定义Edittext 实现右侧图标点击清空 package com.dxw.live.view; import android.content.Context; import android.g ...
- HashMap与 HashTable, Treemap的区别
(一)HashMap 1.HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null; 2.HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数 ...
- rabbitmq 安装-单点
centos6.5 rabbitmq搭建 环境:centos6.5 192.168.9.41 安装rabbitmq需要先安装erlang.rabbitmq3.6版本需要erlang R16B03 ...
- LR中select next row和update value on的设置
LR的参数的取值,和select next row和update value on的设置都有密不可分的关系.下表给出了select next row和update value on不同的设置,对于LR ...
- var foo = "11"+2+"1"; console.log(foo); //1121 好多文章答案写错了,我发下给初学的朋友看到,以免一开始就学错了
体会加一个字符串'1' 和 减去一个字符串'1'的不同 var foo = "11"+2-"1"; console.log(foo); //111 consol ...
- Coursera公开课Functional Programming Principles in Scala习题解答:Week 2
引言 OK.时间非常快又过去了一周.第一周有五一假期所以感觉时间绰绰有余,这周中间没有假期仅仅能靠晚上加周末的时间来消化,事实上还是有点紧张呢! 后来发现每堂课的视频还有相应的课件(Slide).字幕 ...