У меня есть следующая разметка div
<div data-x="-1000" data-y="-1500">
// content
</div>
<div data-x="0" data-y="-1500">
// content
</div>
И у меня есть много из этих divs с разными значениями data-x и data-y в зависимости от их положения.
То, что я хочу достичь здесь, - это нарисовать что-то вроде временной шкалы между divs, поэтому div1 line to div2 line to div 3 и т.д.
Я хочу, чтобы это было сделано автоматически. Поэтому я пытаюсь создать цикл для него, но мои знания javascript/jquery не так уж хороши. Может ли кто-нибудь указать мне в хорошем направлении?
теперь у меня есть
function drawTimeline() {
var divs = document.getElementsByTagName('div');
var canvas = document.getElementById('timeline');
// Make sure we don't execute when canvas isn't supported
if (canvas.getContext){
// use getContext to use the canvas for drawing
var ctx = canvas.getContext('2d');
var prevCoord = {};
for (var i = -1; div = divs[++i]; ) {
if (div.dataset.x && div.dataset.y) {
var x = parseInt(div.dataset.x);
var y = parseInt(div.dataset.y);
if ({} !== prevCoord) {
ctx.beginPath();
ctx.lineWidth="5";
ctx.strokeStyle="purple"; // Purple path
ctx.moveTo(prevCoord.x, prevCoord.y);
ctx.lineTo(x, y);
ctx.closePath();
ctx.stroke()
}
prevCoord.x = x;
prevCoord.y = y;
}
}
} else {
alert('You need Safari or Firefox 1.5+ to see this.');
}
}
к сожалению, линия не правильна, как линейная линия, и это... может кто-то помочь мне с этим?
У вас есть правильная идея, но ваша проблема заключается в том, что холст не рисует отрицательные координаты.
Поэтому вы должны сопоставить все ваши данные-x и data-y в положительные координаты.
Здесь функция, которая отображает ваши отрицательные значения в положительные значения:
function mapRange(value, sourceLow, sourceHigh, mappedLow, mappedHigh) {
return mappedLow + (mappedHigh - mappedLow) * (value - sourceLow) / (sourceHigh - sourceLow);
}
Поэтому в вашем примере для сопоставления значения data-x -300 в экранном диапазоне 0-1000 можно сделать следующее:
var x = mapRange(-300, -1500,0, 0,1000); // The mapped x is 466.66.
Вы должны переместить свои divs в сопоставленные координаты x, y, которые вы можете сделать с помощью CSS.
Альтернативой является использование SVG, который создает фактические элементы DOM, которые могут быть расположены в отрицательных координатах.
linear line
? В вашем примере есть только 2 точки данных (каждая из которых имеет позиции вне холста) и, таким образом, рисует невидимый отрезок прямой линии от <-1000, -1500> до <0, -1500> - вертикальная линия 1000 пикселей долго. Желаете ли вы масштабировать линии так, чтобы неизвестное количество сегментов неизвестной длины всегда помещалось в области рисования известного и заранее определенного размера?