【转】关于WaterFall瀑布流式布局的性能优化

市面上已存在的瀑布流式布局的网站:
拼范网:http://www.pinfun.com/
迷尚网:http://www.mishang.com/
凡客达人:http://star.vancl.com/
美丽说:http://www.meilishuo.com/
蘑菇街:http://www.mogujie.com/welcome/
淘宝哇哦:http://wow.taobao.com/
IDsoo:http://idsoo.com/
Topit:http://topit.me/
Mark之:http://markzhi.com/
布兜:http://www.budou.me/
堆糖:http://www.duitang.com/
花瓣:http://huaban.com/
码图网:http://www.markpic.com/popular/
新鲜网:http://www.xinxian.com/
易惊喜:http://www.ejingxi.com/

这两年瀑布流式布局已小有规模,对于浏览器性能问题是个挑战。
瀑布流目前已知有三种实现方式,[我喜欢]采用的是绝对定位的方式进行瀑布流计算。总结一下性能中注意的几点:

要点一:
对于瀑布流式图片布局性能起决定性作用的是img标签必须指定height(width在瀑布流式布局中一般是固定的):
网页的加载顺序是dom会优先加载完成,然后加载远程文件包括图片。绝对定位方式在dom加载完成后会进行计算,然而此时如果没有为img标签指定width与height,会等到图片加载完成浏览器才会渲染出整个元素的高度。所以在dom加载完成之后计算的元素高度是不正确的,确切的说是没有图片的高度的。

要点二:
Ajax动态插入瀑布元素

\

当通过ajax获取到新数据之后如何追加到当前瀑布流中呢?
起初为了性能优化打算轮循把元素插入到页面各列中,但是页面中的图片高度是不定的,很容易出现高度很高的图片,会留有很不和谐的多余空白,可兼容性差。
最后采用的第二步方案,实时获取元素底部最高的元素轮循插入。即上图中的第2列优先获得插入元素的权利,完成插入后再计算底部最高的元素。
这时就需要性能优化,我们不能每次都动态去取每个元素底部的高度,可以把六个列的值放在一个数组中,依次记录着每列的最后元素的底部高度。再进行对比计算,算出最小高度进行插入。
PS:为性能优化,插入动态数据时轮循的是动态要加入的元素,而非整个页面的所有元素。

要点三:
Dom元素相关的数据重复计算?
当页面Dom加载完成后,获取瀑布流父元素的宽度,根据元素的宽度和间距,计算出有几列,各列绝对定位的left值等…这些数据都要缓存在内存变量中。不是每次执行瀑布流操作都去动态获取计算的。

要点四:
删除中瀑布流中的元素,如何重新排列?
此次版本中删除某个瀑布流元素后,是重新排列页面中所有的元素,虽然封装的方法很简便,但是这样是不够优化的。
后期计划,删除某列中的某个元素, 此列被删除元素下面的元素重新计算排列,减少性能消耗,达到优化。

要点五:
关于改变窗口大小,动态排列
在改变窗口大小的过程,由于onresize在IE多个版本下会有多次触发,每触发一次,瀑布就会重新排列一次,重复执行浪费了性能。
因此在onresize事件中添加延迟优化处理

此版本还有许多细节及优化没有来得及时间处理,后期我们会跟进。希望大家喜欢这个项目,有什么意见请联系我们。
随后我们会将优化QWrap的这个WaterFall扩展组件,提供给QWrap用户使用,丰富组件。

在此感谢QWrap库开发者们的辛勤付出,让开发者有了更多的选择,节省了开发时间,达到敏捷开发。

 

—–20120224更新-添加删除瀑布流元素整列重新排序(↑要点四)———————————————————————————————-
使用方法见Demo可组件js文件,由于没有指定图片高度,所以瀑布流事件是在页面完全加载之后触发的。

Demo地址:http://www.im9527.com/archives/8

转载于:https://www.cnblogs.com/miss-radish/p/3641876.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软OTech第二次会议(广州站)

