sveltejs 中的响应式全宽 canvas
Responsive full width canvas in sveltejs
我是 svelte 的新手,我正在尝试让 canvas 使用 svelte 在全屏上呈现。听起来很容易做到,但我无法让它正常工作。我将 width
和 height
变量绑定到父级的 clientWidth
/clientHeight
,并使用这些变量设置 canvas 的尺寸。现在的问题是,当调用 onMount
时,设置了 width
和 height
变量,但它们尚未应用于 canvas 元素。这意味着当 canvas 第一次呈现时,它仍然具有初始尺寸,而不是父级的尺寸。只有当我第二次渲染它时,它才有合适的尺寸。如何让 canvas 在第一次渲染时具有正确的尺寸或在 canvas 具有正确的尺寸时再次渲染?
Here 你可以找到一个“工作”版本。
<script>
import { onMount } from "svelte";
let canvas;
let ctx;
let width = 1007;
let height = 1140;
const draw = () => {
ctx.clearRect(0, 0, width, height);
ctx.beginPath();
ctx.moveTo(width/2 - 50, height/2);
ctx.arc(width/2, height/2, 50, 0, 2 * Math.PI);
ctx.fill();
}
onMount(() => {
ctx = canvas.getContext("2d");
draw();
setTimeout(draw, 5000);
});
</script>
<style>
.container {
width: 100%;
height: 100%;
}
</style>
<div
class="container"
bind:clientWidth={width}
bind:clientHeight={height}>
<canvas bind:this={canvas} {width} {height} />
</div>
您可以通过等待下一个'tick'
来解决这个问题
import { onMount, tick } from 'svelte';
onMount(async () => {
ctx = canvas.getContext("2d");
canvas.width = width;
canvas.height = height;
await tick()
draw();
});
await tick()
所做的是有效地暂停执行,直到所有当前更改都应用到 dom
我是 svelte 的新手,我正在尝试让 canvas 使用 svelte 在全屏上呈现。听起来很容易做到,但我无法让它正常工作。我将 width
和 height
变量绑定到父级的 clientWidth
/clientHeight
,并使用这些变量设置 canvas 的尺寸。现在的问题是,当调用 onMount
时,设置了 width
和 height
变量,但它们尚未应用于 canvas 元素。这意味着当 canvas 第一次呈现时,它仍然具有初始尺寸,而不是父级的尺寸。只有当我第二次渲染它时,它才有合适的尺寸。如何让 canvas 在第一次渲染时具有正确的尺寸或在 canvas 具有正确的尺寸时再次渲染?
Here 你可以找到一个“工作”版本。
<script>
import { onMount } from "svelte";
let canvas;
let ctx;
let width = 1007;
let height = 1140;
const draw = () => {
ctx.clearRect(0, 0, width, height);
ctx.beginPath();
ctx.moveTo(width/2 - 50, height/2);
ctx.arc(width/2, height/2, 50, 0, 2 * Math.PI);
ctx.fill();
}
onMount(() => {
ctx = canvas.getContext("2d");
draw();
setTimeout(draw, 5000);
});
</script>
<style>
.container {
width: 100%;
height: 100%;
}
</style>
<div
class="container"
bind:clientWidth={width}
bind:clientHeight={height}>
<canvas bind:this={canvas} {width} {height} />
</div>
您可以通过等待下一个'tick'
来解决这个问题import { onMount, tick } from 'svelte';
onMount(async () => {
ctx = canvas.getContext("2d");
canvas.width = width;
canvas.height = height;
await tick()
draw();
});
await tick()
所做的是有效地暂停执行,直到所有当前更改都应用到 dom