【发布时间】:2015-09-25 05:27:46
【问题描述】:
简介
我想使用 html、css、javascript (jQuery) 和近 1000 张图片构建一个网页。 html页面很长,大概5000px左右。
当用户滚动页面时,我希望图像像翻书一样作为页面背景播放。例如,如果有 1000 张图像并且用户滚动了 32% 的页面,他们将查看第 320 张图像。如果他们一直滚动,他们正在查看第 1000 张图像。
我应该如何有效地处理这个?每张图片的文件大小约为 150kb,最重要的是我希望避免进一步压缩这些图片。
我的尝试
-
永远不要从内存中删除图像
随着用户滚动加载更多图像,之前的图像设置为
display: none;。这种方法有效,但随着用户滚动的越来越远,变得非常滞后。 -
一次只能在内存中保存 40 张图像
当用户滚动当前图像时,会加载当前图像前后的 20 个图像。任何超过 20 次翻转的图像都将“从内存中删除”。 仍然变得迟钝(可能是因为我没有正确处理内存 - 我会解决的)
问题 1
你们建议我在这个项目中使用什么技术?
我觉得我的选项 2 应该是有效的,但我很想听听更多建议。
问题 2
如何正确地从 DOM 和内存中删除图像?
我很确定如果我希望这个项目成功,我将需要最终删除图像。
目前的做法
这是我目前的方法:
var imageNum = -The current image number that ought to be showing-;
var flip = -the container element holding all the images-;
flip.children().each(function(i, e) {
var jE = $(e);
var childInd = parseInt(jE.data('page-number'));
if (childInd < imageNum - 20 || childInd > imageNum + 20) {
jE.removeAttr('src');
jE.remove();
jE = null;
e = null;
}
});
这部分尤其是我不确定我是否正确释放内存的地方:
jE.removeAttr('src');
jE.remove();
jE[0] = null;
e = null;
经过一番谷歌搜索后,我将这些行放在一起。图像上没有事件处理程序,所以我很确定这不是问题。
如何让 GC 收集图像内存?我正在做的事情足够让 GC 从这些图像中释放内存吗?
【问题讨论】:
-
在 JS 中没有“已知或一致”的强制垃圾回收方式。您只需要确保清除对对象的所有引用,以便它们可以被垃圾收集。为此,
jE.remove();周围的行基本上没有用,因为它们只清理本地范围。jE.remove();是您唯一需要的。您是否在 chrome 或 safari 中对应用进行了分析,以查看内存是否是您的问题? -
感谢您的评论,我知道 - 我在倒数第二段中做了一个小修改以澄清!
-
你能在你将图像插入 DOM 的位置发布代码吗?
-
从 DOM 中删除和重新插入图像可能会比添加它们一次花费更多的内存......另外,你应该看看 LazyLoading
-
对于那些想知道的人,我已经自己解决了这个问题。我使用了多个 元素,这导致了延迟。将图像加载到新的 Image() 对象中,然后仅更改单个 上的 src 属性就解决了我的问题。
标签: javascript jquery html css optimization