Библиотека SVG.js предоставляет мощные инструменты для работы с векторной графикой в браузере, включая возможность интерактивного управления объектами с клавиатуры. Работа с клавишами позволяет создавать динамические интерфейсы, анимации и игры без необходимости использования сторонних библиотек для событий клавиатуры.
Для обработки нажатий клавиш используется стандартная система событий
DOM: keydown, keyup и keypress. В
сочетании с SVG.js это позволяет управлять объектами SVG в реальном
времени. Пример базового подключения:
document.addEventListener('keydown', function(event) {
console.log(`Нажата клавиша: ${event.key}`);
});
keydown.SVG.js позволяет изменять атрибуты объектов, такие как
x, y, cx, cy,
transform. Для перемещения объекта можно использовать метод
move() или dmove():
const draw = SVG().addTo('body').size(600, 400);
const rect = draw.rect(50, 50).fill('#f06').move(100, 100);
document.addEventListener('keydown', function(event) {
const step = 10;
switch(event.key) {
case 'ArrowUp':
rect.dmove(0, -step);
break;
case 'ArrowDown':
rect.dmove(0, step);
break;
case 'ArrowLeft':
rect.dmove(-step, 0);
break;
case 'ArrowRight':
rect.dmove(step, 0);
break;
}
});
Для создания плавных анимаций можно использовать встроенный метод
animate():
document.addEventListener('keydown', function(event) {
if (event.key === 'ArrowRight') {
rect.animate(300).dmove(50, 0);
}
});
animate(duration) создаёт анимацию с заданной
длительностью в миллисекундах.dx(), dy(), dmove()
могут использоваться для анимации координат.Чтобы объект не выходил за пределы SVG-контейнера, можно проверять текущие координаты перед перемещением:
const containerWidth = 600;
const containerHeight = 400;
document.addEventListener('keydown', function(event) {
const step = 10;
let {x, y} = rect.bbox();
switch(event.key) {
case 'ArrowUp':
if (y - step >= 0) rect.dmove(0, -step);
break;
case 'ArrowDown':
if (y + rect.height() + step <= containerHeight) rect.dmove(0, step);
break;
case 'ArrowLeft':
if (x - step >= 0) rect.dmove(-step, 0);
break;
case 'ArrowRight':
if (x + rect.width() + step <= containerWidth) rect.dmove(step, 0);
break;
}
});
Использование метода bbox() позволяет получать размеры и
координаты объекта в любой момент.
Для управления группой объектов удобно использовать группы:
const group = draw.group();
const circle = draw.circle(50).fill('#0f6').move(150, 150);
const square = draw.rect(50, 50).fill('#06f').move(200, 150);
group.add(circle).add(square);
document.addEventListener('keydown', function(event) {
const step = 10;
if (event.key === 'ArrowUp') group.dmove(0, -step);
if (event.key === 'ArrowDown') group.dmove(0, step);
});
Группы позволяют перемещать несколько элементов одновременно без индивидуального контроля каждого объекта.
Чтобы обеспечить плавное перемещение при удержании клавиши,
используется сочетание keydown и
setInterval:
let interval;
document.addEventListener('keydown', function(event) {
if (interval) return;
if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.key)) {
interval = setInterval(() => {
switch(event.key) {
case 'ArrowUp': rect.dmove(0, -5); break;
case 'ArrowDown': rect.dmove(0, 5); break;
case 'ArrowLeft': rect.dmove(-5, 0); break;
case 'ArrowRight': rect.dmove(5, 0); break;
}
}, 50);
}
});
document.addEventListener('keyup', function(event) {
clearInterval(interval);
interval = null;
});
Такой подход обеспечивает непрерывное движение объекта при удержании клавиши.
SVG.js поддерживает комплексные трансформации через метод
transform():
document.addEventListener('keydown', function(event) {
switch(event.key) {
case 'r': // вращение на 15 градусов
rect.transform({ rotation: rect.transform().rotation + 15 });
break;
case 's': // масштабирование
rect.transform({ scaleX: 1.1, scaleY: 1.1 });
break;
}
});
Для расширенного управления можно использовать модификаторы клавиш
(Shift, Ctrl, Alt):
document.addEventListener('keydown', function(event) {
const step = event.shiftKey ? 20 : 5;
switch(event.key) {
case 'ArrowUp': rect.dmove(0, -step); break;
case 'ArrowDown': rect.dmove(0, step); break;
}
});
Shift увеличивает шаг перемещения, а комбинация с Ctrl или Alt может использоваться для изменения других свойств (цвет, прозрачность, угол).
Для сложных интерфейсов и игр целесообразно использовать цикл
requestAnimationFrame, синхронизируя события клавиатуры с
отрисовкой:
let keys = {};
document.addEventListener('keydown', e => keys[e.key] = true);
document.addEventListener('keyup', e => keys[e.key] = false);
function animate() {
if (keys['ArrowRight']) rect.dmove(2, 0);
if (keys['ArrowLeft']) rect.dmove(-2, 0);
requestAnimationFrame(animate);
}
animate();
Такой подход обеспечивает более плавное управление, чем реагирование
на события keydown напрямую, и предотвращает задержки при
удержании клавиш.
Навигация с клавиатуры в SVG.js строится на сочетании DOM-событий и
методов библиотеки для управления позициями, размерами и трансформациями
объектов. Использование групп, анимаций и циклов
requestAnimationFrame позволяет создавать интерактивные и
отзывчивые интерфейсы. Такой подход совместим с любыми типами элементов:
прямоугольниками, кругами, линиями, текстом и сложными
SVG-композициями.