【发布时间】:2015-07-25 14:37:21
【问题描述】:
有没有办法可以在动态调整大小的 flex-box 容器中创建画布?
最好是纯 CSS 解决方案,但我认为重绘需要 JavaScript?
我认为一种解决方案可能是监听 re-sizing 事件,然后缩放画布以满足 flex box 父级的大小,然后强制重绘,但我希望尽可能多地使用 CSS 或更多干净/更少的代码解决方案。
当前的方法是基于 CSS 的,画布根据父弹性框元素重新调整大小。在下面的屏幕截图中,图形被模糊、重新定位并从画布溢出。
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 正在占用其父级的宽度,即 80vw。 100vw 可以解决你的问题
-
no.. 这是有目的的,菜单稍后会在它的右侧。图形缩放是问题,可能需要进行编辑,以免其他人有相同的假设。
-
@Dima 你能澄清一下你所谓的“原始问题”吗?当我读到它时,当前接受的答案完美地回答了它(除了它可以从使用 ResizeObserver 的更新中获胜)。为了使画布“适合”在动态容器中,它必须调整大小,或者您是否正在考虑其他行为?如果有,是哪一个?
-
也许你是对的,也许我看不懂 :) 我想,最终,我希望有两种选择:画布跟随容器大小,改变和不改变画布(内部)像素大小。
-
我认为您正在寻找
object-fit或纯粹的CSS解决方案。这是一个jsfiddle.net/vfsgpm3q。
标签: javascript jquery html css flexbox