【问题标题】:canvas in a div with display none does not work不显示的 div 中的画布不起作用
【发布时间】:2014-10-09 21:28:41
【问题描述】:

我的画布元素有问题。当它在隐藏的 div 中并且 div 被切换时,它不会显示。更好的解释和例子在这里

http://jsfiddle.net/78sJT/10/

这发生在 ff 和 chrome 中(未测试其他)。谁能告诉我为什么/如何克服这个问题。

【问题讨论】:

    标签: javascript css html canvas


    【解决方案1】:

    问题在于 dygraphs 将 div 的宽度/高度检测为 0/0,并且在重新绘制之前不会学习其他情况(调整单个 DOM 元素大小时不会触发 JS 事件)。

    最简单的解决方法是明确地让 dygraph 知道它应该在使用 g.resize(); 切换 div 后更新其大小并重绘自身

        $(document).ready(function(){
          $('.click').click(function(){
            $('#hidden').toggle();
            g.resize();
          });
        });
    

    我更新了你的 jsfiddle http://jsfiddle.net/78sJT/13/

    【讨论】:

    • 谢谢,这让我发疯了。我只需要找出一种方法来做到这一点,因为我正在动态生成图表并且不知道“g”实际上是什么。
    • 得到了它的工作,对于其他正在考虑动态执行此操作的人,我正在使用 html5 数据属性并最终得到codepad.org/CmHHo0iG
    【解决方案2】:

    我刚刚在 Chrome 37.0.2062.124 m 中遇到了这个问题,与 OP 问题中描述的问题相匹配。但是我没有使用任何特定的图形库,只是绘制到画布上。当封闭 DIV 的大小发生变化时,我已经在重新绘制画布了。

    我发现如果将画布的宽度或高度设置为零,它就会变得不可靠。下次您将宽度和高度设置为非零值时,您立即对其进行的任何绘制都将被忽略,即使它的宽度和高度现在非零并且可以在元素树中看到(并且悬停-在页面中突出显示)在 Chrome 的调试器中。

    因此,除了 benni_mac_b 的回答中的建议之外,您还必须:

    • 使用setTimeout或类似的方式来延迟在画布上绘制,所以你不要在设置宽度/高度后立即这样做,或者
    • 确保您从未将画布设置为零宽度/高度。确保它至少为 1 像素。

    为了简单起见,我做了后者,它解决了问题。

    总结:

    刚刚从 (0, 0) 增长到 (1000, 1000) 的画布无法立即绘制 - 它会忽略所有绘图指令。但如果它刚刚从 (1, 1) 增长到 (1000, 1000),您可以立即利用它。

    【讨论】:

      猜你喜欢
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多