【问题标题】:How do I hide images that are outside of the viewport [duplicate]如何隐藏视口之外的图像[重复]
【发布时间】:2012-03-21 16:09:00
【问题描述】:

我正在编写一个在滚动时会自动加载新内容的网站(如 Facebook 墙)。每个内容项都有一个图像,在同一页面上甚至可以有 1000 多个图像。为了提高性能,我想将display:none 添加到视口外的图像中。我无法将内容分页!

我已经写好了剧本。当用户到达底部时,它会加载 X 个新项目。

我的问题是,在 60 多张图片之后,浏览器会变得迟钝。

【问题讨论】:

  • display:none 不会真正有帮助,因为仍然会加载图像。您应该尝试仅在达到某个滚动位置时才加载图像。
  • 当您将不在视口中的内容设置为 display:none 时,您会遇到另一个问题。它永远不会出现在视口中,因为它没有被渲染出来并且你不能滚动到它。
  • 您确定,这会有所帮助吗?浏览器(至少,FF10)不会处理视口之外的元素。
  • 与此非常相似(如果不重复):stackoverflow.com/a/7371483/786814
  • 请看我评论yunzens的回答。 @sven:它在一个固定高度的容器中,所以不会影响

标签: javascript jquery html css


【解决方案1】:

要回答您的实际问题,您可以遍历所有元素的位置,以确定它们是否在基于滚动位置的当前视口内。

唯一的问题是,您需要遍历 DOM 树以确定其实际位置的每个图像,如果您有 100 多个图像,则对每个图像执行此操作会消耗更多内存,然后将 100 多个图像留在原处。

我理解这种担忧,但除非您对此有实际的性能问题,否则我会保留它。

【讨论】:

  • 我明白了。好吧,您可以在图像容器上设置一个属性来确定其创建时的位置,这样您就不必每次都遍历树进行查找。然后只需绑定滚动并确定图像容器顶部是否位于 scrollTop 和 scrollTop + window.offsetHeight 之间。如果没有,你可以隐藏它。您需要找到一种方法来检测用户何时停止滚动,而不是每次滚动时都弹出。
【解决方案2】:

如果图像被加载,它们无论如何都必须在本地客户端内存或缓存中,占用资源,你无能为力。

但是如果它们现在没有显示,浏览器无论如何都不会渲染它们,所以没有任何资源可以通过将display:none 设置为图像来保存。

我假设您知道您必须通过 Javascript 按需加载图像,而不是在页面初始加载时加载,否则您的页面将永远加载。

【讨论】:

  • 这与内存无关,而与滞后有关。超过 60 张图片滚动变得迟钝。已经尝试过 display: none,它工作得很好。
【解决方案3】:

编辑1

第二次尝试:
这是一个切换功能:
http://jsfiddle.net/HerrSerker/LzGGd
把它和我的其他小提琴混合在一起


HTML

<div data-tagname="img" data-src="http://lorempixel.com/300/200/sports/2" data-width="300" data-height="200" style="width:300px; height: 200px">Click on it</div>

jQuery

​​>
$(function() {

    $.fn.makeImg = function() {
        var img = $('<' + $(this).data('tagname') + ' class="toggle" src="' + $(this).data('src') + '" width="' + $(this).data('width') + '" height="' + $(this).data('height') + '">')
        $(this).replaceWith(img)
    }

    $.fn.makeDiv = function() {
        var div = $('<div data-tagname="img" data-src="' + $(this).attr('src') + '" data-width="' + $(this).attr('width') + '" data-height="' + $(this).attr('height') + '" style="width:' + $(this).attr('width') + 'px; height:' + $(this).attr('height') + 'px;">')
        $(this).replaceWith(div)
    }

    $('img.toggle').live('click', function() {
        $(this).makeDiv()    
    })
    $('[data-tagname="img"]').live('click', function() {
        $(this).makeImg()

    })
})​

原创

如果您像 facebook(或 twitter)那样做,您应该使用 JavaScript 检查窗口的 scrollTop。
如果 scrollTop 比整个窗口高度减去正文高度小 200 像素,则启动一个 AJAX 请求以加载在当前 HTML 之后添加的新 HTML。在此之前不会加载图像。

在这里(http://jsfiddle.net/HerrSerker/QhMe5/,使用 jQuery)你可以找到一个演示(没有 AJAX 部分)。 如果您向下滚动并且只有 200 像素向左滚动,它会附加到正文(一些 HTML)。

【讨论】:

  • 你不懂我。例如,对于第一页加载,它会加载 20 张图像。如果用户向下滚动,它会加载另一个 20。向下滚动并再次滚动 20,依此类推。所以会的。我的问题是,在 60 张图片之后,浏览器会变得迟钝。
  • 你做不到。 display: none 不会停止加载图像。您当然可以尝试让前 20 张图像成为真实图像,然后其他图像是具有数据属性的 div(data-src=[img src here] data-width=[image width hre] data-height=[image height here ])。如果它们滚动到视图中,您可以让 jQuery 使用数据转换图像中的 div
  • 我不想停止加载图像!只想隐藏已加载的超出视口的图像。哪些已经被用户滚动过...
  • 嗨!您可以使用 display:none 分享您的解决方案吗?我需要将它用于带有 uiwebview 的 iOS 应用程序!
猜你喜欢
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 2015-06-09
  • 2014-06-06
  • 2017-07-12
  • 2017-06-15
  • 1970-01-01
  • 2017-01-05
相关资源
最近更新 更多