很荣运又有机会参与微软的活动,也很高兴能加入到旨在促进Office技术交流的俱乐部(OTEC),在这里让我对Office有了更深入的理解,目前的Office远非以前Office所能比拟。也远不止简单的Word、Excel电子文档表格办公自动化这些功能。目前中国大陆O…

Work Tips

目录IAR环境下,使用Live Watch实时监控变量值IAR替换mcu库Linux中删除swp文件使用J-Link通过SWD接口直接下载.hex文件和.bin文件到MCU(下载J-Flash软件)linux设置时间命令Jlink无法识别排查方法IAR环境下,使用Live Watch实时监控变量值 循环放在数组里&…

ECMA6--字符串/数组

字符串 新增两个字符串方法 startsWith&#xff08;&#xff09; 字符串首开通检测 endsWith&#xff08;&#xff09; 后缀名检测 includes &#xff08;&#xff09; 字符串中是否包含 字符串模板 数组 let title 头部 let content 内容 let a <div>\<p>titl…

[总结]DataGrid 固定表头实现(纵向和横向滚动条滚动,而Header不动)

1.用Css来定制DataGrid表头HeaderStyle的cssclass属性.fixTitle{ /*background: navy; color: white;*/ position: relative; top: expression(this.offsetParent.scrollTop);} 1<DIV style"Z-INDEX: 102; LEFT: 264px; OVERFLOW: auto; WIDTH: 184px;TOP: 128px; HEIG…

Fedora 20 安装后的一些事情

1、关闭selinux 可以在软件中,找到selinux管理工具:system-config-selinux.py 2、安装源 可以通过# ls -l /etc/yum.repos.d 查看现有的安装源,另外还可以给一些其他软件源&#xff1a; 添加remi,Remi repository 是包含最新版本 PHP 和 MySQL 包的 Linux 源&#xff0c;由 Rem…

STM32使用SPI通信驱动2.4G无线射频模块发送数据

目录SPI介绍SPI接口原理SPI工作原理SPI特征引脚配置结构体库函数SPI配置过程SPI.hSPI.cNRF24L01无线射频模块NRF24L01厂家驱动代码移植NRF24L01.hNRF24L01.cmain.c串口打印调试SPI介绍 SPI接口原理 SPI工作原理 SPI特征 引脚配置 结构体 库函数 SPI配置过程 SPI.h #ifndef __…

1.Rabbitmq学习记录《本质介绍,协议AMQP分析》

1.RabbitMQ是一个由erlang开发的AMQP&#xff08;Advanced Message Queue &#xff09;的开源实现。 RabbitMQ的优势-: 除了Qpid&#xff0c;RabbitMQ是唯一一个实现了AMQP标准的消息服务器&#xff1b; 可靠性&#xff0c;RabbitMQ的持久化支持&#xff0c;保证了消息的稳定性…

“Unamed VM”无法初始化 0x80070539

当我们重新安装Windows Server 2012 R2以后&#xff0c;之前Hyper-V的虚拟机没有进行导出&#xff0c;那么我们重新导入虚拟机成功以后&#xff0c;启动它遇到了如下错误&#xff1a; 那么怎么办呢&#xff1f;用下面的poweshell命令就可以解决 Grant-VmConnectAccess -usernam…

要回家了,想到以后..

过几天就要回家了,剩下的工作还有一点没有完成.不过已经是无关大碍了.突然有种很烦的感觉.想想这个暑假的时间里面自己也算是经历不少了,可是回忆一下自己到底收获了什么,脑子里面却是一片空白,什么都想不到.本来是要动笔写篇"我的深圳之行"之类的东西的,可是却没有一…

JSON数据格式解析库(cJSON、Jansson)的使用在STM32上移植和使用

json | json-c使用入门 这篇讲的也不错&#xff0c;抽空看下(网络传输json数据) https://www.bilibili.com/video/av669454528?p3&spm_id_frompageDriver 目录轻量级C语言JSON解析库1.JSON与cJSONJSON —— 轻量级的数据格式JSON语法规则cJSON2.cJSON数据结构和设计思想3.…

