【发布时间】:2020-03-21 07:44:35
【问题描述】:
我正在使用 flex 环境来自动缩放具有固定边和标题的容器(在文档准备好时使用 jquery 加载标题)。
--------------
| header |
--------------
| |canvas| |
| | | |
--------------
有 2 个 flex 环境,一个从上到下(列),一个从左到右(行)。
如果不考虑画布,这似乎可以正常工作。 当页面加载并应用 flex 时,画布会被缩放,它的大小会发生变化,同时保持上下文的“渲染”宽度/高度相同。这会导致图像以小分辨率渲染并被拉伸。
为了解决这个问题,在渲染之前我每次都运行这个函数:
Map._resizeCanvas = function (canvas) {
let displayWidth = canvas.clientWidth;
let displayHeight = canvas.clientHeight;
if(displayWidth !== canvas.width || displayHeight !== canvas.height) {
canvas.width = displayWidth;
canvas.height = displayHeight;
}
};
这在大多数情况下都有效,但会导致图像被拉伸几个像素(沿 X)。 有时它会导致页眉消失或增加页面高度,从而添加滚动条。
如何在 flex 环境中使用画布?设置画布宽度时有什么需要考虑的吗? (像margin,paddings,我已经把显示样式设置为block,inline破坏了整个页面)
有没有办法在不改变布局和影响页面的情况下设置上下文的渲染分辨率?
HTML:
<body>
<div id="header-navigation"></div> <!-- set by jquery on document ready -->
<div id="page-container">
<div class="container" id="container1">
abc
<div style="height: 50pt;"></div>
</div>
<div class="container" id="container2">
<canvas id="canvas1" style="width: 100%; height: 100%; display: block"></canvas>
</div>
<div class="container" id="container3">
abc
<div style="height: 50pt;"></div>
</div>
</div>
</body>
CSS:
html,
body {
margin: 0;
width: 100%;
height: 100%;
display: flex;
flex-flow: column;
}
p {
margin: 0;
}
#header-navigation {
overflow: hidden; /* FIXME, in the flex environment, this also overflows in width */
flex: 0 1 auto;
}
#page-container {
margin: 5pt;
flex: 1 1 auto; /* part of the column flex layout */
display: flex; /* contains the row flex */
flex-flow: row;
}
.container {
height: 100%;
margin-left: 5pt;
margin-right: 5pt;
}
#container1 {
background: lightgray;
flex: 0 1 15%;
}
#container2 {
flex: 1 1 auto;
}
#container3 {
background: lightgray;
flex: 0 1 15%;
}
#canvas1 {
width: 100%;
height: 100%;
}
【问题讨论】:
标签: javascript html css html5-canvas