瀑布流布局思路:

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网页瀑布流布局的更多相关文章

  1. js实现网页瀑布流布局

    效果图: html代码实现网页布局: <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  2. 纯js实现瀑布流布局及ajax动态新增数据

    本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax ...

  3. 网页瀑布流布局插件Masonry

    CSS3有实现类似瀑布流布局的属性column,但是遗憾的是这种布局是纵向布局而不支持横向布局.所以比较合适用于文字多列布局. 调用JQuery WaterFall布局插件:http://masonr ...

  4. 原生JS实现瀑布流布局

    瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部. 1.首先瀑布流所有的图片应该保持宽度一致,高 ...

  5. js实现瀑布流布局

    window.onload = function () { var d1 = new Waterfall(); d1.init();};//构造函数function Waterfall() { thi ...

  6. JS案例之6——瀑布流布局(1)

    在实际的项目中,偶尔会用到一种布局——瀑布流布局.瀑布流布局的特点是,在多列布局时,可以保证内容区块在水平方向上不产生大的空隙,类似瀑布的效果.简单的说,在垂直列表里,内容区块是一个挨着一个的.当内容 ...

  7. JS 瀑布流布局

    瀑布流布局 HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...

  8. JS瀑布流布局模式(1)

    在实际的项目中,偶尔会用到一种布局——瀑布流布局.瀑布流布局的特点是,在多列布局时,可以保证内容区块在水平方向上不产生大的空隙,类似瀑布的效果.简单的说,在垂直列表里,内容区块是一个挨着一个的.当内容 ...

  9. JS瀑布流布局

    好久没有更新博客喽,今天来说一个瀑布流布局. 瀑布流在很多网站已有很多,现在只说一下简单的实现原理吧, 1.计算一行可以排放几个元素 2.建立一个数组用于存放第一行的每个元素的高度. 3.得到数组中的 ...

随机推荐

  1. 24-Fibonacci(dfs+剪枝)

    http://acm.hdu.edu.cn/showproblem.php?pid=5167 Fibonacci Time Limit: 2000/1000 MS (Java/Others)    M ...

  2. HTML和CSS入门教程

    慕课网上面的HTML+CSS基础课程感觉非常适合入门.

  3. centos中JDK版本冲突的问题

    在centos环境下,我JDK版本安装了jdk6,jdk7.系统还自带了一个JDK7. 我在查看JDK版本是,发现不是我在/etc/profile中配置的. 1:which java 查看Java的命 ...

  4. python--爬虫基础

    http://files.cnblogs.com/files/Kobe10/Python__%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80.pdf

  5. 【IMOOC学习笔记】多种多样的App主界面Tab实现方法(一)

    1.ViewPager实现Tab 首先实现底部和底部布局 <?xml version="1.0" encoding="utf-8"?> <Li ...

  6. 解决批处理命令执行完毕后自动关闭cmd窗口方法

    问题描述: 日常开发工作中,为了节省多余操作导致浪费时间,我们经常会自己建一些批处理脚本文件(xx.bat),文件中包含我们需要执行的命令,有时候我们希望执行完毕后看一下执行的结果,但是窗口执行完毕后 ...

  7. DataGridView增加全选列

    最近的一个winform的项目中,碰到datagridview控件的第一列添加全选的功能,通常这个功能,有两种实现方式:1. 为控件添加DataGridViewCheckBoxColumn来实现,但是 ...

  8. C#根据弹窗标题获取窗体句柄并模拟点击按钮(FindWindow,FindWindowEx,SendMessage)

    任务:将下面弹窗自动关闭 /// <summary> /// 找到窗口 /// </summary> /// <param name="lpClassName& ...

  9. CSS选择器及CSS样式表

    前言 牛腩新闻发布系统中记忆最深的就是各种CSS选择器各种CSS样式,这些选择器之间肯定有它的优先级,包括CSS样式也一样,也是有它的优先级,本文介绍一些各种CSS选择器各种CSS样式以及它们的优先级 ...

  10. CI框架源码学习笔记2——Common.php

    上一节我们最后说到了CodeIgniter.php,可是这一节的标题是Common.php,有的朋友可能会觉得很奇怪.事实上,CodeIgniter.php其实包含了ci框架启动的整个流程. 里面引入 ...