Rysuję wykres rozrzutu za pomocą d3.js. Za pomocą tego pytania:
Uzyskaj rozmiar ekranu, bieżącą stronę internetową i okno przeglądarki
Korzystam z tej odpowiedzi:
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;
Jestem w stanie dopasować moją fabułę do okna użytkownika w następujący sposób:
var svg = d3.select("body").append("svg")
.attr("width", x)
.attr("height", y)
.append("g");
Teraz chciałbym, żeby coś zmieniło rozmiar działki, gdy użytkownik zmieni rozmiar okna.
PS: Nie używam jQuery w moim kodzie.
javascript
d3.js
mthpvg
źródło
źródło
Odpowiedzi:
Poszukaj „responsive SVG”. Utworzenie responsywnego SVG jest dość proste i nie musisz się już martwić o rozmiary.
Oto jak to zrobiłem:
Uwaga: wszystko na obrazie SVG będzie skalowane wraz z szerokością okna. Obejmuje to szerokość obrysu i rozmiary czcionek (nawet te ustawione za pomocą CSS). Jeśli nie jest to pożądane, poniżej znajdziesz więcej zaangażowanych alternatywnych rozwiązań.
Więcej informacji / tutoriale:
http://thenewcode.com/744/Make-SVG-Responsive
http://soqr.fr/testsvg/embed-svg-liquid-layout-responsive-web-design.php
źródło
viewBox
atrybut należy ustawić na odpowiednią wysokość i szerokość wykresu SVG:.attr("viewBox","0 0 " + width + " " + height)
gdziewidth
i gdzieheight
indziej. To znaczy, chyba że chcesz, aby Twój plik SVG został przycięty przez pole widoku. Możesz także zaktualizowaćpadding-bottom
parametr w swoim css, aby dopasować proporcje elementu svg. Doskonała odpowiedź - bardzo pomocna i działa na ucztę. Dzięki!top: 10px;
? Wydaje mi się to nieprawidłowe i zapewnia przesunięcie. Ustawienie 0px działa dobrze.Użyj window.onresize :
http://jsfiddle.net/Zb85u/1/
źródło
AKTUALIZACJA wystarczy użyć nowej metody z @cminatti
stara odpowiedź do celów historycznych
IMO lepiej jest używać select () i on (), ponieważ w ten sposób możesz mieć wiele programów obsługi zdarzeń zmiany rozmiaru ... po prostu nie denerwuj się
http://eyeseast.github.io/visible-data/2013/08/28/responsive-charts-with-d3/
źródło
To trochę brzydkie, jeśli kod zmiany rozmiaru jest prawie tak długi, jak kod do budowy wykresu na pierwszym miejscu. Więc zamiast zmieniać rozmiar każdego elementu istniejącego wykresu, dlaczego po prostu nie załadować go ponownie? Oto jak to dla mnie działało:
Kluczową linią jest
d3.select('svg').remove();
. W przeciwnym razie każda zmiana rozmiaru doda kolejny element SVG poniżej poprzedniego.źródło
Obowiązujące układy po prostu ustawienie atrybutów „wysokość” i „szerokość” nie będzie działać w celu ponownego wyśrodkowania / przeniesienia wykresu do kontenera svg. Istnieje jednak bardzo prosta odpowiedź, która działa dla układów siły znalezionych tutaj . W podsumowaniu:
Użyj tego samego (dowolnego) wydarzenia, które ci się podoba.
Zakładając, że masz zmienne svg i force:
W ten sposób nie renderujesz całkowicie wykresu, ustawiamy atrybuty i d3 ponownie oblicza rzeczy w razie potrzeby. Działa to przynajmniej wtedy, gdy używasz punktu ciężkości. Nie jestem pewien, czy jest to warunek wstępny tego rozwiązania. Czy ktoś może potwierdzić lub zaprzeczyć?
Pozdrawiam, g
źródło
Dla tych, którzy używają wykresów skierowanych na siłę w D3 v4 / v5,
size
metoda już nie istnieje. Działało dla mnie coś takiego: (w oparciu o ten problem z github ):źródło
Jeśli chcesz powiązać niestandardową logikę w celu zmiany rozmiaru zdarzenia, w dzisiejszych czasach możesz zacząć używać interfejsu API przeglądarki ResizeObserver do ramki granicznej SVGElement.
Będzie to również obsługiwać przypadek, gdy rozmiar kontenera zostanie zmieniony z powodu zmiany rozmiaru pobliskich elementów.
Istnieje polifill dla szerszej obsługi przeglądarki.
Oto jak to może działać w komponencie interfejsu użytkownika:
źródło