工作项目中需要制作个Mobile上的Web App的展示,方便快捷访问和评价反馈。在展示页面能看到应用展示图,点击进入Web应用。我不是前端开发者,对HTML, CSS, JS这三剑客仅仅是略知一二。于是先规划了个简单的设计,感觉瀑布流的图片展示方式比较美观,同时布局的高度也一定灵活性。就按照Pinterest Android/IOS和花瓣Mobile Web App的目标开始实现。

第一天的成果是完成了基本的展示和链接。在iPhone模拟器上效果如下

HTML页面代码snippet:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- ... -->
 
<!-- Masonry JS library引入 -->
<script type="text/javascript" src="js/masonry-docs.min.js"></script>
</head>
 
<body>
<!-- ... -->
 
<!-- Masonry在HTML里的初始化方法 -->
<div id="container" class="js-masonry" >
<div class="hero-item has-example">
<a href="http://datarecovery.duapp.com/">
<p class="example-title">联想3C服务</p><img class="title-icon" src="assets/1_logo.png">
<img class="tilt" src="assets/1lenovo3CService.png">
</a>
</div>
<!-- ... -->
</body>
<script type="text/javascript" src="assets/jquery.min.js"></script>
<script type="text/javascript" src="assets/topsrh.min.js"></script>
<script type="text/javascript" src="assets/jquery.qrcode-0.7.0.min.js"></script>
<script type="text/javascript" src="assets/cases.min.js"></script>
来自CODE的代码片
lightshow.html

相对应的CSS,比较关键的width的值,它决定了horizontal的column数目,比如这里的45%, 略小于50%, 也就是横向上可容纳两列:

1
2
3
4
5
6
7
8
9
10
.hero-item,
.hero-masonry .grid-sizer {
width: 45%; /* juse a lil under 47 */
margin: 3% 2%;
/*float: middle ;*/
border-radius: 8px;
box-shadow: 0 1px 3px rgba(0,0,0,.3);
-moz-box-shadow: 0 1px 3px rgba(0,0,0,.3);
-webkit-box-shadow: 0 1px 3px rgba(0,0,0,.3);
}
来自CODE的代码片
lightshow.css

这时有个layout问题会随机出现,纵向的layout有时会让每个展示层叠在一起。就像下面的这样:

纵向的layout问题在第一次访问的时候比较容易出现,之后如果刷新一两次一般就恢复正常了。

原因来自于图片的<img>元素并没有指定的height。我们希望瀑布流的各个高度能够灵活展示,并由浏览器的布局计算得出。但是浏览器加载图片与layout计算的异步操作令这里留下了出错的可能。也就是说,图片必须先load完成之后,浏览器才能根据图片的natural size得出为这个<img>留下的layout的高度。而load图片的时间晚于layout计算就出现了这样的问题,浏览器以default的height来做布局。

W3School上的文档对<img>元素的width, height有这样的说明,建议尽量指定width, height。http://www.w3school.com.cn/HTML5/att_img_width.asp 。 但是像其它任何编程中一样,hard code带来的并不是最好的解决方法。有没有让我们灵活的计算<img>的height属性,并控制layout的方法呢?

请教了前端工程师朋友,找到了Masonry库的layout和sizing的方法,以及如何取得masonry instance的方法。

这样,解决方法是在<img>的onload()事件中调用masonry的layout()方法。这里注意的是masonry的instance是通过Masonry.data()这个方法取得的。data()这个方法是Masonry的,而不是masonry instance的方法。 代码如下:(官方文档 http://masonry.desandro.com/methods.html。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<script>
$(function(){
var imgs = $("img");
for(var i=0,len=imgs.length;i<len;i++){
// 取得masonry的HTML element
var container = document.querySelector('#container');
// 获得masonry instance
var msnry = Masonry.data( container );
// 在<img>的onload()中执行layout()
imgs[i].onload = function(){
msnry.layout();
}
}
});
</script>
来自CODE的代码片
lightshow_layout.js

问题解决!!

Good staff is as follows, when the page finishes loading, masonry failure and I do not know why, but I found a method that is masonry.reload.

This method works sometimes, I wonder why.

var $container = $('.container');
$container.masonry({
itemSelector: '.item',
columnWidth: 25 }).imagesLoaded(function(){
$container.masonry('reload');
});
asked Feb 5 '14 at 0:47
 

2 Answers

In the newer versions of masonry you use "reloadItems" instead of "reload". I ran across a tip on this thread that pointed me in the right direction.

.imagesLoaded(function(){
$container.masonry('reloadItems');
$container.masonry('layout');
});

玩转Masonry JS库来实现瀑布流Web效果的更多相关文章

  1. 用vue.js写的一个瀑布流的组件

    用vue.js写的一个瀑布流的组件:https://segmentfault.com/a/1190000010741319 https://www.jianshu.com/p/db3cadc03402

  2. android实现超酷的腾讯视频首页和垂直水平网格瀑布流一揽子效果

    代码地址如下:http://www.demodashi.com/demo/13381.html 先来一波demo截图 实现ListView.GridView.瀑布流 1.导入RecyclerView的 ...

  3. js中masonry与infinitescroll结合 形成瀑布流

    后台:(有点问题 page应该从1开始 而不是从0开始)     public function actionExperts()    {        $top=5;        $page=em ...

  4. Masonry + Ajax 实现无限刷新瀑布流

    效果就如我的个人站yooao.cc,把我实现的思路分享给大家. Masonry渲染页面如果有图片时需要imagesLoaded辅助,不然有可能会造成布局重叠. 一个大体的思路:前端取得最后一篇文章的i ...

  5. Masonry与AmazeUI结合实现瀑布流

    做一个图片列表展示,由于照片数量太多,决定用瀑布流来实现 由于之前没有接触过瀑布流,不知从何下手 百度一下大家都在用Masonry 官网 https://masonry.desandro.com/ 这 ...

  6. js实现图片的瀑布流

    先看效果: 初始状态:

  7. 利用JS实现简单的瀑布流效果

    哈哈, 我又来啦, 在这一段时间里, 我简单的学习了一下javascript(JS), 虽然不是很懂啦, 但是我也简单的尝试着做了点小东西, 就比如现在流行的瀑布流效果, 经过我的努力终于成功的完成了 ...

  8. 【js】【图片瀑布流】js瀑布流显示图片20180315

    js实现把图片用瀑布流显示,只需要“jquery-1.11.2.min.js”. js: //瀑布流显示图片 var WaterfallImg = { option: { maxWidth: 850, ...

  9. 分别用js和css实现瀑布流

    下午查找了瀑布流的相关原理,找了一些css3实现的还有js实现的,最后总结了一些比较简单的,易懂的整理起来 1.css3实现 只要运用到    column-count分列 column-width固 ...

随机推荐

  1. 数据库实例: STOREBOOK > 用户

    ylbtech-Oracle:数据库实例: STOREBOOK  >  用户 用户 1.返回顶部 1.1, 1.2, 2. 用户列表(用户状态=OPEN)返回顶部 2.1, DBSNMP 2.2 ...

  2. 游戏:贪吃虫(GreedyMaggot)

    该游戏类似于贪吃蛇,但可以在二维平面上以任意方向前进.当吃到食物手,食物会从虫头向虫尾移动,移到虫尾后,贪吃虫长度会增加.本来给它取名为贪吃蛆的,并且工程的英文名Maggot就是蛆的意思,后来想想有点 ...

  3. 微博与Redis系统技术文章记录

    Redis 持久化,有两种: rdb 和 aof, rdb是记录一段时间内的操作,一盘的配置是一段时间内操作超过多少次就持久化. aof可以实现每次操作都持久化. 这里我们使用aof. 配置方式,打开 ...

  4. iOS开发-数据选择UIPickerView

    UIPickerView开发一般选择区域或者分级数据的时候会使用到,类似于前端中用到树状结构,不过PC上一般都是从上到下的分级,使用UIPickView是从左到右实现,可以动态的设置UIPickVie ...

  5. css美化、优化、合并工具推荐

    其实很多时候,我们写完css规则之后,我们思考的无非就是3件事情: 验证 美化 压缩 当然无论是我们自己做这样的工具还是寻找一些比较好的成熟的工具,都有几个期望: 是否支持一些ie下的hack方式: ...

  6. jQuery EasyUI 教程-Tooltip(提示框)

    <!DOCTYPE html> <html> <head> <title>jQuery Easy UI</title> <meta c ...

  7. Android制作曲线、柱状图、饼形等图表——使用AChartEngine

    之前在java开发中实现图表使用JFreeChar组件,最近有个小项目要求在Android端进行数据分析,如何实现图表呢?查了一下google提供了一个开源组件Achartengine非常好用,可实现 ...

  8. 【系统】supervisor支持多进程

    [program:deployworker] directory = /etc/ansible/easyAnsible/app/deploy/ command = python Deploy.py p ...

  9. python下载文件的三种方法

    Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块. 当然你也可以利用ftplib从ftp站点下载文件.此外Python还提供了另外一种方法 ...

  10. 如何设置qt creator的快捷键

    如何设置qt creator快捷键 以设置设置edit - select encoding的快捷键为例 1. tools - options - environment - keyborad 2.在搜 ...