【问题标题】:Performance of DOM manipulation for Responsive Web Design响应式网页设计中 DOM 操作的性能
【发布时间】:2014-10-06 20:30:14
【问题描述】:

我想问你,使用 jQuery 的 append() 方法(以及其他类似的方法,如 prepend()remove())来进行 DOM 操作以使网站响应是一个好主意吗?它如何影响性能?

示例:

我有一个菜单(包含数百个链接的非常大的多级菜单),它显示在桌面页面的顶部。但它需要在移动设备上完全不同的位置显示。

解决方案 1:

实现这一点的最简单方法可能是多次包含菜单,然后使用 CSS 媒体查询 使用 display: none; 隐藏一个菜单并使用 display: block; 显示另一个菜单:

<div id="menu-desktop-container">
    <div class="menu">...</div>
</div>

<!-- ...Here's some other HTML between both positions of the menus -->

<div id="menu-mobile-container">
    <div class="menu">...</div>
</div>

这里的 CSS:

#menu-desktop-container { display: block; }
#menu-mobile-container { display: none; }

@media only screen and (max-width: 768px)
{
    #menu-desktop-container { display: none; }
    #menu-mobile-container { display: block; }
}

但它有很多缺点。例如。菜单真的很大,所以包含两次会使页面几乎扩大两倍。这会影响性能并增加加载时间(尤其是在连接速度较慢的移动设备上)。此外,它可能对 SEO 非常不利,所有链接都是重复的。

解决方案 2:

其他解决方案是只包含一次菜单,然后使用 jQuery 的 append() 方法将其移动到适当的容器中。这是 HTML 标记(现在它更简单,因为菜单没有重复):

<div id="menu-desktop-container">
    <div id="menu">...</div>
</div>

<!-- ...Here's some other HTML between both positions of the menus -->

<div id="menu-mobile-container"></div>

如果屏幕很窄,我可以使用 jQuery 将菜单移动到移动容器:

$("#menu-mobile-container").append( $("#menu") );

如果屏幕很宽,我可以将菜单移回默认桌面容器:

$("#menu-desktop-container").append( $("#menu") );

我更喜欢append() 方法的解决方案,但我有一些顾虑:

问题

  1. 它如何影响性能?
  2. 它可以在移动设备上正常工作吗?
  3. 它适用于所有浏览器吗?
  4. 它可以在旧版本的 Internet Explorer 中运行吗?
  5. 在开始使用此方法之前,我还应该注意哪些其他缺点?

【问题讨论】:

  • 重要的是要记住,大多数人不会为了好玩而不断调整页面大小......至少在他们第一次这样做之后。如果是这种情况,最好使用 js 方式,因为移动可能永远不会发生。如果您希望人们一直在调整大小,那么最好只在开始时包含带有 css 的菜单。在我看来,您的问题或多或少来自糟糕的设计。答案甚至可能是一种意见,我不确定是否有最好的方法来做到这一点。假设你不能用纯 css 来修改这样的设计。
  • 为什么“不同位置”必然意味着“DOM 中的不同位置”?
  • 1) 仅将一个 DOM 节点移动到另一个位置相对“便宜”。 2) – 4) – 请自行研究这些要点。
  • @Bergi 我无法仅使用 CSS 更改该元素的位置(设计不允许我这样做),因此唯一的选择是移动菜单或复制菜单。跨度>
  • 在关闭该功能的情况下使用您的网站。然后打开它,然后再试一次。如果网站感觉速度较慢,请调查原因。当然,做某事总是比什么都不做要花更长的时间,但是在这里测量毫秒是毫无意义的。

标签: javascript jquery performance responsive-design dom-manipulation


【解决方案1】:

这两个用例在性能方面非常不同,因此没有衡量标准来比较两者。

两者都有影响,但.append 方法在这种情况下几乎没有。没有多少人会一遍又一遍地调整浏览器的大小,除非您需要在非常规断点上进行附加,否则移动设备也不会在方向更改时触发此操作。

你唯一能真正衡量的是各种jQuery方法here的性能成本。

增加 DOM 节点的数量并使用 CSS 隐藏它们可能是最糟糕的解决方案。尤其是在移动设备上,您应该将 DOM 节点深度保持在最低限度。

对于这两种实现,您需要注意的唯一真正的性能问题是reflows 并在 DOM 节点深度和计数重要的地方重新绘制。尽管您拥有的重复菜单是display: none;,这会阻止它重新流动,但我仍然相信它会在渲染方面产生性能问题。我还发现this article 很有趣。

【讨论】:

    猜你喜欢
    • 2014-06-08
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2016-12-09
    • 2012-04-02
    • 1970-01-01
    相关资源
    最近更新 更多