有没有办法在动态调整大小的flex-box容器内创建 Canvas ?

最好是仅CSS的解决方案,但我认为重绘需要JavaScript吗?

我认为一种解决方案可能是监听重新调整大小的事件,然后缩放 Canvas 以适应flex box父级的大小,然后强制重新绘制,但是我最好使用尽可能多的CSS或更干净/更少的CSS代码解决方案。

当前方法基于CSS,其中根据父级flex box元素调整 Canvas 的大小。在下面的屏幕截图中,图形被模糊,重新定位并从 Canvas 溢出。

CSS:

html,body{
            margin:0;
            width:100%;
            height:100%;
        }
        body{
            display:flex;
            flex-direction:column;
        }
header{
            width:100%;
            height:40px;
            background-color:red;
        }
        main{
            display:flex;
            flex: 1 1 auto;
            border: 1px solid blue;
            width:80vw;
        }
        canvas{
            flex: 1 1 auto;
            background-color:black;
        }

HTML:
<header>
</header>
<main>
    <canvas id="stage"></canvas>
</main>

Javascript:
$( document ).ready(function() {
    var ctx = $("#stage")[0].getContext("2d");
    ctx.strokeStyle="#FFFFFF";
    ctx.beginPath();
    ctx.arc(100,100,50,0,2*Math.PI);
    ctx.stroke();
});

JS提琴显示问题:https://jsfiddle.net/h2v1w0a1/

最佳答案

将 Canvas 视为图像。如果将其缩放到与原始尺寸不同的大小,则在某些时候可能会变得模糊,这可能取决于浏览器选择的插值算法。对于 Canvas ,浏览器倾向于选择双线性而不是双三次,因此比实际图像具有更高的模糊风险。

您将希望 Canvas 上的内容尽可能清晰地呈现,并且唯一的方法是使用JavaScript调整大小以适应父对象,并避免使用CSS(后者适合于打印之类的东西,或者在您需要“视网膜分辨率”时使用) ”)。

要获取以像素为单位的父容器大小,可以使用getComputedStyle()(请参见下面的更新):

var parent = canvas.parentNode,
    styles = getComputedStyle(parent),
    w = parseInt(styles.getPropertyValue("width"), 10),
    h = parseInt(styles.getPropertyValue("height"), 10);

canvas.width = w;
canvas.height = h;

Fiddle

(注意:Chrome目前似乎在计算出的Flex方面存在一些问题)

更新

这是一个更简单的方法:
var rect = canvas.parentNode.getBoundingClientRect();
canvas.width = rect.width;
canvas.height = rect.height;

Fiddle

07-24 09:38
查看更多