JS原生效果瀑布流布局的实现(一)
JS原生效果 实现:
HTML页面布局:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link href="css/style.css" type="text/css" rel="stylesheet"/>
<script type="text/javascript" src="js/js.js"></script>
</head>
<body>
<div id="main">
<div class="box">
<div class="pic">
<img src="img/1.jpg" />
</div>
</div>
<div class="box">
<div class="pic">
<img src="img/2.jpg" />
</div>
</div>
<div class="box">
<div class="pic">
<img src="img/3.jpg" />
</div>
</div>
<div class="box">
<div class="pic">
<img src="img/4.jpg" />
</div>
</div>
<div class="box">
<div class="pic">
<img src="img/5.jpg" />
</div>
</div>
<div class="box">
<div class="pic">
<img src="img/6.jpg" />
</div>
</div>
<div class="box">
<div class="pic">
<img src="img/7.jpg" />
</div>
</div>
<div class="box">
<div class="pic">
<img src="img/8.jpg" />
</div>
</div>
<div class="box">
<div class="pic">
<img src="img/9.jpg" />
</div>
</div>
<div class="box">
<div class="pic">
<img src="img/10.jpg" />
</div>
</div>
<div class="box">
<div class="pic">
<img src="img/11.jpg" />
</div>
</div>
<div class="box">
<div class="pic">
<img src="img/12.jpg" />
</div>
</div>
<div class="box">
<div class="pic">
<img src="img/13.jpg" />
</div>
</div>
<div class="box">
<div class="pic">
<img src="img/14.jpg" />
</div>
</div>
<div class="box">
<div class="pic">
<img src="img/15.jpg" />
</div>
</div>
<div class="box">
<div class="pic">
<img src="img/16.jpg" />
</div>
</div>
<div class="box">
<div class="pic">
<img src="img/17.jpg" />
</div>
</div>
<div class="box">
<div class="pic">
<img src="img/18.jpg" />
</div>
</div>
<div class="box">
<div class="pic">
<img src="img/19.jpg" />
</div>
</div>
<div class="box">
<div class="pic">
<img src="img/20.jpg" />
</div>
</div>
<div class="box">
<div class="pic">
<img src="img/21.jpg" />
</div>
</div> </div>
</body>
</html>
CSS样式效果:
* {margin:;padding:;}
img{display: block;}
#main{position: relative;}
.box{padding: 15px 0 0 15px;float: left;}
.pic{padding: 10px;border: 1px solid #ccc; border-radius: 5px; box-shadow: 0 0 5px #ccc; display: block;}
.pic img{width: 165px;height: auto;}
JS实现:
1、将main下所有的class为box的元素取出来,封装一个获取class的一个函数 getByClass();
//根据class获取元素
function getByClass(parent,clsName){
var boxArr=[];//用来存储获取到的所有的class为box的元素
oElements=parent.getElementsByTagName("*");
for(var i=0;i<oElements.length;i++){
if(oElements[i].className==clsName){
boxArr.push(oElements[i]);
};
};
return boxArr;
};
2、计算页面当中,显示多少列(页面宽/box的宽)
var oBoxW=oBoxs[0].offsetWidth;
var cols=Math.floor(document.documentElement.clientWidth/oBoxW);
//设置main的宽
oParent.style.cssText='width:'+oBoxW*cols+'px;margin:0 auto;';
3、对页面 图片进行定位
注:第一排图片是不需要进行定位的,但是第二行的第一张图片要出现在上一行当中盒子最矮的下面,紧接着第八张依次排列上一行当中盒子最矮的下面!
4、定义一个数组,存放页面上每列高度的数组!
var hArr=[];//存放每一列高度的数组
最开始,数组中存放的是第一行中每列的高度值,之后就是存放着每一列的所有高度值的总和!
for(var i=0;i<oBoxs.length;i++){//遍历所有 class为box的 盒子
if(i<cols){//如果i小于列数
hArr.push(oBoxs[i].offsetHeight);//那么 就把这些盒子的高度存放在hArr数组里
}else{
var minH=Math.min.apply(null,hArr);
var index=getMinhIndex(hArr,minH);
oBoxs[i].style.position='absolute';
oBoxs[i].style.top=minH+'px';
oBoxs[i].style.left=oBoxW*index+'px'; hArr[index]+=oBoxs[i].offsetHeight;//修改列的高度
};
};
5、判断数组中最小的值:
var minH=Math.min.apply(null,hArr);
求出最小值在数组中的索引值 :
遍历数组中每一个值,拿每一个值跟val比较,如果 相等,则该索引值就是我们需要的
function getMinhIndex(arr,val){
for(var i in arr){
if(arr[i]==val){
return i;
}
}
};
6、拖动滚动条,不断加载剩下的图片!并不是拖动了滚动条,我们 就 需要 加载数据,我们需要检测一下,是否具备加载数据块的条件!(检测最后一张图片)
当我们拖动滚动条的时候,最后一张图片还未进入可视区域内,是不需要加载图片的!
当最后一张图片进入到 可视区域高度的一半的时候,开始加载图片!
判断当最后一张图片高度的一半距离页面顶部的距离 < 滚动条滚动的距离+页面可是的区域 成立的时候,开始加载图片!
//检测是否具备了滚动条加载数据的条件
function checkScrollSlide(){
var oParent=document.getElementById('main');
var oBoxs=getByClass(oParent,'box');
var lastBoxH=oBoxs[oBoxs.length-1].offsetTop+Math.floor(oBoxs[oBoxs.length-1].offsetHeight/2);
var scrollTop=document.body.scrollTop || document.documentElement.scrollTop;
var height=document.body.clientHeight || document.documentElement.clientHeight; return (lastBoxH<scrollTop+height)?true:false;
};
window.onscroll=function(){
if(checkScrollSlide){
var oParent=document.getElementById('main');
for(var i=0;i<dataInt.data.length;i++){
var oBox=document.createElement("div");
oBox.className='box';
oParent.appendChild(oBox);
var oPic=document.createElement("div");
oPic.className='pic';
oBox.appendChild(oPic);
var oImg=document.createElement("img");
oImg.src='img/'+dataInt.data[i].src;
oPic.appendChild(oImg);
}; waterfall("main","box");
};
JS原生效果瀑布流布局的实现(一)的更多相关文章
- 原生js实现图片瀑布流布局,注释超详细
完整代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 原生js实现的瀑布流布局
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- js实现网页瀑布流布局
效果图: html代码实现网页布局: <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- 手把手教你js原生瀑布流效果实现
手把手教你js原生瀑布流效果实现 什么是瀑布流效果 首先,让我们先看一段动画: 在动画中,我们不难发现,这个动画有以下特点: 1.所有的图片的宽度都是一样的 2.所有的图片的高度是不一样的 3.图片一 ...
- JS 瀑布流布局
瀑布流布局 HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...
- JS案例之6——瀑布流布局(1)
在实际的项目中,偶尔会用到一种布局——瀑布流布局.瀑布流布局的特点是,在多列布局时,可以保证内容区块在水平方向上不产生大的空隙,类似瀑布的效果.简单的说,在垂直列表里,内容区块是一个挨着一个的.当内容 ...
- 纯js实现瀑布流布局及ajax动态新增数据
本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax ...
- JS瀑布流布局模式(1)
在实际的项目中,偶尔会用到一种布局——瀑布流布局.瀑布流布局的特点是,在多列布局时,可以保证内容区块在水平方向上不产生大的空隙,类似瀑布的效果.简单的说,在垂直列表里,内容区块是一个挨着一个的.当内容 ...
- 原生 JS 实现一个瀑布流插件
更好的阅读体验,点击 原文地址 瀑布流布局中的图片有一个核心特点 -- 等宽不定等高,瀑布流布局在国内网网站都有一定规模的使用,比如pinterest.花瓣网等等.那么接下来就基于这个特点开始瀑布流探 ...
随机推荐
- windows下登录lunix服务器
在微信项目中,负责发布,我就把我用到的记录一下.有两种登录方式,看你要做什么操作. 1.SecureCRT 支持命令行操作.(主要是发布程序) 调试.微信公众号规定要有服务器的网址,一般公司的都是内网 ...
- Android版本
Android自从3.0版本开始引入了Fragment的概念,它可以让界面在平板上更好地展示 Fragment建议继承android.app.Fragment的包,另外support.v4包主要是 ...
- 为TIF、JPG图片添加地理坐标/平面直角坐标
图片分辨率.(X方向像素数numX,Y方向像素数numY) 步骤: (1)在放图片的目录下新建TXT文本文档,将文件名改为与图片相同,扩展名改为jgw(JPG图片),(TIF要改为tfw). (2)用 ...
- href链接的地址
tencent://message/?uin=QQ号. 链接一个弹出框.指向一个QQ号.
- python文本过滤
#encoding:UTF-8 import re temp = "想做/ 兼_职/学生_/ 的 .加,我Q: 8 8. 8 8. !!?? 8 8 .8. 8. 8 有,惊,喜,哦&quo ...
- C# ADO.NET 连接Sybase 数据库
using Sybase.Data.AseClient;//反编译修改后的DLL public class SybaseHelper { public AseConnection con; publi ...
- Html标签第二课css
css(Cascading Style Sheet)叠层样式表.用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言. 一:样式三种控制方法 1.行内样式: <div style=& ...
- Yii 多个子目录同步登录
---恢复内容开始--- 配置文件中: 1 'components'=>array( 'user'=>array( 'class'=>'CWebUser', 'identityCo ...
- iptables基本规则配置(二)
注释:文章中fg:为示例 红色标记的为命令 在上篇博文中详细讲解了iptables的原理及一些常用命令,这里在简要的说明一下: Linux防火墙包含了2个部分,分别是存在于内核空间的(netfilt ...
- 【visio 2007操作】
1.visio改变画布大小 两种方法:1)按住ctrl,可以鼠标拉动调整背景绘图大小2)点击菜单栏“文件”-“页面尺寸”,选择“调整大小以适应绘图内容”并点击确定