Как сделать масштаб SVG без атрибута viewbox?

Я пытаюсь масштабировать компонент ReactJS так, чтобы он расширялся, чтобы соответствовать его родительскому контейнеру div. Компонент возвращает

<svg/>

элемент с несколькими дочерними элементами. API компонента реакции позволяет мне установить стиль CSS элемента svg. У меня нет способа присвоить элементу svg атрибут viewbox.

Есть ли способ заставить SVG масштабироваться, чтобы заполнить его родительский контейнер только через CSS?

Компонент React для справки: ссылка на сайт

Нелегко, поэтому существует атрибут viewBox.

Robert Longson 27.03.2018 00:05

Не работает someSelector svg {display:block; width: 100%}?

tao 27.03.2018 00:36

Нет, он расширяет SVG, чтобы заполнить всю область, но не масштабирует дочерние элементы SVG. Это означает, что нарисованные элементы остаются на месте и не масштабируются.

user3059217 27.03.2018 05:39

Если для SVG заданы свойства ширины и высоты, то, насколько я знаю, вам не повезло.

ivarni 27.03.2018 06:38

Что ж, вы могли бы обойти это, пройдя DOM после монтирования SVG и установив свойство viewBox с помощью ванильного JavaScript, но это, вероятно, не будет очень хорошим решением в долгосрочной перспективе.

ivarni 27.03.2018 06:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
5
847
1

Ответы 1

Что ж, довольно просто. Все, что вам нужно сделать, это объединить ResizeObserver и преобразовать: масштаб (). Это решение было применено для растягивания карты мира svg в область виджета приборной панели в производственной сборке приложения в компании, где я работаю.

screenshot

Существует суть, опубликованный со ссылкой на демонстрацию JSFiddle.

(function() {

  const parent = document.querySelector('.parent');
  const item = document.querySelector('.item');
  let scaleAdjust = 1.0;
    
  const process = (container, ref) => {
    const {
      height: originHeight,
      width: originWidth
     } = ref.getBoundingClientRect();
    const {
      height: containerHeight,
      width: containerWidth,
    } = container.getBoundingClientRect();
    const [height, width] = [originHeight * scaleAdjust, originWidth * scaleAdjust];
    const [from, to] = height > width ? [width, containerWidth] : [height, containerHeight];
    const scale = to / from;
    ref.style.transform = `scale(${scale})`;
    scaleAdjust = 1 / scale;
  };

  new ResizeObserver(() => process(parent, item)).observe(document.body);
    
})();

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