博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mansory算法分析
阅读量:6320 次
发布时间:2019-06-22

本文共 1037 字,大约阅读时间需要 3 分钟。

相信大家对mansory排版算法印象十分深刻,它能够十分有效的实现页面紧凑排版,节省空间,并且还显得十分美观。在很多网站,包括鼎鼎有名的pinterest都使用了这个算法来实现排版。这个过程有点象瓦匠在码砖头,所以我会有时候称这些div为brick(砖头),容器为墙面!

有一个现象不知道大家注意否,这个排版的方法对于输入是很敏感的。所谓的输入就是指需要进行排版的div块。进一步说对于不同的输入,结果可能是大相迳庭的。这个不同可以从两个方面来定义:第一,顺序的不同;第二,大小的不同。这个只需要稍微思考下就可以明白的。不信的话大家可以做些试验!

首先如果先不考虑细节的问题,正常逻辑应该是这样实现:

  1. 1. 输入为一个数组,也就是我们需要进行排版的div;
  2. 2. 中间进行对于这个数组按顺序遍历,每次遍历需要做一些工作(主要就是定位);
  3. 3. 输出还是这个数组,不过他们的位置都已经进行过从新定位了;

那么在第二步,需要一个placeBrick方法来做码砖头的事情了。它的输入其实就是每个砖头。输出就是码好的砖头。就这么简单!

具体步骤为拿到一个brick

  1. 看墙面(容器)现在的高度(轮廓);
  2. 找到可以容纳这个brick且不会和brick重叠,但又是最低处的墙面(位置)。
  3. 放置此brick,更新墙面(容器)状态;
  4. 迭代这个过程,直到所有的brick用完;

上面就是整个算法的核心部分!下载下来源码以后,你只要搞清除了这个部分,整个插件你就基本掌握了。虽然这部分代码站整个代码的20%不到,但绝对值得你用80%的精力来研究。剩下的80%只需要20%时间过一下就好!

其余的20%可以留意看看它如何做resize重新计算以及新的brick如何加载上来的。都是基于理解上面的核心代码的基础上!

分析完了这个算法以后,可以对这个算法进行一些修改来为我所用。比如空隙这个问题,它十分依赖于输入的顺序和大小!

如果大小都是一样,尤其是宽度一致的div应该是不会有这个问题的。对于排版来说要保证div宽度一致也是不可能的。经常会有各种宽度的div需要排版。那么大小无法改变了,可以尝试调换输入的顺序。不过这个逻辑会十分复杂。神人们可以尝试一下!我属于笨鸟,选者想办法记录下每个空格的位置,然后利用事先准备好的div来补上这些空隙!很直接的逻辑吧!具体实现过程可以参照下面截图!注意这个方法必须紧接在每次更新墙面(容器)前!

然后基本上所有重要的事情就完成了。这样你就可以达到下面的效果!

转载地址:http://oxpaa.baihongyu.com/

你可能感兴趣的文章
Java多线程详解
查看>>
c# 传递Null的string值导致的调用C++的dll报错 Attempted to read or write protected memory.
查看>>
C/C++中__builtin_popcount()的使用及原理
查看>>
浅谈强化学习的方法及学习路线
查看>>
PyTorch中的C++扩展
查看>>
获取UUID保存至keyChain通用库
查看>>
【杂谈】拍了几张照片
查看>>
OC--有这么一个 整数 123456789,如何将这个整数的每一位数,从末位开始依次放入数组中,并遍历 倒序输出字符串...
查看>>
Orchard模块开发全接触3:分类的实现及内容呈现(Display)
查看>>
.NET零基础入门06:面向对象入门
查看>>
手机qq协议做的第三方qq软件
查看>>
iOS 使用FFmpeg实现视频H264编码
查看>>
统一用户认证和单点登录解决方案
查看>>
MICROSOFT SQLSERVER 总结
查看>>
0909 编译原理1
查看>>
Java设计模式:工厂模式
查看>>
JS通用方法扩展
查看>>
hexo从零开始到搭建完整
查看>>
c/c++文件I/O函数学习--不断补充
查看>>
谈谈-this与super
查看>>