Saya ingin menggunakan JavaScript untuk menghitung lebar string. Apakah ini mungkin tanpa harus menggunakan jenis huruf monospace?
Jika tidak built-in, satu-satunya ide saya adalah membuat tabel lebar untuk setiap karakter, tetapi ini sangat tidak masuk akal terutama mendukung Unicode dan ukuran tipe yang berbeda (dan semua browser dalam hal ini).
javascript
textbox
Yakub
sumber
sumber
Jawaban:
Buat DIV yang ditata dengan gaya berikut. Di JavaScript Anda, atur ukuran font dan atribut yang Anda coba ukur, masukkan string Anda ke DIV, lalu baca lebar dan tinggi DIV saat ini. Itu akan meregang agar sesuai dengan konten dan ukurannya akan berada dalam beberapa piksel dari ukuran string yang diberikan.
sumber
+1
pada setiap dimensi?Di HTML 5 , Anda bisa menggunakan metode Canvas.measureText (penjelasan lebih lanjut di sini ).
Coba biola ini :
Biola ini membandingkan metode Kanvas ini dengan variasi metode berbasis DOM Bob Monteverde , sehingga Anda dapat menganalisis dan membandingkan keakuratan hasil.
Ada beberapa keuntungan dari pendekatan ini, termasuk:
textAlign
dantextBaseline
.CATATAN: Saat Anda menambahkan teks ke DOM Anda, ingatlah untuk juga memperhitungkan padding, margin, dan border .
CATATAN 2: Pada beberapa browser, metode ini menghasilkan akurasi sub-pixel (hasilnya adalah angka floating point), pada yang lain tidak (hasilnya hanya int). Anda mungkin ingin menjalankan
Math.floor
(atauMath.ceil
) pada hasilnya, untuk menghindari inkonsistensi. Karena metode berbasis DOM tidak pernah akurat sub-pixel, metode ini bahkan memiliki presisi yang lebih tinggi daripada metode lain di sini.Menurut jsperf ini (terima kasih kepada kontributor dalam komentar), metode Canvas dan metode berbasis DOM hampir sama cepatnya, jika caching ditambahkan ke metode berbasis DOM dan Anda tidak menggunakan Firefox. Di Firefox, untuk beberapa alasan, metode Canvas ini jauh lebih cepat daripada metode berbasis DOM (per September 2014).
sumber
strokeText()
ataufillText()
. Mungkin Anda bermaksud mengomentari jawaban yang berbeda?Inilah yang saya kocok bersama tanpa contoh. Sepertinya kita semua ada di halaman yang sama.
Penggunaannya sederhana:
"a string".width()
** Ditambahkan
white-space: nowrap
sehingga string dengan lebar lebih besar dari lebar jendela dapat dihitung.sumber
String
karena mengurangi pemisahan kekhawatiran program Anda (kode inti terpisah vs kode UI). Bayangkan Anda ingin mem-porting kode inti Anda ke platform dengan kerangka UI yang sangat berbeda ...o[0].getBoundingClientRect().width
seperti yang disarankan di sini: stackoverflow.com/a/16072668/936397jQuery:
sumber
Ini bekerja untuk saya ...
sumber
The ExtJS javascript perpustakaan memiliki kelas besar yang disebut Ext.util.TextMetrics bahwa "menyediakan pengukuran pixel yang tepat untuk blok teks sehingga Anda dapat menentukan dengan tepat seberapa tinggi dan lebar, dalam pixel, blok diberikan teks akan". Anda dapat menggunakannya secara langsung atau melihat sumbernya ke kode untuk melihat bagaimana hal ini dilakukan.
http://docs.sencha.com/extjs/6.5.3/modern/Ext.util.TextMetrics.html
sumber
Saya suka "satu-satunya ide" Anda hanya melakukan peta lebar karakter statis! Ini sebenarnya berfungsi dengan baik untuk tujuan saya. Terkadang, untuk alasan kinerja atau karena Anda tidak memiliki akses mudah ke DOM, Anda mungkin ingin kalkulator mandiri yang cepat dikalibrasi ke satu font. Jadi, inilah yang dikalibrasi ke Helvetica; meneruskan string dan (opsional) ukuran font:
Array jelek raksasa itu adalah lebar karakter ASCII yang diindeks oleh kode karakter. Jadi ini hanya mendukung ASCII (selain itu mengasumsikan lebar karakter rata-rata). Untungnya, lebar pada dasarnya berskala linier dengan ukuran font, sehingga berfungsi cukup baik pada ukuran font apa pun. Itu terasa kurang kesadaran tentang kerning atau ligatur atau apa pun.
Untuk "mengkalibrasi", saya hanya merender setiap karakter hingga charCode 126 (the perkasa tilde) pada svg dan mendapatkan kotak pembatas dan menyimpannya ke array ini; lebih banyak kode dan penjelasan dan demo di sini .
sumber
* fontSize
dan gunakan saja 'em'Saya menulis alat kecil untuk itu. Mungkin bermanfaat bagi seseorang. Ini bekerja tanpa jQuery .
https://github.com/schickling/calculate-size
Pemakaian:
Fiddle: http://jsfiddle.net/PEvL8/
sumber
Anda dapat menggunakan kanvas sehingga Anda tidak perlu terlalu banyak berurusan dengan properti css:
sumber
Ini akan berfungsi selama tag <span> tidak memiliki gaya lain yang diterapkan padanya. offsetWidth akan mencakup lebar batas, bantalan horizontal, lebar scrollbar vertikal, dll.
sumber
Kode-snips di bawah ini, "menghitung" lebar span-tag, menambahkan "..." padanya jika terlalu panjang dan mengurangi panjang teks, sampai pas dengan induknya (atau sampai ia mencoba lebih dari seribu kali)
CSS
HTML
JavaScript (dengan jQuery)
sumber
Yang lebih baik adalah mendeteksi apakah teks akan pas sebelum Anda menampilkan elemen. Jadi Anda dapat menggunakan fungsi ini yang tidak memerlukan elemen berada di layar.
Pemakaian:
sumber
Jika ada orang lain yang datang ke sini mencari cara untuk mengukur lebar string dan cara untuk mengetahui apa ukuran font terbesar yang sesuai dengan lebar tertentu, berikut adalah fungsi yang dibangun di atas solusi @ Domi dengan pencarian biner :
sumber
Coba kode ini:
sumber
Lebar dan tinggi teks dapat diperoleh dengan
clientWidth
danclientHeight
pastikan properti posisi style diatur ke absolut
tidak wajib berada di dalam
div
, bisa di dalamp
atauspan
sumber
Membangun dari jawaban Deepak Nadar , saya mengubah parameter fungsi untuk menerima gaya teks dan font. Anda tidak perlu merujuk elemen. Juga,
fontOptions
memiliki default, sehingga Anda tidak perlu menyediakan semuanya.sumber
Saya kira ini hampir mirip dengan entri Depak, tetapi didasarkan pada karya Louis Lazaris yang diterbitkan pada sebuah artikel di halaman impressivewebs
Acara fit digunakan untuk menjalankan pemanggilan fungsi secara langsung setelah fungsi dikaitkan dengan kontrol.
misal: $ ('input'). autofit (). trigger ("fit");
sumber
Tanpa jQuery:
sumber
Contoh biola yang bekerja: http://jsfiddle.net/tdpLdqpo/1/
HTML:
Kode JavaScript:
sumber
Menjumlahkan semua lebar persegi panjang yang dikembalikan menghasilkan lebar teks total dalam piksel.
sumber
Saya telah membuat modul ES6 kecil (menggunakan jQuery):
Mudah digunakan:
Hal keren yang mungkin Anda perhatikan - memungkinkan untuk memperhitungkan semua atribut CSS, bahkan paddings!
sumber
Anda juga dapat melakukan ini dengan createRange, yang lebih akurat, daripada teknik kloning teks:
sumber
sumber