Saya sedang mengerjakan beberapa ECMAScript / JavaScript untuk file SVG dan perlu mendapatkan width
dan height
dari text
elemen sehingga saya dapat mengubah ukuran persegi panjang yang mengelilinginya. Dalam HTML saya akan dapat menggunakan atribut offsetWidth
and offsetHeight
pada elemen tetapi tampaknya properti tersebut tidak tersedia.
Ini fragmen yang perlu saya kerjakan. Saya perlu mengubah lebar persegi panjang setiap kali saya mengubah teks tetapi saya tidak tahu bagaimana mendapatkan elemen sebenarnya width
(dalam piksel) text
.
<rect x="100" y="100" width="100" height="100" />
<text>Some Text</text>
Ada ide?
javascript
dom
text
svg
Stephen Sorensen
sumber
sumber
Mengenai panjang teks, tautan tampaknya menunjukkan BBox dan getComputedTextLength () mungkin mengembalikan nilai yang sedikit berbeda, tetapi yang cukup dekat satu sama lain.
http://bl.ocks.org/MSCAU/58bba77cdcae42fc2f44
sumber
bekerja untuk saya di
sumber
Bagaimana dengan sesuatu seperti ini untuk kompatibilitas:
Ini mengembalikan rata-rata hasil valid dari ketiga metode. Anda dapat meningkatkannya untuk membuang pencilan atau mendukung
getComputedTextLength
jika elemennya adalah elemen teks.Peringatan: Seperti yang dikatakan dalam komentar,
getBoundingClientRect
itu rumit. Hapus dari metode atau gunakan ini hanya pada elemen di managetBoundingClientRect
akan mengembalikan hasil yang baik, jadi tidak ada rotasi dan mungkin tidak ada penskalaan (?)sumber
Tidak yakin mengapa, tetapi tidak ada metode di atas yang berhasil untuk saya. Saya cukup berhasil dengan metode kanvas, tetapi saya harus menerapkan semua jenis faktor skala. Bahkan dengan faktor skala, saya masih memiliki hasil yang tidak konsisten antara Safari, Chrome, dan Firefox.
Jadi, saya mencoba yang berikut ini:
Bekerja dengan luar biasa dan sangat tepat, tetapi hanya di Firefox. Faktor skala untuk menyelamatkan Chrome dan Safari, tetapi tidak ada kegembiraan. Ternyata kesalahan Safari dan Chrome tidak linier dengan panjang string atau ukuran font.
Jadi, pendekatan nomor dua. Saya tidak terlalu peduli dengan pendekatan brute force, tetapi setelah berjuang dengan ini dan mematikan selama bertahun-tahun saya memutuskan untuk mencobanya. Saya memutuskan untuk menghasilkan nilai konstan untuk setiap karakter yang dapat dicetak. Biasanya ini akan agak membosankan, tetapi untungnya Firefox ternyata sangat akurat. Inilah dua solusi brute force saya:
Catatan: Cuplikan di atas harus dijalankan di Firefox untuk menghasilkan larik nilai yang akurat. Selain itu, Anda harus mengganti item array 32 dengan nilai lebar spasi di log konsol.
Saya cukup menyalin teks Firefox di layar, dan menempelkannya ke kode javascript saya. Sekarang saya memiliki array panjang karakter yang dapat dicetak, saya dapat mengimplementasikan fungsi get width. Ini kodenya:
Nah, itu dia. Brute force, tetapi sangat akurat di ketiga browser, dan tingkat frustrasi saya telah mencapai nol. Tidak yakin berapa lama ini akan bertahan seiring berkembangnya browser, tetapi seharusnya cukup lama bagi saya untuk mengembangkan teknik metrik font yang kuat untuk teks SVG saya.
sumber
Spesifikasi SVG memiliki metode khusus untuk mengembalikan info ini:
getComputedTextLength()
sumber