0

Управление viewBox в SVG с помощью JavaScript (без библиотек)

16

Я пытаюсь изменить атрибут 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 ответ(ов)

1

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

shape = document.getElementsByTagName("svg")[0];
shape.setAttribute("viewBox", "-250 -250 500 750"); 

Возможно, проблема связана с тем, что атрибут viewBox чувствителен к регистру?

0

У вас ошибка в коде: viewbox отличается от viewBox — буква B должна быть заглавной. Измените код на следующий:

a.setAttribute("viewBox", "0 0 " + SVGWidth + " 300");

Это должно решить вашу проблему.

0

У меня был очень похожий случай, когда изменение размеров 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!

0

Дополнительно, если вы хотите динамически задать размеры viewBox, используйте шаблонные литералы ES6 вместо конкатенации строк.

shape = document.getElementsByTagName("svg")[0];
const view = `${xValue} ${yValue} ${width} ${height}`; // шаблонные литералы
shape.setAttribute("viewBox", view);

Это позволит вам более легко и читабельно формировать строку для атрибута viewBox.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь