玩转Masonry JS库来实现瀑布流Web效果

工作项目中需要制作个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

问题解决!!

时间: 2024-08-28 16:38:28

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

Masonry与AmazeUI结合实现瀑布流

做一个图片列表展示,由于照片数量太多,决定用瀑布流来实现 由于之前没有接触过瀑布流,不知从何下手 百度一下大家都在用Masonry 官网 https://masonry.desandro.com/ 这是某网站提供的一个demo  http://www.jq22.com/yanshi10136 看了一下它的代码,由于本人是小白,感觉实现起来很复杂,决定找别的解决方案 网站框架用的是妹子UI,有没有结合妹子实现的瀑布流呢. 这里是AmazeUI某插件官方提供的一个demo  http://amaze

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

哈哈, 我又来啦, 在这一段时间里, 我简单的学习了一下javascript(JS), 虽然不是很懂啦, 但是我也简单的尝试着做了点小东西, 就比如现在流行的瀑布流效果, 经过我的努力终于成功的完成了, 虽然中间非常的坎坷, 并不是一帆风顺但是最终我还是实现了个简单的效果, 下面就为大家简单的介绍下, 不知道的友友们, 有兴趣的话, 可以来参考下, 欢迎指出缺点和不足! 一.瀑布流之准备工作   首先声明下, 为了方便演示和联系, 我使用的是本地图片, 如果大家有需要的话可以尝试着写下网络的,

js实现图片的瀑布流

先看效果: 初始状态: 瀑布流效果: 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title&g

js实现响应式瀑布流

导读:瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早采用此布局的网站是Pinterest,逐渐在国内流行开来.国内大多数清新站基本为这类风格,像花瓣网.蘑菇街.美丽说等. 最近在好多地方看到瀑布流的字眼,感觉真的很不错,于是就想自己能不能写一个呢,而且是响应式的.经过将近两天的研究,终于写出来了,先传几张图给大家看看最终的效果:      随着浏览器页面的大小调整.布局从四列逐渐变成三

瀑布流页面效果

瀑布流页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>瀑布流布局</title> <script src="./jquery.js"> </script> <style> #all{ position: relative; } .box{ fl

使用RecyclerView实现瀑布流的效果

主函数: public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private List<String> dataList = new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceS

bootstrap+masonry.js写瀑布流

最近在用bootstrap写一个网站,其中有个图文展示的页面要用到瀑布流的效果.因为项目要求,项目要以bootstrap为基准,不准私自添加内联样式.内部样式,所以,自己写瀑布流就不行了,所以,根据要求,百度查找相关资料,看到masonry.js.个人认为这是一个非常好用的瀑布流插件.下面说一下我在引用的过程中遇到的问题,一开始我用bootstrap栅格系统布局,代码如下 <div class="row masonry"> <div class="col-x

JS原生方法实现瀑布流布局

html部分(图片都是本地,自己需要改动图片) p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 30.0px Consolas; color: #2b7ec3 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 30.0px Consolas; color: #d74200 } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 30.0px Consolas; col

一步步教你js原生瀑布流效果实现

一步步教你js原生瀑布流效果实现 什么是瀑布流效果 首先,让我们先看一段动画: 在动画中,我们不难发现,这个动画有以下特点: 1.所有的图片的宽度都是一样的 2.所有的图片的高度是不一样的 3.图片一张挨着一张竖直排列 4.鼠标向下滚动,一直不停的加载图片 5.浏览器的宽度改变,图片的列数会进行相应的更改 那么这种效果类似现实生活中的瀑布,所以我们叫它瀑布流的效果. Js原生瀑布流效果的实现 从上述分析中,我们可以把整个效果分为以下四个部分: html+css界面搭建 瀑布流效果 浏览器向下滚动