一个非常非常非常大的div

Bas*_*asj 106 html javascript css google-chrome

对于我的一个项目(参见BigPictu.rebigpicture.js GitHub项目),我必须处理一个非常非常非常大的<div>容器.

我知道使用简单的方法可能会导致性能不佳,但我并不认为它主要存在于......仅限Chrome!

如果你测试这个小页面(见下面的代码),平移(点击+拖动)将是:

  • Firefox上正常/平滑
  • 即使在Internet Explorer上也能正常/平滑
  • 在Chrome上非常慢(几乎崩溃)!

当然,我可以添加一些代码(在我的项目中),当你进行大量放大时,可能会隐藏可能非常大的字体大小的文本.但是,为什么Firefox和Internet Explorer正确处理它而不是Chrome?

在JavaScript,HTML或CSS中是否有一种方法可以告诉浏览器不要尝试为每个动作渲染整个页面(这里宽度为10000像素)?(仅渲染当前视口!)


<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <style>
            html, body {
                overflow: hidden;
                min-height: 100%; }

            #container {
                position: absolute;
                min-height: 100%;
                min-width: 100%; }

            .text {
                font-family: "Arial";
                position: absolute;
            }
        </style>
    </head>

    <body>
        <div id="container">
            <div class="text" style="font-size: 600px; left:100px; top:100px">Small text</div>
            <div class="text" style="font-size: 600000px; left:10000px; top:10000px">Very big text</div>
        </div>

        <script>
            var container = document.getElementById('container'), dragging = false, previousmouse;
            container.x = 0; container.y = 0;

            window.onmousedown = function(e) { dragging = true; previousmouse = {x: e.pageX, y: e.pageY}; }

            window.onmouseup = function() { dragging = false; }

            window.ondragstart = function(e) { e.preventDefault(); }

            window.onmousemove = function(e) {
                if (dragging) {
                    container.x += e.pageX - previousmouse.x; container.y += e.pageY - previousmouse.y;
                    container.style.left = container.x + 'px'; container.style.top = container.y + 'px';
                    previousmouse = {x: e.pageX, y: e.pageY};
                }
            }
        </script>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

gee*_*rt3 60

改变position: fixed似乎加快了速度.

  • 这不是他的问题的直接答案,但它是他最初问题的潜在解决方案(Chrome中的响应缓慢).恕我直言,应鼓励在禁区外思考. (27认同)
  • 我只能猜测.`fixed`显然不那么复杂,也许他们可以做更多的优化.但是我没有看过渲染引擎源代码,如果你的意思;-) (2认同)
  • @Joe这些来自StackOverflow提供的一组标准答案,供主持人使用.有些人需要适度调节. (2认同)

Tee*_*emu 42

使用transform而不是top/left:

container.style.transform = 'translate(' + container.x + 'px, ' + container.y + 'px)';
Run Code Online (Sandbox Code Playgroud)

jsFiddle的现场演示.

  • 一个**非常奇怪的东西:在你的jsFiddle中,Chrome确实很快.我做了*完全*你在我的原始代码中提出的修改:http://gget.it/1owxq8kr/big-div-test_transform.html,这最后一个链接在Chrome上很慢:(这怎么可能?它看起来和你的jsFiddle一样![注意:奇迹般地,geert3的答案似乎有效,我不知道为什么但是它有效:http://gget.it/e0ubdh67/big-div-test_fixed.html] (2认同)
  • 奇怪的是,我还有Chrome 39.0.2171.71米......而且http://gget.it/1owxq8kr/big-div-test_transform.html平移缓慢,与我的原始版本一样慢(在问题本身中).哦,可能它取决于硬件加速:我可能没有硬件加速,因为我的笔记本电脑图形芯片很差...... (2认同)

Vil*_*usL 22

  1. 回答第一个任务"为什么".问题之一是字体大小.你有600000像素的字体大小,大多数浏览器会看到它太高并渲染得更小,而chrome尝试渲染原始大小.看起来像Chrome无法快速重绘您要求的样式的大字母.

但是结合Teemu和geert3的答案 - 使用变换和位置:固定,使得即使使用大字体,chrome工作也会更快.

  1. 回答第二个问题:"有没有办法......不试图渲染整个页面" - 你可以尝试对容器中的元素应用鼠标操作,而不是整个容器.

最大字体大小:http://jsfiddle.net/74w7yL0a/

firefox 34 - 2 000 px
chrome 39 - 1 000 000 px
safari 8 - 1 000 000 px
ie 8-11 - 1 431 700 px
Run Code Online (Sandbox Code Playgroud)

  • 实际上它确实如此.OP提出了两个问题,前者得到了回答:"为什么FF,IE正确处理它而不是Chrome?" (6认同)