Estou desenhando um gráfico de dispersão com d3.js. Com a ajuda desta pergunta:
Obtenha o tamanho da tela, página da web atual e janela do navegador
Estou usando esta resposta:
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;
Então, eu consigo encaixar minha plotagem na janela do usuário assim:
var svg = d3.select("body").append("svg")
.attr("width", x)
.attr("height", y)
.append("g");
Agora, eu gostaria que algo resolvesse redimensionar o gráfico quando o usuário redimensionar a janela.
PS: Não estou usando jQuery no meu código.
javascript
d3.js
mthpvg
fonte
fonte
Respostas:
Procure por 'SVG responsivo'. É muito simples fazer um SVG responsivo e você não precisa mais se preocupar com tamanhos.
Aqui está como eu fiz isso:
Nota: Tudo na imagem SVG será dimensionado com a largura da janela. Isso inclui a largura do traçado e os tamanhos das fontes (mesmo as definidas com CSS). Se isso não for desejado, há mais soluções alternativas envolvidas abaixo.
Mais informações / tutoriais:
http://thenewcode.com/744/Make-SVG-Responsive
http://soqr.fr/testsvg/embed-svg-liquid-layout-responsive-web-design.php
fonte
viewBox
atributo deve ser definido para a altura e largura relevantes do seu gráfico SVG:.attr("viewBox","0 0 " + width + " " + height)
ondewidth
eheight
são definidos em outro lugar. Ou seja, a menos que você queira que seu SVG seja cortado pela caixa de exibição. Você também pode atualizar opadding-bottom
parâmetro em seu css para corresponder à proporção do seu elemento svg. Excelente resposta embora - muito útil, e funciona um tratamento. Obrigado!top: 10px;
? Parece incorreto para mim e fornece deslocamento. Colocar em 0px funciona bem.Use window.onresize :
http://jsfiddle.net/Zb85u/1/
fonte
UPDATE basta usar a nova maneira de @cminatti
resposta antiga para fins históricos
Na IMO, é melhor usar select () e on (), pois dessa forma você pode ter vários manipuladores de eventos de redimensionamento ... apenas não fique muito louco
http://eyeseast.github.io/visible-data/2013/08/28/responsive-charts-with-d3/
fonte
É meio feio se o código de redimensionamento for quase do tamanho do código para criar o gráfico em primeiro lugar. Então, em vez de redimensionar todos os elementos do gráfico existente, por que não simplesmente recarregá-lo? Aqui está como funcionou para mim:
A linha crucial é
d3.select('svg').remove();
. Caso contrário, cada redimensionamento adicionará outro elemento SVG abaixo do anterior.fonte
Nos layouts de força, simplesmente definir os atributos 'height' e 'width' não funcionará para re-centralizar / mover o gráfico para o contêiner svg. No entanto, há uma resposta muito simples que funciona para os Layouts de força encontrados aqui . Em suma:
Use o mesmo (qualquer) evento que desejar.
Supondo que você tenha variáveis svg & force:
Dessa forma, você não renderiza novamente o gráfico completamente, definimos os atributos e d3 recalcula as coisas conforme necessário. Isso pelo menos funciona quando você usa um ponto de gravidade. Não tenho certeza se esse é um pré-requisito para esta solução. Alguém pode confirmar ou negar ?
Saúde, g
fonte
Para aqueles que usam gráficos direcionados por força no D3 v4 / v5, o
size
método não existe mais. Algo como o seguinte funcionou para mim (com base nesta questão do github ):fonte
Se você deseja vincular a lógica personalizada ao redimensionamento de eventos, hoje em dia você pode começar a usar a API do navegador ResizeObserver para a caixa delimitadora de um SVGElement.
Isso também resolverá o caso quando o contêiner for redimensionado devido à alteração do tamanho dos elementos próximos.
Há um polyfill para suporte mais amplo ao navegador.
É assim que pode funcionar no componente de interface do usuário:
fonte