Управление viewBox в SVG с помощью JavaScript (без библиотек)
Я пытаюсь изменить атрибут viewBox у элемента SVG с помощью JavaScript. В основном, я рисую бинарное дерево поиска, и когда оно становится слишком широким, я хочу изменить viewBox, чтобы уменьшить масштаб и вписать дерево в окно. В данный момент я использую следующий код:
if(SVGWidth >= 1000){
var a = document.getElementById('svgArea');
a.setAttribute("viewBox", "0 0 " + SVGWidth + " 300");
}
HTML-код выглядит так:
<svg id="svgArea" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1000" height="300" viewBox="0 0 1000 300">
</svg>
Я также пробовал использовать setAttributeNS('null', ...)
, но это тоже не сработало. Одно странное наблюдение: когда я вызываю alert(a)
, это возвращает [object SVGSVGElement]
, что кажется мне странным. Буду благодарен за любую помощь!
4 ответ(ов)
Чтобы дать более точный ответ, было бы полезно увидеть контекст SVG, но следующий код сработал у меня в чистом документе SVG:
shape = document.getElementsByTagName("svg")[0];
shape.setAttribute("viewBox", "-250 -250 500 750");
Возможно, проблема связана с тем, что атрибут viewBox
чувствителен к регистру?
У вас ошибка в коде: viewbox
отличается от viewBox
— буква B должна быть заглавной. Измените код на следующий:
a.setAttribute("viewBox", "0 0 " + SVGWidth + " 300");
Это должно решить вашу проблему.
У меня был очень похожий случай, когда изменение размеров SVG было критически важным для адаптивного дизайна.
const windowWidth = window.innerWidth ||
document.documentElement.clientWidth ||
document.body.clientWidth;
const windowHeight = window.innerHeight ||
document.documentElement.clientHeight ||
document.body.clientHeight;
// Используем getElementById для конкретного SVG
const shape = document.getElementById("background-svg");
function onWindowResize() {
console.log(windowWidth, windowHeight);
if (windowWidth < 600 || windowHeight < 900) {
shape.setAttribute("viewBox", "0 0 400 800");
}
}
// Добавляем обработчик события
window.addEventListener("resize", onWindowResize);
Этот метод неплохо сработал для меня. Буду рад, если вы подскажете, как его можно улучшить или предложите альтернативные решения. Удачи в coding!
Дополнительно, если вы хотите динамически задать размеры viewBox
, используйте шаблонные литералы ES6 вместо конкатенации строк.
shape = document.getElementsByTagName("svg")[0];
const view = `${xValue} ${yValue} ${width} ${height}`; // шаблонные литералы
shape.setAttribute("viewBox", view);
Это позволит вам более легко и читабельно формировать строку для атрибута viewBox
.
Как получить границы элемента div в jQuery
Где найти документацию по форматированию даты в JavaScript?
Как проверить, содержит ли массив строку в TypeScript?
Ссылка и выполнение внешнего JavaScript-файла, размещенного на GitHub
Как остановить Babel от трансформации 'this' в 'undefined' и добавления "use strict"