gpt4 book ai didi

javascript - Canvas 渲染分辨率 - 如何在 flex 布局中使用 Canvas

转载 作者:行者123 更新时间:2023-11-27 23:00:04 25 4
gpt4 key购买 nike

我正在使用 flex 环境来自动缩放具有固定边和标题的容器(在文档准备好时使用 jquery 加载标题)。

--------------
| header |
--------------
| |canvas| |
| | | |
--------------

有 2 个 flex 环境,一个从上到下(列),一个从左到右(行)。

这似乎在不考虑 Canvas 的情况下正常工作。当页面加载并应用 flex 时 Canvas 会缩放,它的大小会发生变化,同时保持上下文的“渲染”宽度/高度不变。这会导致图像以较小的分辨率呈现并被拉伸(stretch)。

为了解决这个问题,在渲染之前我每次都运行这个函数:

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)拉伸(stretch)。有时它会导致标题消失或增加页面高度因此添加滚动条。

如何在 flex 环境中使用 Canvas ?设置 Canvas 宽度时需要考虑什么吗? (比如margins, paddings,我已经把显示样式设置成block了,inline把整个page都打断了)

有没有办法在不改变布局和影响页面的情况下设置上下文的渲染分辨率?

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%;
}

最佳答案

我的主要问题是 flex 参数中的收缩值。它允许顶部栏在减小页面大小时消失。

我没有找到解决 Canvas 渲染分辨率与其实际大小不完全匹配的问题的方法,所以线条有时仍然模糊。将 Canvas 的收缩选项设置为 0 主要解决了这个问题,但 UI 的其余部分随后会中断。我怀疑这是由实际上具有非整数宽度的元素引起的,该宽度未由 clientWidth/offsetWidth 参数表示。

关于javascript - Canvas 渲染分辨率 - 如何在 flex 布局中使用 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59041621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com