美文网首页
瀑布流算法

瀑布流算法

作者: HelloKing | 来源:发表于2018-10-29 15:13 被阅读11次

    // 添加插件

    $.fn.extend({

    waterfall:function(){

    // console.log('我自己写的瀑布流插件');

    // 步骤1

    /*

    为了 计算 获取一些 必须知道的值

    容器的宽度 .items的 宽度

    子元素的宽度 .child().width()

    每一行放置的元素个数

    计算间距

    */

    // 定义$_变量 方便 观察

    var  $_this = this;

    // 父盒子宽度

    var totalWidth =$_this.width();

    // 子元素宽度

    var itemWidth = $_this.children('.item').width();

    // 每一行的个数 4.1  4.9

    var colNum =Math.floor(totalWidth / itemWidth);

    // 间距 (总宽度 - 个数*子元素宽度)/(个数-1)

    var margin = (totalWidth - itemWidth*colNum)/(colNum-1);

    // 步骤2

    /* 1. 准备一个 数组 数组元素的个数 跟 每一行的个数一直

    里面是默认值(比如是10 或者是margin)

    2. 循环我们的 所有 .item 子元素

    获取子元素的高度

    通过我们在步骤1中定义的 数组 获取 最小的值

    根据获取的 最小索引值 计算top 以及left

    3.修改步骤1中定义的 数组 对应索引的值 即可

    */

    // 步骤2.1 准备高度数组

    // 高度数组

    var heightArr = [];

    // 循环为 高度数组 赋值 初始值

    for (var i = 0; i < colNum; i++) {

    heightArr[i] = margin;

    }

    // 步骤 2.2 循环子元素 获取数组中最小的索引

    // 修改当前循环的元素的 top 以及 left值

    // jq中 循环数组的方法

    $_this.children('.item').each(function(index, element) {

    // console.log(index+'||'+element);

    // 获取 当前循环的 子元素高度

    var currentHeight = $(element).height();

    // 计算 该元素 放在哪个位置

    // 先 假设 索引为0的 是最小值

    var minIndex = 0;

    var minHeight =heightArr[0];

    for (var i = 0; i < heightArr.length; i++) {

    // 根 我们自己假设的 最小值 进行比较

    if (heightArr[i]<minHeight) {

    // 替换一下

    minHeight = heightArr[i];

    minIndex = i;

    }

    }

    // 循环完毕 最小的 高度 以及 最小的 索引值

    // 设置给 当前循环的 子元素 即可

    // top 高度为 计算出来的 最小高度

    // left 左间距为 宽度*索引 +索引*间距

    $(element).css({

    top:minHeight,

    left:minIndex*itemWidth+minIndex*margin

    });

    // 步骤2.3 修改 步骤1中 创建的 高度数组

    // 修改 minIndex 对应的值即可

    minHeight+=currentHeight; //加上自己的高度

    minHeight+=margin;//为了美观 把间距 加上去

    // 赋值给 高度数组即可

    heightArr[minIndex]=minHeight;

    });

    //步骤3

    /*

    修改 父盒子的 高度 即可

    // 获取 高度数组中 最大的值

    // 修改父盒子的高度为 计算出来的 最大值即可

    */

    //

    var maxHeight = heightArr[0];

    for (var i = 0; i < heightArr.length; i++) {

    if(heightArr[i]>maxHeight){

    // 将 更大的值 保存起来

    maxHeight = heightArr[i];

    }

    }

    // 循环完毕以后 最大值 就有了

    $_this.height(maxHeight);

    }

    })

    相关文章

      网友评论

          本文标题:瀑布流算法

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