Невозможно перевести внутри холста HTML

У меня есть холст HTML, и я хотел бы прокручивать текущий контент вправо на 1 пиксель каждый раз, когда я добавляю новый пиксель слева. В основном создание эффекта диаграммы рисования

function draw()
{
    ctx.save();
    y += Math.floor((Math.random() * 10) - 5);
    ctx.fillStyle = 'blue';
    ctx.translate(1, 0);
    ctx.restore();
    ctx.fillRect(0,y,3,3);

    window.requestAnimationFrame(draw);
}

// init canvas
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(255, 255, 255, 0.3)';
ctx.fillRect(0,0,canvas.width,canvas.height);

var y = 0;
draw();

По какой-то причине я не получаю никакого визуального вывода на холсте

Вы должны восстановить после того, как нарисуете, иначе ваш перевод не будет иметь никакого эффекта.

trker 22.05.2019 16:57

@trker Я пытался, но он не прокручивается, пожалуйста, попробуйте

Gianluca Ghettini 22.05.2019 18:09

Да, он рисует только одну линию, потому что вы вызываете draw() один раз. Вы пытались вызвать draw() с тайм-аутом или циклом?

trker 22.05.2019 18:35

@trker внимательно посмотрите на отрисовку функции, последняя строка: window.requestAnimationFrame(draw); это обратный вызов, создающий цикл, подробнее об этом читайте здесь: developer.mozilla.org/en-US/docs/Web/API/window/…

Helder Sepulveda 23.05.2019 19:32

Вы правы, я забыл, как работает requestanimframe

trker 23.05.2019 19:34
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Введение в технологический стек Twitch
Введение в технологический стек Twitch
В этой статье мы подробно рассмотрим стек Twitch, который подразделяется на следующий набор технологий:
8 полезных HTML-тегов, которые лучше использовать вместо <div>
8 полезных HTML-тегов, которые лучше использовать вместо <div>
Когда я только начинал изучать html, я использовал div для всего, это был один из первых тегов, которые я выучил, и казалось, что он работает в любой...
HTML5: API локального хранилища (Local Storage)
HTML5: API локального хранилища (Local Storage)
LocalStorage - это простой способ хранения данных в браузере пользователя.
Доступность HTML - программирование с инклюзивной перспективой
Доступность HTML - программирование с инклюзивной перспективой
Представьте, что вы хотите поехать на пляж. Представьте, что вы упорно трудились весь год и заслужили это. Прибыв на место, вы обнаруживаете, что...
0
5
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Непонятно, что вы пытаетесь сделать с сохранением и восстановлением...
В приведенном ниже коде я удалил их и упростил ваш код, чтобы просто напечатать строку

function draw() {
  y += Math.sin(y*23);
  ctx.fillStyle = 'blue';
  ctx.translate(1, 0);
  ctx.fillRect(0, y++, 3, 3);
  window.requestAnimationFrame(draw);
}

// init canvas
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var y = 0;
draw();
<canvas id="canvas"></canvas>

Но вы можете получить тот же эффект без перевода, просто увеличив координаты x:

function draw() {
  y += Math.sin(y*23);
  ctx.fillStyle = 'red';
  ctx.fillRect(x++, y++, 3, 3);
  window.requestAnimationFrame(draw);
}

// init canvas
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var y = 0; x = 0;
draw();
<canvas id="canvas"></canvas>

Но если все, что вам нужно, это красиво выглядящая диаграмма, вам следует обратить внимание на chartjs:
https://www.chartjs.org/samples/latest/

Другие вопросы по теме