HTML5 canvas: как запросить или изменить базовые измерения растрового изображения в отличие от измерений элемента DOM?
Я использую элемент HTML5 canvas:
<style>
#myCanvas {
width: 100%;
height: 100%;
object-fit: contain;
}
</style>
<canvas id="myCanvas" ontouchstart="..." />
Я понимаю, что есть базовое растровое изображение, а затем есть элемент DOM, в который упаковано это растровое изображение, и эти 2 объекта имеют разные измерения, поэтому, например, растровое изображение масштабируется / сокращается, чтобы вписаться в элемент DOM. Мне было бы легче понять, если размеры растрового изображения всегда равнялись измерениям элемента DOM, но это не так.
Как я могу запросить соответствующие размеры? Как мне установить соответствующие размеры? Как просмотреть 2 набора измерений в инструменте разработчика Chrome? Как мне синхронизировать 2 набора измерений?
Это важно, потому что щелчки мышью и касания пальцами доставляются в координатах DOM, но нам обычно нужно интерпретировать их в координатах холста.
(И связанный с этим вопрос: правильно ли я сделал, чтобы элемент DOM расширялся до максимальных размеров, разрешенных родителем?).
1 ответ
Чтобы получить размеры базового растрового изображения холста:
var w = canvas.width;
var h = canvas.height;
Чтобы получить размеры элемента DOM:
var w = canvas.clientWidth;
var h = canvas.clientHeight;
Чтобы установить базовое растровое изображение холста:
canvas.width = 900;
canvas.height = 400;
Чтобы установить размеры элемента DOM, это касается стилей CSS и всего, что находится на экране, и это более сложный вопрос.
В Chrome, "Инструменты разработчика", Chrome отображает размеры элемента DOM, и я не смог найти никакого способа получить холст, лежащий в основе размеров растрового изображения, кроме ввода "canvas.width" и "canvas.height" в командную строку.
Что касается попытки устроить так, чтобы высота ==clientHeight и width=clientWidth, я бы предположил, что это возможно, но это, вероятно, также сложно и, вероятно, нежелательно.
Поэтому для сопоставления действия касания или щелчка мышью из координат элемента DOM в координаты растрового изображения холста достаточно простой операции масштабирования:
function elementCoordsToCanvasCoords(X,Y)
{
X = X * canvas.clientWidth / canvas.width;
Y = Y * canvas.clientHeight / canvas.height;
return [X,Y];
}
function onTouchStart(event)
{
fingerStart(event.changedTouches[0].clientX, event.changedTouches[0].clientY);
}
function fingerStart(X, Y)
{
[X,Y] = elementCoordsToCanvasCoords(X,Y);
...
}