如何避免溢出的性能成本:隐藏?

时间:2012-05-15 22:54:24

标签: html css performance optimization html-table

我有一个HTML表,可以超过1K行和十几列。

我希望列是固定大小(可由用户控制),而不是垂直或水平增长/缩小。因此,在视觉上,特定表格单元格的内容将在一行上,并且溢出在单元格的末尾被切断。

在大型桌面Chrome中进行效果分析,主要的性能杀手是溢出:隐藏

我已经尝试将每个单元格的内容放在输入中,因为这会复制相同的视觉行为,但这会产生类似的性能影响。

人们建议如何提高绩效?

如果有必要,我不必使用表格标签,但如果可以获得良好的性能,则更愿意坚持使用表格标签。

更新1 :我添加了一个演示性能问题here的文件。警告文件相当大(25MB)并且会降低计算机速度。默认情况下,表没有溢出设置为隐藏,并且一旦表已加载(可能需要一段时间)浏览器性能相对顺利。

但是,如果您编辑文件并取消注释第12-15行,然后将其打开。你会看到加载桌面后的浏览器响应速度明显较慢。

4 个答案:

答案 0 :(得分:3)

仅供参考:我在iPad / iOS上遇到了这个问题,导致表格布局中有大约一百行的页面存在性能问题:固定。

一旦一个单元格或一个单元格中的div获得一个强制它单独绘制单元格的属性,它就需要大约300毫秒而不是100毫秒来绘制(这会导致UI对我的情况感到非常缓慢)。

两个属性(position:relativeoverflow:hidden)中的任何一个导致了我的问题,删除它们优化了速度,但如果单元格文本对于固定宽度列而言太宽,则会导致文本溢出。

即使在绘制表格之后,也会发生减速,因为我动态地在表格中弹出一个绝对的div。在对javascript进行概要分析时(使用(new Date).getTime()),在javascript中与表无关的地方测量速度减慢。

[编辑:添加以下作为部分解决方案]

  1. 将所有单元格内容放在span元素内(因此可以测量内容的offsetWidth而不是包含块元素的宽度)。
  2. 将行追加到文档中后,测试每个span.offsetWidth是否大于列宽,如果是,则将“overflow:hidden”添加到包含块的样式(或通过类)。
  3. 对于某些列,可以跳过上面的1和2(如果已知单元格内容永远不需要裁剪)。
  4. 注意事项:

    1. 仅针对iOS5 Safari进行测量(我没有介绍任何其他浏览器)。
    2. 为我们工作,因为我们动态创建表行(使用javascript处理你的例子会很慢?)。
    3. 我们数据的大多数单元格不会溢出(只需要稀疏地剪切 - 只有有限数量的单元格。)
    4. 妥协的初始页面加载(页面中表格的生成从80毫秒到800毫秒)。
    5. 但是加快了动态组合弹出窗口(340ms到130ms),提供了更好的键盘响应能力。
    6. 根据您的情况,可能会快速首先使用可变宽度列,测量所有列的offsetWidth,将列宽设置为像素宽度并设置溢出:仅在列的offsetWidth大于您将使用的像素宽度的列上隐藏用于列。

答案 1 :(得分:2)

您可以尝试使用平铺方法。这是一种非常典型的方法,可以有效地制作无限可侧滚动游戏。

将所有数据放入Javascript数组中,然后在一个有N行可见的表中有N + 1行。向下滚动时,最后一项将移动到视图中。在您滚动得足够远以使第一个项目移出视图的那一刻,您将所有数据向上移动并将滚动位置重置回它开始的位置。如果操作正确,转换将对用户完全透明。您只能在N行可见表中使用N + 1行。

我以前做过这个,但是在非常具体的UI限制下。考虑到使用内置的浏览器滚动条等使其保持一致,我有点快门。

答案 2 :(得分:1)

首先,拥有一个表所需的标记量比仅使用带有clear的div要大得多:两个css都是新行。所以这是第一次表演。

另外,您将溢出设置为类(?)

 <style type="text/css"> .ovfl { overflow:hidden; }</style>

  <td class="ovfl"></td>

另外,1000行是一个重量来传递。

对于div,你至少有一个更容易的机会将那些看不见的东西(在滚动之外)扔到一个带有 display:none 的div中,直到访问者滚动到它们。

很少有皮肤可以接受这项工作,

希望有一些好主意。

答案 3 :(得分:1)

Webkit bug 75001与此问题有关,它涵盖了解决问题的工作(另请参阅bugzilla依赖关系以获取信息)。