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

作者: webCoder | 来源:发表于2016-02-16 16:08 被阅读1283次

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); 
};

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

相关文章

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

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

  • jQuery 瀑布流

    瀑布流的实现原理 要想实现瀑布流首先需要确定需要排列的内容,宽度需要一致; 设定父容器相对定位,需排列子元素绝对定...

  • 使用js来实现瀑布流效果

    使用js来实现瀑布流效果 瀑布流的实现方法有很多种,我这次采用的是使用绝对定位的方法来实现。页面中包含一个容器ul...

  • 瀑布流布局 的学习

    1- 实现瀑布流布局效果 瀑布流效果瀑布流代码木桶布局效果木桶布局代码瀑布流布局 2- 实现一个新闻瀑布流新闻...

  • js/jQuery实现瀑布流

    html中主要代码: 实现瀑布流的js代码: css实现瀑布流只需要三行代码: 实现下拉刷新的js代码: js/c...

  • Swift实现UICollectionView支持多 secti

    通过UICollectionViewLayout实现瀑布流 代码如下 调用如下 完整demo链接 瀑布流

  • 利用position相对绝对定位和负边距实现水平垂直居中

    绝对定位与浮动类似,也是会脱离文档流;绝对定位的方式实现居中,需要在已知宽高的情况下;代码如下:

  • 瀑布流布局

    题目1: 实现一个瀑布流布局效果瀑布流代码题目2:实现木桶布局效果木桶布局代码题目3:实现一个新闻瀑布流新闻网站,...

  • Ajax应用实例:瀑布流,留言板

    Ajax应用实例:瀑布流,留言板 2h22m05s 瀑布流项目开发: 瀑布流实现原理分析 浮动与定位,优缺点 数据...

  • vue实现瀑布流布局

    vue根据高度和绝对定位方法实现瀑布流布局,并且在删除其中一个数据时,从删除的位置开始,瀑布流自动重新布局。1.首...

网友评论

  • Lokep:如果通过定位实现的瀑布流,不是会有高度塌陷的问题么
  • 周萌萌:窗口大小改变的时候,如果没有小于之前设置的固定宽度,是不会重新排列的,所以这个随窗口大小改变重新排列,很难计算
    webCoder:@周萌萌 <时,设置图片不绝对定位,然后垂直排列,宽度100%自适应

本文标题:瀑布流代码实现(绝对定位)

本文链接:https://www.haomeiwen.com/subject/pzwpkttx.html