Я рисую диаграмму рассеяния с d3.js. С помощью этого вопроса:
получить размер экрана, текущей веб-страницы и окна браузера
Я использую этот ответ:
var w = window,
d = document,
e = d.documentElement,
g = d.getElementsByTagName('body')[0],
x = w.innerWidth || e.clientWidth || g.clientWidth,
y = w.innerHeight|| e.clientHeight|| g.clientHeight;
Так что я могу разместить свой график в окне пользователя следующим образом:
var svg = d3.select("body").append("svg")
.attr("width", x)
.attr("height", y)
.append("g");
Теперь я хотел бы, чтобы кто-то позаботился об изменении размера графика, когда пользователь изменяет размер окна.
PS: я не использую jQuery в своем коде.
javascript
d3.js
mthpvg
источник
источник
Ответы:
Ищите «отзывчивый SVG», сделать SVG отзывчивым довольно просто, и вам больше не нужно беспокоиться о размерах.
Вот как я это сделал:
Примечание: все в изображении SVG будет масштабироваться с шириной окна. Это включает в себя ширину обводки и размеры шрифта (даже те, которые установлены с помощью CSS). Если это нежелательно, ниже приведены более сложные альтернативные решения.
Больше информации / учебники:
http://thenewcode.com/744/Make-SVG-Responsive
http://soqr.fr/testsvg/embed-svg-liquid-layout-responsive-web-design.php
источник
viewBox
атрибут должен быть установлен на соответствующую высоту и ширину вашего графика SVG:.attr("viewBox","0 0 " + width + " " + height)
гдеwidth
иheight
определены в другом месте. То есть, если вы не хотите, чтобы ваш SVG обрезался в окне просмотра. Вы также можете обновитьpadding-bottom
параметр в вашем CSS, чтобы он соответствовал соотношению сторон вашего элемента SVG. Хотя отличный ответ - очень полезно, и работает удовольствие. Спасибо!top: 10px;
? Кажется неправильным для меня и обеспечивает смещение. Установка на 0px работает нормально.Используйте window.onresize :
http://jsfiddle.net/Zb85u/1/
источник
ОБНОВЛЕНИЕ просто используйте новый способ от @cminatti
старый ответ для исторических целей
IMO, лучше использовать select () и on (), так как таким образом вы можете иметь несколько обработчиков событий изменения размера ... просто не сходите с ума
http://eyeseast.github.io/visible-data/2013/08/28/responsive-charts-with-d3/
источник
Это немного уродливо, если код изменения размера почти такой же длинный, как и код для построения графика. Поэтому вместо изменения размера каждого элемента существующей диаграммы, почему бы просто не перезагрузить его? Вот как это работает для меня:
Решающая линия
d3.select('svg').remove();
. В противном случае каждое изменение размера добавит еще один элемент SVG ниже предыдущего.источник
В силовых макетах простая установка атрибутов 'height' и 'width' не поможет перецентрировать / переместить график в контейнер svg. Тем не менее, есть очень простой ответ , который работает для Force макетов нашел здесь . В итоге:
Используйте то же (любое) событие, которое вам нравится.
Тогда, если у вас есть переменные svg & force:
Таким образом, вы не перерисовываете граф полностью, мы устанавливаем атрибуты, и d3 пересчитывает вещи по мере необходимости. По крайней мере, это работает, когда вы используете точку притяжения. Я не уверен, является ли это обязательным условием для этого решения. Кто-нибудь может подтвердить или опровергнуть?
Ура, г
источник
Для тех, кто использует форсированные графы в D3 v4 / v5, этот
size
метод больше не существует. Что-то вроде следующего работало для меня (на основе этой проблемы github ):источник
Если вы хотите привязать пользовательскую логику к событию изменения размера, в настоящее время вы можете начать использовать браузерный API ResizeObserver для ограничительной рамки SVGElement.
Это также будет обрабатывать случай, когда размер контейнера изменяется из-за изменения размера соседних элементов.
Для более широкой поддержки браузеров есть полифилл .
Вот как это может работать в компоненте пользовательского интерфейса:
источник