js网页瀑布流布局
瀑布流布局思路:
1、css样式,图片的父级div样式设置为定位或者浮动
2、找出图片父级元素(box)和最外元素(main);获取box的宽度和main的宽,然后计算main容器一行能容纳多少个box(即有多少列)
3、声明一个空数组(用于放置每列的高度)
4、for(var i=0;i<box.length;i++)循环遍历所有的box元素,if 判断i是否小于上面求得的列数,设置box元素top、left和把box元素的高度添加进空数组;如果i值大于列数就是第二行其余的box元素,查找出数组中的最小值和最小值的索引,设置box的top为这个值,left值为box[index].offsetLeft,更新所查找到的数组元素的值(原数组值+当前box的高度)
5、定位和浮动脱离了文档流,最高给main设置高度为数组的最大值
css样式
<style type="text/css">
* {
margin:;
padding:;
}
body{
overflow-x:hidden ;
}
#main {
position: relative;
margin: 0 auto;
} #main .box {
position: absolute;
/*transition: all 1s;*/
} #main .box .pic {
width: 165px;
padding: 10px;
border: 1px solid #ccc;
border-radius: 5px;
box-shadow: 0 0 5px #ccc;
} #main .box .pic img {
width: 100%
}
</style>
HTML代码
<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>
js代码
<script type="text/javascript">
window.onload = function() {
waterFall("main", "box");
window.onresize = function() {
waterFall("main", "box");
} function waterFall(parent, box) {
var oParent = document.getElementById(parent);
var oBoxs = getByClass(oParent, box);
var oBoxW = oBoxs[0].offsetWidth + 15;
var cols = Math.floor(document.documentElement.clientWidth / oBoxW);
if(cols<4){
cols=4;
} var hArr = [];
for(var i = 0; i < oBoxs.length; i++) {
if(i < cols) {
oBoxs[i].style.top = 0;
oBoxs[i].style.left = i * oBoxW + "px";
hArr.push(oBoxs[i].offsetHeight);
} else {
var minH = Math.min.apply(null, hArr);
var index = getIndexOf(hArr, minH);
var top = minH + 15; //加15用于图片上下的间距
oBoxs[i].style.top = top + "px";
oBoxs[i].style.left = oBoxs[index].offsetLeft + "px";
hArr[index] += oBoxs[i].offsetHeight + 15;
}
}
//设置父级main的宽度、高度
var maxH = Math.max.apply(null, hArr);
oParent.style.cssText = 'height:' + maxH + 'px;width:' + (oBoxW * cols - 15) + 'px;margin:0 auto';
} function getByClass(oParent, clsName) {
var boxArr = new Array();
var oElements = oParent.getElementsByTagName('*');
var oElementsLen = oElements.length;
for(var i = 0; i < oElementsLen; i++) {
if(oElements[i].className == clsName) {
boxArr.push(oElements[i])
}
}
return boxArr;
} function getIndexOf(arr, val) {
for(var i in arr) {
if(arr[i] == val) {
return i;
}
}
}
}
</script>
js网页瀑布流布局的更多相关文章
- js实现网页瀑布流布局
效果图: html代码实现网页布局: <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- 纯js实现瀑布流布局及ajax动态新增数据
本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax ...
- 网页瀑布流布局插件Masonry
CSS3有实现类似瀑布流布局的属性column,但是遗憾的是这种布局是纵向布局而不支持横向布局.所以比较合适用于文字多列布局. 调用JQuery WaterFall布局插件:http://masonr ...
- 原生JS实现瀑布流布局
瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部. 1.首先瀑布流所有的图片应该保持宽度一致,高 ...
- js实现瀑布流布局
window.onload = function () { var d1 = new Waterfall(); d1.init();};//构造函数function Waterfall() { thi ...
- JS案例之6——瀑布流布局(1)
在实际的项目中,偶尔会用到一种布局——瀑布流布局.瀑布流布局的特点是,在多列布局时,可以保证内容区块在水平方向上不产生大的空隙,类似瀑布的效果.简单的说,在垂直列表里,内容区块是一个挨着一个的.当内容 ...
- JS 瀑布流布局
瀑布流布局 HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...
- JS瀑布流布局模式(1)
在实际的项目中,偶尔会用到一种布局——瀑布流布局.瀑布流布局的特点是,在多列布局时,可以保证内容区块在水平方向上不产生大的空隙,类似瀑布的效果.简单的说,在垂直列表里,内容区块是一个挨着一个的.当内容 ...
- JS瀑布流布局
好久没有更新博客喽,今天来说一个瀑布流布局. 瀑布流在很多网站已有很多,现在只说一下简单的实现原理吧, 1.计算一行可以排放几个元素 2.建立一个数组用于存放第一行的每个元素的高度. 3.得到数组中的 ...
随机推荐
- webfrom 做项目的注意事项
1.展示细节 如男女显示问题 不能显示true false 时间转换成中文 民族显示汉字 不能直接显示代码2.用户名重复验证 从数据库中查询验证4.日期判断 判断年份有点问题 var y ...
- 友善之臂smart210 3G网卡配置说明
1.命令行输入 3g-ppp /etc/3g-modem/12d1.1446.12d1.1001 2.call-ppp wcdma 3. 你到etc目录里grep一下192.168.1.1 sant ...
- 杭电ACM刷题(2):1005,Number Sequence 标签: 杭电acmC语言 2017-05-11 22:43 116人阅读
Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1 ...
- 95E Lucky Country
传送门 题目大意 如果一个数中不包含除4和7之外的数字则是幸运数.有n个岛屿,通过双向道路连接.这些岛屿被分为几个地区.每个岛属于恰好一个区域,同一区域中的任何两个岛之间存在道路,不同区域的任何两个岛 ...
- for与break的用法
# Auther: Aaron Fan age_of_oldboy = 56 #执行3次循环for i in range(3): guess_age = int(input("猜一下oldb ...
- C++文件流打开标识符.RP
ofstream流,以ios::app打开(或者“ios::app|ios::out”),如果没有文件,那么生成空文件:如果有文件,那么在文件尾追加.以ios::app|ios::in打开,不管有没有 ...
- C#用GDI+解析Json文件绘制Chart
using System.Collections.Generic; namespace Chart { public class Program { static void Main(string[] ...
- IOC与依赖注入
spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入什么?控 ...
- Unity3D 接口使用
C#怎么实现多继承? 说起多继承,首先大家可以想想这个问题:你知道在C#中怎么实现多继承吗? 主流的答案无非2种. 答案一:用接口啊,一个类可以继承自多个接口的.答案二:C#不支持多继承,C++才支持 ...
- 在Android中使用FlatBuffers(中篇)
本文来自网易云社区. FlatBuffers.Protobuf及JSON对比测试 FlatBuffers相对于Protobuf的表现又如何呢?这里我们用数据说话,对比一下FlatBuffers格式.J ...