我相信CSS有更好的机制来指定画布的大小,CSS必须决定样式,而不是JavaScript或HTML。话虽如此,在HTML中设置宽度和高度对于解决canvas问题很重要。
CSS有一个重要的规则,允许重写属性的其他样式规则,包括HTML中的规则。通常,它的使用是不受欢迎的,但这里的使用是合法的。
在WebAssembly的Rust模块中,你可以做以下事情:
fn update_buffer(canvas: &HtmlCanvasElement) {
canvas.set_width(canvas.client_width() as u32);
canvas.set_height(canvas.client_height() as u32);
}
//..
#[wasm_bindgen(start)]
pub fn start() -> Result<(), JsValue> {
// ...
let canvas: Rc<_> = document
.query_selector("canvas")
.unwrap()
.unwrap()
.dyn_into::<HtmlCanvasElement>()
.unwrap()
.into();
update_buffer(&canvas);
// ...
// create resizing handler for window
{
let on_resize = Closure::<dyn FnMut(_)>::new(move |_event: Event| {
let canvas = canvas.clone();
// ...
update_buffer(&canvas);
// ...
window.add_event_listener_with_callback("resize", on_resize.as_ref().unchecked_ref())?;
on_resize.forget();
}
}
在那里,一旦WASM模块被加载,我们就更新画布缓冲区,然后每当窗口大小被调整时。我们通过手动指定画布的宽度和高度作为clientWidth和clientHeight的值来做到这一点。也许有更好的方法来更新缓冲区,但我相信这个解决方案比@SamB, @CoderNaveed, @Anthony Gedeon, @Bluerain, @Ben Jackson, @Manolo, @XaviGuardia, @Russel Harkins和@fermar的建议更好,因为
元素的样式是CSS,而不是HTML。
不像@Manolo使用的element .style.width & element .style.height技巧或@XaviGuardia使用的JQuery等效,它将工作于画布,其大小由使用指定为flex或网格项。
不像@Russel Harkings的解决方案,这也处理调整大小。虽然我喜欢他的答案,因为它真的是干净和简单。
WASM是未来!哈哈:D
另外,有大量的.unwrap(),因为Rust显式地处理可能的失败。
P.P.S.
{
let on_resize = Closure::<dyn FnMut(_)>::new(move |_event: Event| {
let canvas = canvas.clone();
// ...
update_buffer(&canvas);
// ...
window.add_event_listener_with_callback("resize", on_resize.as_ref().unchecked_ref())?;
on_resize.forget();
}
使用更好的库可以更干净地完成。如。
add_resize_handler(&window, move |e: ResizeEvent| {
let canvas = canvas.clone();
// ...
update_buffer(&canvas);
})