7

为显示在 hmtl5 画布中的超大数据提供滚动和本机滚动条的推荐方法是什么?

我需要显示 128000x128000 像素的数据。使用宽度/高度设置为 128000 的画布不是一个选项,因为这将使用大量 RAM(根据我的快速计算大约为 61 GB)。

所以我需要一种为 HTML5 画布提供自定义滚动条的方法。

4

3 回答 3

5

经过快速测试,我不确定 Chrome 或 Firefox 是否会渲染那么大的画布。我的赌注是创建一个画布元素,但从不将其附加到 DOM。像这样:

var hiddenCanvas = document.createElement('canvas');
hiddenCanvas.width = 128000;
hiddenCanvas.height = 128000;
var hiddenContext = hiddenCanvas.getContext('2d');

然后创建一个较小的画布,它将实际显示隐藏画布的一部分

<canvas width="something reasonable" height="something reasonable" id="viewCanvas"/>

并使用 drawImage 方法绘制部分:

var viewCanvas = document.getElementById('viewCanvas');
var viewContext = viewCanvas.getContext('2d');
viewCanvasContext.drawImage(hiddenCanvas, 40, 50, viewCanvas.width, viewCanvas.height, 0, 0, viewCanvas.width, viewCanvas.height);

然后由您决定是否提供向上/向下/向右/向左按钮进行导航,或者使用 20px 宽的 DIV 来伪造滚动条,该 DIV 只会显示滚动条,并且您可以在其上挂上一个 onscroll 甚至监听器。每次用户改变位置时,再次调用 drawImage,更新 x/y 位置(在我的示例中为 40 和 50)。

话虽如此,即使在隐藏的情况下,我也怀疑浏览器是否可以与这么大的画布一起使用。

我碰巧正在寻找相同问题的解决方案,所以如果在您的研究中幸运的话,请分享。

于 2012-10-16T20:52:30.243 回答
1

Interesting question. I haven’t used <canvas> very much, but I believe the inside of the <canvas> is best thought of like an image, i.e. it’s a black box as far as the DOM is concerned.

As such, I don’t think you can really scroll it in the way that you’re imagining. If you had a 128000×128000 <canvas>, you could put it inside a <div> that’s e.g. 1280×1280 and set that <div> to overflow:hidden, but as you say, a 128000×128000 <canvas> is impractical.

I guess the kind of solution you’re looking for would provide a virtual 128000×128000 canvas interface, but then split it up into chunks, provide a scroll interface, and draw in each chunk as it was scrolled into view.

于 2012-09-05T09:56:20.597 回答
0

jCanvas是一个可以帮助你的 jQuery 插件。

于 2012-08-11T13:33:59.933 回答