cytoscape操作经验

1.cytoscape批量修改节点属性&#xff1f;首先要创建一个节点属性文档&#xff08;.txt),比如说drug1 1drug2 1complex1 0complex2 0第一列是名字&#xff0c;第二列是属性&#xff0c;用空格分开&#xff1b;然后导入节点属性&#xff0c;在Vizmapper中下拉的visual mapping b…

[ZJOI2007]棋盘制作 悬线法dp 求限制下的最大子矩阵

https://www.luogu.org/problemnew/show/P1169 第一次听说到这种dp的名称叫做悬线法&#xff0c;听起来好厉害 题意是求一个矩阵内的最大01交错子矩阵&#xff0c;开始想的是dp[2000][2000][2]维护这个位置向上向左扩充的矩阵最大长度之后n扫一遍&#xff0c;但是写起来发现并不…

TEA、XTEA、XXTEA加密解密算法

参考&#xff1a;TEA、XTEA、XXTEA加密解密算法 地址&#xff1a;https://blog.csdn.net/gsls200808/article/details/48243019 其他相关博文链接&#xff1a;tea系列加密算法学习笔记、TEA和XxTEA跨平台加密算法 XXTEA可以直接加密解密字符串吗&#xff1f; 如果是字符串加密&…

用户自定义的数据库备份(选自csdn\blog)

用户自定义的数据库备份 备份类型 备份方法 示例 数据文件 操作系统命令或工具 C:\COPY datafile1.ora datafile.bak 归档重做日志文件 操作系统命令或工具 C:\COPY log_01_23.arc log_01_23.bak 控制文件 SQL命令 SQL>ALTER DATABASE BACKUP CONTROLFILE TO confile.bak; …

WIFI 配网方式(AP模式、Smartconfig等模式)

参考&#xff1a;智能设备WIFI配网方式汇总 地址&#xff1a;https://blog.csdn.net/beauytlife_1985/article/details/87539350?spm1001.2014.3001.5502 参考&#xff1a;Wifi设备配网问题 地址&#xff1a;https://blog.csdn.net/boazheng/article/details/90906184 目录概述…

动态显示产品信息

为什么80%的码农都做不了架构师&#xff1f;>>> 今天做了个产品介绍的功能,想到只是简单的显示信息实在是无聊,那就让它动态的一个一个显示出来好了. 效果展示:http://runjs.cn/detail/topt9b26 主要的代码如下 html: info里面保存着产品的信息. <div id"c…

ALGO-162——Airport Configuration

问题描述&#xff1a;ACM机场是一个本地机场&#xff0c;对于大多数人来说&#xff0c;机场不是他们的终点或起点&#xff0c;而是中转站。机场有一个规划图。到达的大门在机场的北边&#xff08;相当于空格&#xff09;。出发的大门在机场的南边&#xff08;也相当于空格&…

CRC校验及C语言实现

摘自&#xff1a;CRC校验原理及其C语言实现 地址&#xff1a;https://blog.csdn.net/whik1194/article/details/108837493?spm1001.2014.3001.5502 什么是校验算法 最近的工作中&#xff0c;要实现对通信数据的CRC计算&#xff0c;所以花了两天的时间好好研究了一下&#xff…

额,你在main.xml中加了一个id以后,要右键点save,才会将这个id加入到R中,否则是没有的。。。R里的东西是程序自动生成的~~~...

我修改了 main.xml 然后我在主函数中调用main里面的东西 例如在main.xml加了一个id 我在主函数用 R.id老是调用不出来 如何才能快速的准确的调用出 main.xml里面的东西呢? 额&#xff0c;你在main.xml中加了一个id以后&#xff0c;要右键点save&#xff0c;才会将这个id加入…

讲二次搜索树转化为排序的双向链表

package com.gylhaut.bean;public class TreeNode<T> {public T data;public TreeNode left;public TreeNode right;public TreeNode(T data) {this.left null;this.right null;this.data data;} }算法实现&#xff1a; package com.gylhaut.util;import com.gylhaut.…