0

我正在尝试按照此处的配方(第 4 节结束,在“做什么”下)获得一个可自行调整大小的画布。所以我有一个ResizeObserver连接来观察我的画布元素的变化。画布元素具有 100% 的高度,并且位于容器元素内部,该容器元素本身就是元素的子flex元素。这组确切的情况似乎导致了连锁反应,其中画布的高度随着时间的推移不断增加。

我想要这个的原因是因为我希望画布填充它的容器,因此是 100% 的高度,但我不希望它的实际渲染内容被浏览器拉伸。

是一个 JSFiddle,这是代码中的一个最小示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body
        {
            display: flex;
        }

        main
        {
            max-height: 1000px; /* not necessary, for convenience */
        }

        canvas
        {
            height: 100%;
            background-color: pink;
        }
    </style>
</head>
<body>
    <main>
        <canvas></canvas>
    </main>

    <script>
        let canvas = document.querySelector("canvas");
        let renderer = canvas.getContext("2d");

        let resizeObserver = new ResizeObserver(render);
        resizeObserver.observe(canvas);

        function render()
        {
            renderer.canvas.height = renderer.canvas.clientHeight;
        }
    </script>
</body>
</html>
4

1 回答 1

1

这是因为您的画布已display设置为inline-block,因此它会受到line-height父级值的影响,<main>并且会在该父级中占用比实际大小更多的空间。

为避免这种情况,请将<main>'s设置line-height0,

let canvas = document.querySelector("canvas");
let renderer = canvas.getContext("2d");

let resizeObserver = new ResizeObserver(resize);
resizeObserver.observe(canvas, { box: "content-box"});
i = 0;
function resize()
{
    canvas.height = canvas.clientHeight;
}
body
{
  display: flex;
}

main
{
  line-height: 0;
}

canvas
{
  height: 100%;
  background-color: pink;
}
<main>
    <canvas></canvas>
</main>

或将<canvas>显示设置为block

let canvas = document.querySelector("canvas");
let renderer = canvas.getContext("2d");

let resizeObserver = new ResizeObserver(resize);
resizeObserver.observe(canvas, { box: "content-box"});
i = 0;
function resize()
{
    canvas.height = canvas.clientHeight;
}
body
{
  display: flex;
}

canvas
{
  height: 100%;
  background-color: pink;
  display: block;
}
<main>
    <canvas></canvas>
</main>

于 2022-02-21T02:46:05.833 回答