Estoy dibujando un diagrama de dispersión con d3.js. Con la ayuda de esta pregunta:
Obtenga el tamaño de la pantalla, la página web actual y la ventana del navegador
Estoy usando esta respuesta:
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;
Así que puedo ajustar mi trama a la ventana del usuario de esta manera:
var svg = d3.select("body").append("svg")
.attr("width", x)
.attr("height", y)
.append("g");
Ahora me gustaría que algo se encargue de cambiar el tamaño de la trama cuando el usuario cambie el tamaño de la ventana.
PD: no estoy usando jQuery en mi código.
javascript
d3.js
mthpvg
fuente
fuente
Respuestas:
Busque 'SVG receptivo', es bastante simple hacer que un SVG responda y ya no tiene que preocuparse por los tamaños.
Así es como lo hice:
Nota: Todo en la imagen SVG se escalará con el ancho de la ventana. Esto incluye el ancho del trazo y los tamaños de fuente (incluso aquellos configurados con CSS). Si esto no se desea, hay más soluciones alternativas involucradas a continuación.
Más información / tutoriales:
http://thenewcode.com/744/Make-SVG-Responsive
http://soqr.fr/testsvg/embed-svg-liquid-layout-responsive-web-design.php
fuente
viewBox
atributo debe establecerse en la altura y el ancho relevantes de su diagrama SVG:.attr("viewBox","0 0 " + width + " " + height)
dondewidth
yheight
se definen en otro lugar. Es decir, a menos que desee que su cuadro de vista recorte su SVG. También es posible que desee actualizar elpadding-bottom
parámetro en su CSS para que coincida con la relación de aspecto de su elemento svg. Excelente respuesta, muy útil, y funciona de maravilla. ¡Gracias!top: 10px;
? Parece incorrecto para mí y proporciona compensación. Poner a 0px funciona bien.Use window.onresize :
http://jsfiddle.net/Zb85u/1/
fuente
ACTUALIZAR simplemente use la nueva forma de @cminatti
vieja respuesta para propósitos históricos
En mi opinión, es mejor usar select () y on () ya que de esa manera puedes tener múltiples controladores de eventos de cambio de tamaño ... simplemente no te vuelvas loco
http://eyeseast.github.io/visible-data/2013/08/28/responsive-charts-with-d3/
fuente
Es un poco feo si el código de cambio de tamaño es casi tan largo como el código para construir el gráfico en primer lugar. Entonces, en lugar de cambiar el tamaño de cada elemento del gráfico existente, ¿por qué no simplemente recargarlo? Así es como funcionó para mí:
La línea crucial es
d3.select('svg').remove();
. De lo contrario, cada cambio de tamaño agregará otro elemento SVG debajo del anterior.fuente
En los diseños de fuerza, simplemente establecer los atributos 'alto' y 'ancho' no funcionará para volver a centrar / mover el gráfico al contenedor de svg. Sin embargo, hay una respuesta muy simple que funciona para Force Layouts que se encuentra aquí. . En resumen:
Use el mismo evento que desee.
Luego, suponiendo que tenga las variables svg y force:
De esta manera, no vuelve a renderizar el gráfico por completo, establecemos los atributos y d3 vuelve a calcular las cosas según sea necesario. Esto al menos funciona cuando usas un punto de gravedad. No estoy seguro de si ese es un requisito previo para esta solución. ¿Alguien puede confirmar o negar?
Saludos, g
fuente
Para aquellos que usan gráficos de fuerza dirigida en D3 v4 / v5, el
size
método ya no existe. Algo como lo siguiente funcionó para mí (basado en este problema de github ):fuente
Si desea vincular la lógica personalizada para cambiar el tamaño del evento, hoy en día puede comenzar a usar la API del navegador ResizeObserver para el cuadro delimitador de un elemento SVGElement.
Esto también manejará el caso cuando se cambie el tamaño del contenedor debido al cambio de tamaño de los elementos cercanos.
Hay un polyfill para un soporte de navegador más amplio.
Así es como puede funcionar en el componente de la interfaz de usuario:
fuente