移动端三合一瀑布流插件(原生JS)
瀑布流形式的图片布局方式在手机等移动端设备上运用广泛,比较常见的是下面前两种:
一、等宽等高
这种形式实现起来非常容易,这里就不再多说。
二、等宽不等高
这种形式算是比较正统的瀑布流布局形式,关于如何实现的请参考之前的一篇博文——jQuery瀑布流详解。
三、等高不等宽
在之前的工作中接触到了这种形式的瀑布流,它的主要特点是:同一行的两张图片高度相等,宽度不等,且宽高比与原图近乎一致(没有拉伸变形)。但是不同行的图片高度不一定相等,下面就介绍下它的实现方式。
这里先说一组中两张图片的比例算法。
首先,还是需要两张图片的宽和高或者高宽比,比如一张是高宽比比较大(瘦)的图,另一张是高宽比比较小(胖)的图。
如果两张图片最终需要并列在同一行,并且拥有相同的高度,那么图片所占该行的宽度,就与其高宽比成反比。即瘦的图占宽度小,胖的图占宽度多。
举个例子:
左图高宽比为2:1 (2),右图高宽比为1:2 (0.5)
他们的高宽比之和为2.5,那么左图的宽度比应该是较少的那部分 (0.5 / 2.5),右图的宽度比应该是较多的那部分 (2 / 2.5)。
也就是左图宽应为容器的五分之一,右图为五分之四。
那么高度就是图片的宽度乘以其高宽比,为了响应式这里都不使用像素而使用百分比,为了使高度与宽度保持比例,所以不使用 height,而用 padding-bottom 挤出来。原理见jQuery瀑布流详解。
正确结果:
下面我们通过一个实际的例子来试验下这个算法:
左图的尺寸为 480*800,右图的尺寸为 500*311。
主要阐述下算法,代码表达个大意:
var rate1 = 800 / 480,
rate2 = 311 / 500,
totalRate = rate1 + rate2,
width1 = rate2 / totalRate * 100, // 27.2
width2 = rate1 / totalRate * 100, // 72.8
height = width1 * rate1;
return '<div style="width: '+width1+'%; padding-bottom: '+height+'%"></div>'+
'<div style="width: '+width2+'%; padding-bottom: '+height+'%"></div>';
即左图占72.2%,右图占72.8%。高度因为一致,只用计算其中一个就好。看下结果:
破费?还没,我们需要两张图之间有个间隙,假如这个间隙为容器宽度的2%
width1 = rate2 / totalRate * 98;
width2 = rate1 / totalRate * 98;
这样在计算两张图所占宽度比的时候就会先减去间隙,间隙的生成可以设置左图的 margin-right,也可以直接将右图向右浮动。
由于该插件是基于原生 JavaScript,所以我们得实现几个 jQuery 中的函数。
选择器
因为该插件的选择器唯一作用就是选中容器元素,所以只实现一个简易版的即可。
function selector(ele) {
if (!ele) {
return;
}
return document.querySelector(ele);
}
extend函数
该方法是用来合并对象的,在插件中它的主要作用是合并参数,将使用者传入的参数覆盖默认参数。
function extend() {
var args = Array.prototype.slice.call(arguments),
len = args.length,
obj = null, i; for (i = 0; i < len; i ++) {
if (typeof(args[i]) !== 'object') {
break;
}
if (i !== 0) {
for (var o in args[i]) {
if (args[i].hasOwnProperty(o)) obj[o] = args[i][o];
}
} else {
obj = args[0];
}
} return obj;
}
var result = extend({color: red}, {color: blue});
console.log(result); // {color: blue}
调用方法
1. 引入 wf.css 和 wf.js 文件。
2. 通过 WaterFall 构造函数实例化,通过 create 方法生成瀑布流。
var waterFall = new WaterFall('.content', {
type: 2,
urlField: 'picUrl'
});
waterFall.create(dataArr);
由于 create 方法实际是通过 appendChild 来添加DOM元素的,所以分页加载时只需要再次调用create方法并传入新的数据即可。
3. 插件支持AMD等模块化引用。
参数 (param)
type —— 瀑布流类型,默认1
1:等高等宽型,2:等宽型,3:等高型
urlField —— json中图片地址的字段,默认为 'url'。比如你接收到的数据中字段叫 'picUrl', 传入该值会使对象的属性名进行映射,下同
widthField —— json中宽度的字段,默认为 'width'
HeightField —— json中高度的字段,默认为 'height'
PS:TI6 西恩刀塔加油,小红本我就不买了:)
移动端三合一瀑布流插件(原生JS)的更多相关文章
- 一款很实用的jQuery鼠标悬浮有动画效果的响应式瀑布流插件
一款很实用的jQuery鼠标悬浮有动画效果的响应式瀑布流插件 在线预览 下载地址 实例代码 <!doctype html> <html lang="zh"> ...
- 利用jQuery来扩展一个瀑布流插件
简单了解jQuery.fn.extend() jQuery.fn.extend()函数用于为jQuery扩展一个或多个实例属性和方法(主要用于扩展方法). (截图来自jQuery文档) 为了更清晰 ...
- 8款实用的Jquery瀑布流插件
1.网友Null分享Jquery响应式瀑布流布局插件 首先非常感谢网友Null的无私分享,此作品是一款响应式瀑布流布局Jquery插件,网友Null增加了一个屏幕自适应和响应式,响应式就是支持智能手机 ...
- jQuery插件之-瀑布流插件
jquery.wookmark.js 一个实现瀑布流自适应宽度布局的jQuery插件—jquery.wookmark.js , wookmark使用非常简单到只需要一句代码就能实现,除此之外,当页面宽 ...
- 自定义基于jquery竖向瀑布流插件
公司新项目做了一个关于图片的板块,网上找了一些瀑布流插件都不是很适合自己,于是就自己造轮子写一个,并封装成插件github 于是就想分享一下,主要是为了更好的学习与记忆. 如果大家进来了,希望能给我g ...
- 响应式瀑布流插件Grid-A-Licious
Grid-A-Licious是一款遵守MIT协议的响应式瀑布流插件.该插件总代码行不超过400行,实现很巧妙,使用时也很流畅.实现原理也很简单,根据屏幕宽度和参数中设置的列宽度以及每项之间的间隔宽度, ...
- jQuery动态网格瀑布流插件Masonry
Masonry是一款非常强大的jQuery动态网格布局插件,可以帮助开发人员快速开发瀑布流界面效果.和CSS中float的效果不太一样的地方在于,float先水平排列,然后再垂直排列,使用Masonr ...
- jquery.masonry瀑布流插件的4个使用步骤
1.分别加载jquery插件与jquery.masonry插件两个文件 下载jquery插件:http://jquery.com也可以引用google的cdn外部jquery核心库JS文件下载jque ...
- 瀑布流插件|jquery.masonry|使用demo
Maonsry+Infinite-Scroll实现滚动式分页,网上有很多,这里只说: 瀑布流插件的一个基本使用,附上基本功能的demo <html> <head> <me ...
随机推荐
- Linux下查看端口,强制kill进程
1.查看8088端口被哪个进程占用:netstat -apn | grep 8088 2.强制kill某一进程:kill -s 9 1827
- sudo控制权限简单用法介绍
为了安全及管理的方便,可将需要用root权限的用户加入到sudo管理,用root的权限来管理系统.利用sudo控制用户对系统命令的使用权限. 普通用户可以查看,但不能删除: 但是在/tmp公共环境下可 ...
- git 命令行下浏览器tig使用记录
git 命令行下浏览器tig使用记录 tig 是一款优化 git 命令行的工具,使 git 命令行更加的便捷人性化 .如果用习惯了,会上瘾. 以下是一些使用记录: 安装成功后,在 Repo 文件夹下, ...
- SDN2017 期末作业验收
GIT仓库:GITHUB 负载均衡程序 拓扑如图 目的 实现一个负载均衡的北向程序: 服务器host 2 ,host 3,host 4上各自有不同的服务,host 1是客户端 当host 2,host ...
- BZOJ1458:士兵占领(有上下界最小流)
Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放 ...
- 3675: [Apio2014]序列分割
Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...
- C#实现之(自动更新)
做开发的人,尤其是做客户端(C/S)系统开发的人都会遇到一个头疼的问题,就是软件的自动更新:系统发布后怎样自动的更新程序,在下有幸开发过一个自动更新程序,更新程序与任何宿主程序是完全独立的:只要在主程 ...
- 随手练——HDU 1078 FatMouse and Cheese(记忆化搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=1078 题意: 一张n*n的格子表格,每个格子里有个数,每次能够水平或竖直走k个格子,允许上下左右走,每次走的格子 ...
- etcd管理
操作etcd有命令行工具etcdctl,有两个api版本互不兼容的,系统默认的v2版本,kubernetes集群使用的是v3版本,v2版本下是看不到v3版本的数据的,我也是找了些资料才了解这个情况. ...
- 【测试123】ISTQB AL
近一年时间加强了金融领域基础知识,希望能顺利获得FRM认证. 接下来因为工作需要,在测试工程师的角色上有所深入发展. 仔细想了下,一是管理上的角色转换,如何协调各个不同测试级别,以及如何成为一个称职满 ...