javascript瀑布流

小编 2026-06-05 阅读:1400 评论:0
哇,瀑布流,是的,不错,不错,真的不错,很好玩的样子,于是自己想玩玩啊,来吧,就玩起。循序渐进,...

哇,瀑布流,是的,不错,不错,真的不错,很好玩的样子,于是自己想玩玩啊,来吧,就玩起。

循序渐进,我这里采用原生的js代码来书写。为了方便大家运行代码,我就全部样式和CSS都写在html里面了,当然还需要图片,我会打包。

来上代码。

直接代码

javascript瀑布流
<!DOCTYPE HTML><html>    <head>    <meta charset="utf-8">    <title>哇,瀑布流啊</title>    <style type="text/css">           @media screen and (min-width:1550px){            .waterfall-container {                     width:1400px;                        }        }                @media screen and (max-width:1549px) and (min-width:1366px){            .waterfall-container {                 width:1200px;                        }        }        @media screen and (max-width:1365px) and (min-width:700px) {            .waterfall-container {                 width:500px;                        }        }                @media screen and (max-width:699px) {            .waterfall-container {                 width:350px;                        }        }                .waterfall-container{                             top: 0;            float:left;                        display:inline;            position:relative;        }                .water-molecule {             position:absolute;             border: solid 1px #ccc;             padding: 10px;             width: 200px;             top: 0px;             left: 0px;             -webkit-transition: all .7s ease-out .1s;             -moz-transition: all .7s ease-out .1s;             -o-transition: all .7s ease-out .1s;             transition: all .7s ease-out .1s        }        img { width: 100%; }                </style>    </head>    <body >        <div>            哟,好拽的瀑布流!!!        </div>        <div style="position:relative">            <div style="left:0; float:left; display:inline; width:100px">                            <ul id="mediaSet">                    <li><a href="#">1300px</a></li>                    <li><a href="#">1100px</a></li>                    <li><a href="#">900px</a></li>                    <li><a href="#">600px</a></li>                </ul>                        </div>            <div class="waterfall-container">                  <div class="water-molecule"><a href="images/temp_img02.jpg"><img src="images/temp_img02.jpg"/></a> </div>                  <div class="water-molecule"><a href="images/temp_img03.jpg"><img src="images/temp_img03.jpg"/></a> </div>                  <div class="water-molecule"><a href="images/temp_img04.jpg"><img src="images/temp_img04.jpg"/></a> </div>                  <div class="water-molecule"><a href="images/temp_img09.jpg"><img src="images/temp_img09.jpg"/></a> </div>                  <div class="water-molecule"><a href="images/temp_img05.jpg"><img src="images/temp_img05.jpg"/></a> </div>                  <div class="water-molecule"><a href="images/temp_img06.jpg"><img src="images/temp_img06.jpg"/></a> </div>                  <div class="water-molecule"><a href="images/temp_img07.jpg"><img src="images/temp_img07.jpg"/></a> </div>                  <div class="water-molecule"><a href="images/temp_img08.jpg"><img src="images/temp_img08.jpg"/></a> </div>                  <div class="water-molecule"><a href="images/temp_img09.jpg"><img src="images/temp_img09.jpg"/></a> </div>                  <div class="water-molecule"><a href="images/temp_img10.jpg"><img src="images/temp_img10.jpg"/></a> </div>                  <div class="water-molecule"><a href="images/temp_img11.jpg"><img src="images/temp_img11.jpg"/></a> </div>                  <div class="water-molecule"><a href="images/temp_img12.jpg"><img src="images/temp_img12.jpg"/></a> </div>                  <div class="water-molecule"><a href="images/temp_img13.jpg"><img src="images/temp_img13.jpg"/></a> </div>                  <div class="water-molecule"><a href="images/temp_img14.jpg"><img src="images/temp_img14.jpg"/></a> </div>                  <div class="water-molecule"><a href="images/temp_img15.jpg"><img src="images/temp_img15.jpg"/></a> </div>                  <div class="water-molecule"><a href="images/temp_img15.jpg"><img src="images/temp_img15.jpg"/></a> </div>                              </div>        </div>    <script type="text/javascript">            function minColunmnIndex (arr) {            var minColumn = 0;            var min = arr[minColumn];            for (var i = 1,len=arr.length; i < len; i++) {                var temp = arr[i];                if (temp < min) {                    minColumn = i;                    min = temp;                };            };            return minColumn;        }                Object.extend = function(destination, source) {            for (var property in source) {                destination[property] = source[property];            }            return destination;        }            function waterWall(container,settings){                        var _settings = {                margin:10,                cellClass:"water-molecule"                        };            if(typeof settings != "undefined"){                _settings = Object.extend(_settings,settings);            }            var margin = _settings.margin;            var boxes = document.getElementsByClassName(_settings.cellClass);            var wContainer = container;            var boxWidth = boxes[0].offsetWidth + margin;                        function waterfall () {                var columnHeight=[];                var waterFallWith = container.offsetWidth;                var n = parseInt(waterFallWith/boxWidth);                var columnNum = n == 0 ? 1 : n;                var baseLeft = wContainer.offsetLeft;                for (var i = 0,l=boxes.length; i <l ; i++) {                    if (i<columnNum) {                        columnHeight[i]=boxes[i].offsetHeight+margin;                        boxes[i].style.top = 0;                        boxes[i].style.left =  i*boxWidth+margin+'px';                    } else{                        var innsertColumn = minColunmnIndex(columnHeight),                            imgHeight = boxes[i].offsetHeight+ margin;                        boxes[i].style.top = columnHeight[innsertColumn]+'px';                        boxes[i].style.left = innsertColumn*boxWidth+margin+'px';                        columnHeight[innsertColumn] +=imgHeight;                     };                };            };                                        var wf = {                master: container,                waterfall:waterfall            }                        return wf;        }        var wf = new waterWall(document.getElementsByClassName("waterfall-container").item(0));        window.onload = function(){wf.waterfall();};        window.onresize = function(){            wf.master.style.width = null;            wf.waterfall();        };                    document.getElementById("mediaSet").addEventListener("click",function(ev){            var link  = ev.target,            width = link.text;            wf.master.style.width = width;            wf.waterfall();                    },false);            </script></body></html>
javascript瀑布流

 

分析:

1. 核心就是waterfall方法,计算当前容器的offsetWith,和定义好的单位元素的宽度以及定义的margin来计算列数,再通过当前索引

2. minColumnIndex来计算当前高度最小的列,然后取改列已经存有的高度作为top的值,用 index * 单位元素的宽度 + margin作为 left的值

3.头部定义媒体查询,做到初始化的时候,自动调整,当然,在resize的时候可以动态重新计算,我这里没有这么做

4. 设置了几个 1300,100, 900, 600几个值,用来点击测试。

 

源码下载:

http://files.cnblogs.com/files/mouse_in_beijing/PB.zip

 

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表