Saya menggambar sebar dengan d3.js. Dengan bantuan pertanyaan ini:
Dapatkan ukuran layar, halaman web saat ini dan jendela browser
Saya menggunakan jawaban ini:
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;
Jadi saya dapat memasukkan plot saya ke jendela pengguna seperti ini:
var svg = d3.select("body").append("svg")
.attr("width", x)
.attr("height", y)
.append("g");
Sekarang saya ingin sesuatu mengatur ukuran plot ketika pengguna mengubah ukuran jendela.
PS: Saya tidak menggunakan jQuery dalam kode saya.
javascript
d3.js
mthpvg
sumber
sumber
Jawaban:
Cari 'SVG responsif' sangat mudah untuk membuat SVG responsif dan Anda tidak perlu khawatir tentang ukuran lagi.
Inilah cara saya melakukannya:
Catatan: Segala sesuatu di gambar SVG akan berskala dengan lebar jendela. Ini termasuk lebar dan ukuran font stroke (bahkan yang diatur dengan CSS). Jika ini tidak diinginkan, ada solusi alternatif yang lebih terlibat di bawah ini.
Info lebih lanjut / tutorial:
http://thenewcode.com/744/Membuat-SVG-Responsive
http://soqr.fr/testsvg/embed-svg-liquid-layout-responsive-web-design.php
sumber
viewBox
Atribut harus diatur ke tinggi dan lebar yang relevan dari plot SVG Anda: di.attr("viewBox","0 0 " + width + " " + height)
manawidth
danheight
didefinisikan di tempat lain. Yaitu, kecuali Anda ingin SVG Anda dipotong oleh kotak tampilan. Anda mungkin juga ingin memperbaruipadding-bottom
parameter di css Anda agar sesuai dengan aspek rasio elemen svg Anda. Respons yang sangat baik - sangat membantu, dan berfungsi dengan baik. Terima kasih!top: 10px;
? Tampaknya salah bagi saya dan memberikan offset. Puting ke 0px berfungsi dengan baik.Gunakan window.onresize :
http://jsfiddle.net/Zb85u/1/
sumber
UPDATE cukup gunakan cara baru dari @cminatti
jawaban lama untuk tujuan bersejarah
IMO lebih baik menggunakan select () dan on () karena dengan begitu Anda dapat memiliki beberapa event handler ukuran ... hanya jangan terlalu gila
http://eyeseast.github.io/visible-data/2013/08/28/responsive-charts-with-d3/
sumber
Agak jelek jika kode pengubahan ukuran hampir sepanjang kode untuk membangun grafik di tempat pertama. Jadi alih-alih mengubah ukuran setiap elemen dari bagan yang ada, mengapa tidak me-reloadnya saja? Inilah cara kerjanya untuk saya:
Garis yang penting adalah
d3.select('svg').remove();
. Jika tidak, setiap pengubahan ukuran akan menambahkan elemen SVG lain di bawah yang sebelumnya.sumber
Dalam tata letak paksa, cukup atur atribut 'tinggi' dan 'lebar' tidak akan berfungsi untuk memusatkan kembali / memindahkan plot ke wadah svg. Namun, ada jawaban yang sangat sederhana yang berfungsi untuk Force Layouts yang ditemukan di sini . Singkatnya:
Gunakan acara yang sama (apa saja) yang Anda suka.
Maka dengan asumsi Anda memiliki variabel svg & force:
Dengan cara ini, Anda tidak membuat ulang grafik sepenuhnya, kami mengatur atribut dan menghitung ulang hal-hal yang diperlukan. Setidaknya ini berfungsi saat Anda menggunakan titik gravitasi. Saya tidak yakin apakah itu prasyarat untuk solusi ini. Adakah yang bisa mengkonfirmasi atau menyangkal?
Ceria, g
sumber
Bagi mereka yang menggunakan grafik gaya langsung di D3 v4 / v5,
size
metode ini tidak ada lagi. Sesuatu seperti yang berikut ini bekerja untuk saya (berdasarkan masalah github ini ):sumber
Jika Anda ingin mengikat logika khusus untuk mengubah ukuran acara, saat ini Anda dapat mulai menggunakan API browser ResizeObserver untuk kotak pembatas dari SVGElement.
Ini juga akan menangani kasus ketika wadah diubah ukurannya karena perubahan ukuran elemen di dekatnya.
Ada polyfill untuk dukungan browser yang lebih luas.
Ini adalah cara kerjanya di komponen UI:
sumber