瀑布流代码实现(绝对定位)

w> 瀑布流是页面展示中十分常见的一种布局方式,利用这种布局,网页会显得十分好看。
瀑布流元素最大的特点是等宽不等高,下面我一步步来分析如何实现瀑布流。

1.首先,我们准备一些图片,以及把基础的html+css代码写好(因为这步很简单,所以我就直接贴代码了)。

  • 页面初始效果
pic1.png
  • 网页结构
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>瀑布流</title>
    <link rel="stylesheet" href="index.css">
</head>
<body>
    <div class="container">
        <div class="box">
            <div class="box-img">
                <img src="img1.jpg" alt="pic1">
            </div>
        </div>
        <div class="box">
            <div class="box-img">
                <img src="img2.jpg" alt="pic2">
            </div>
        </div>
        <div class="box">
            <div class="box-img">
                <img src="img3.jpg" alt="pic3">
            </div>
        </div>
        <div class="box">
            <div class="box-img">
                <img src="img4.jpg" alt="pic4">
            </div>
        </div>
        <div class="box">
            <div class="box-img">
                <img src="img5.jpg" alt="pic5">
            </div>
        </div>
        <div class="box">
            <div class="box-img">
                <img src="img6.jpg" alt="pic6">
            </div>
        </div>
    </div>
</body>
</html>
  • css
*{margin: 0;padding: 0;}
.container{position: relative;width: 1040px;margin: 0 auto;}
.box{float: left;padding: 5px;font-size: 0;}
.box-img img{width: 250px;}

2.实现瀑布流效果

原理:
1.根据所设的宽度,获得每一行可以放几列(我的列子中是写死的,一行放4列);
2.获取每个元素的高度,保存在数组中;
3.从第一个元素依次设置每个元素的定位:
   3.1 先获得这个元素该放在第几列(现有高度最小的列),通过下面的getMinHeightCol函数;
   3.2 根据每列的宽以及每列的当前高度,设置元素的left,top值(当然也要设置position:absolute);
   3.3 重新修改每列的当前高度(为了3.1获得最新的“高度最小的列”);
  • js代码(依赖jquery)
$(function(){
    var elesHeight = [];//每个元素的宽度
    var colsHeight = [0,0,0,0]; //每列元素现有的高度
    $(".container .box").each(function(index,item){
        var eleHeight = $(this).height();
        elesHeight.push(eleHeight);
    });

    //依次摆放每一个元素
    $(".container .box").each(function(index,item){

        //获得该元素应该在第几列
        var colShould = getMinHeightCol(colsHeight);

        var tempTop = colsHeight[colShould];
        var tempLeft = colShould*260;
        $(this).css({"position":"absolute","top":tempTop+"px",left:tempLeft+"px"});

        //同时将该列的高度加上当前新增元素的高度
        colsHeight[colShould] += $(this).height();
    });

    //得到四列中高度最小的那一列
    function getMinHeightCol(arr){
        var minHeight = Math.min.apply(null, arr);
        console.log("最小高度:"+minHeight);
        for(var i in arr){
            if(arr[i]==minHeight){
                return i;
            }
        }
        //默认第一列
        return 0;
    }

});
  • 页面效果
pic2.png

上面只是简单的瀑布流实现,一个完整的瀑布流应该也具备下面的几个特点:

  • 列数根据页面宽度和每列的宽度自动计算得来;
  • 窗口大小改变时,重新计算元素布局的位置;
  • 解决——窗口大小快速变化时,会不断地触发事件,造成的大量的性能消耗。
针对第三个问题的setTimeout解决方法:
窗口变化之后开始计时,如果窗口还在变换则从新开始计时,窗口不再变化则延时(很短的时间)触发重排事件。
var re;
window.onresize = function() {
    clearTimeout(re);
    re = setTimeout(resize,100); 
};

剩余的优化,自己动手尝试吧~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,786评论 1 92
  • 一:在制作一个Web应用或Web站点的过程中,你是如何考虑他的UI、安全性、高性能、SEO、可维护性以及技术因素的...
    Arno_z阅读 1,204评论 0 1
  • <a name='html'>HTML</a> Doctype作用?标准模式与兼容模式各有什么区别? (1)、<...
    clark124阅读 3,540评论 1 19
  • 所谓瀑布流,就是图片分几列有规律的排列,但是这里的排列是有要求的,普通的浮动布局会使图片与图片之间有很多的空隙,这...
    小飞侠zzr阅读 838评论 0 0
  • 1、养老金新规:男60岁、女55岁可以一次性补缴十五年; 2、多国为教科文组织撑腰,俄代表:没有美国工作起来更轻松...
    筱小丽阅读 107评论 0 1