Проблемы со ссылками на позицию холста - PullRequest
2 голосов
/ 09 февраля 2012

К сожалению, jsfiddle сегодня не работает, поэтому я постараюсь изо всех сил описать, что мне нужно.

У меня есть два div, которые имеют фиксированный размер (100 на 100 пикселей). Это jquery-UI-dragggable.

Разметка выглядит так:

<body>
<div class="touch" id="front"><img src="front.png" /></div>
<div class="touch" id="back"><img src="back.png" /></div>
<canvas id="connect"></canvas>
</body>

и CSS выглядит следующим образом:

.touch{
width: 100px;
height: 100px;
background-color: red;
}
#connect{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}

Теперь я пытаюсь использовать канву, чтобы нарисовать линию, соединяющую эти два элемента, выполнив следующие действия для drag:

var ctx = canvas.getContext('2d');
ctx.beginPath();  
ctx.moveTo($('#front').offset().left,$('#front').offset().top);  
ctx.lineTo($('#back').offset().left,$('#back').offset().top);  
ctx.stroke();

Это работает, когда линия рисуется в соответствии с движениями div s, но она совершенно не в пропорциях, то есть начальная и конечная точки кажутся умноженными на некоторый коэффициент. Тем не менее, когда я рисую элемент жестко закодированными значениями, он работает нормально, а когда я записываю значения offset(), они кажутся правдоподобными. Может кто-нибудь сказать мне, что я здесь делаю не так?

1 Ответ

1 голос
/ 09 февраля 2012

Поскольку вы устанавливаете ширину и высоту холста с помощью CSS, а не с помощью атрибутов width и height. Холст особенный в этом смысле.

По умолчанию размер холста составляет 300x150, и он по-прежнему остается только растянутым с помощью CSS, что составляет 100% / 100%.

Я настоятельно рекомендую не определять размер холста в CSS, так как вы будете уменьшать его только от "истинного" размера.

В коде во время настройки вам нужно будет сделать

// silly pseudocode
canvas.width = theCanvasParent.clientWidth; // or whatever attribute it is, I'd reccomend putting all of those things in one giant container div
canvas.height = theCanvasParent.clientHeight;

Поскольку большинство браузеров не генерируют событие, когда родительский div изменяет размер, вам просто нужно будет, скажем, каждые полсекунды с таймером проверять, изменился ли div. Если да, то вы соответственно изменяете размер холста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...