Spec memiliki fungsi context.measureText (teks) yang akan memberi tahu Anda berapa lebar yang diperlukan untuk mencetak teks itu, tetapi saya tidak dapat menemukan cara untuk mengetahui seberapa tinggi itu. Saya tahu ini didasarkan pada font, tapi saya tidak tahu untuk mengubah string font ke ketinggian teks.
javascript
text
canvas
swampsjohn
sumber
sumber
M̶̢̹̝͖̦̖̭͕̭̣͆̃̀̅̒̊͌̿ͅ
, jadi ini adalah masalah yang sangat rumit jadi selesaikan untuk kasus umum.Jawaban:
PEMBARUAN - untuk contoh kerja ini, saya menggunakan teknik ini di editor Carota .
Sebagai lanjutan dari jawaban ellisbben, berikut adalah versi yang disempurnakan untuk mendapatkan kenaikan dan penurunan dari garis dasar, yaitu sama dengan
tmAscent
dantmDescent
dikembalikan oleh API GetTextMetric Win32 . Ini diperlukan jika Anda ingin menjalankan teks yang dibungkus kata dengan bentang dalam berbagai font / ukuran.Gambar di atas dihasilkan pada kanvas di Safari, merah menjadi garis atas di mana kanvas disuruh menggambar teks, hijau sebagai garis dasar dan biru menjadi bagian bawah (jadi merah ke biru adalah ketinggian penuh).
Menggunakan jQuery untuk ringkas:
Selain elemen teks, saya menambahkan div dengan
display: inline-block
sehingga saya dapat mengaturvertical-align
gayanya, dan kemudian mencari tahu di mana browser telah meletakkannya.Jadi, Anda mendapatkan kembali objek dengan
ascent
,descent
danheight
(yang hanyaascent
+descent
untuk kenyamanan). Untuk mengujinya, ada baiknya memiliki fungsi yang menarik garis horizontal:Kemudian Anda dapat melihat bagaimana teks diposisikan di kanvas relatif ke atas, garis dasar dan bawah:
sumber
getTextHeight()
untukvar text = $('<span>Hg</span>').css({ 'font-family': fontName, 'font-size' : fontSize });
, yaitu menambahkan ukuran secara terpisah.<div></div>
untuk<div style="white-space : nowrap;"></div>
menangani string yang sangat panjangAnda bisa mendapatkan perkiraan ketinggian vertikal yang sangat dekat dengan memeriksa panjang modal M.
sumber
Spek kanvas tidak memberi kita metode untuk mengukur ketinggian string. Namun, Anda dapat mengatur ukuran teks Anda dalam piksel dan biasanya Anda bisa mengetahui apa batas vertikal relatif mudah.
Jika Anda membutuhkan sesuatu yang lebih tepat maka Anda bisa melempar teks ke kanvas dan kemudian mendapatkan data piksel dan mencari tahu berapa banyak piksel yang digunakan secara vertikal. Ini akan relatif sederhana, tetapi tidak terlalu efisien. Anda bisa melakukan sesuatu seperti ini (berhasil, tetapi menarik beberapa teks ke kanvas Anda yang ingin Anda hapus):
Untuk Bespin mereka melakukan ketinggian palsu dengan mengukur lebar huruf kecil 'm' ... Saya tidak tahu bagaimana ini digunakan, dan saya tidak akan merekomendasikan metode ini. Berikut adalah metode Bespin yang relevan:
sumber
em
adalah pengukuran font relatif di mana satu em sama dengan tinggi hurufM
dalam ukuran font default.Browser mulai mendukung metrik teks tingkat lanjut , yang akan membuat tugas ini sepele ketika didukung secara luas:
fontHeight
memberi Anda tinggi kotak pembatas yang konstan terlepas dari string yang diberikan.actualHeight
khusus untuk string yang sedang dirender.Spec: https://www.w3.org/TR/2012/CR-2dcontext-20121217/#dom-textmetrics-fontboundingboxascent dan bagian di bawahnya.
Status dukungan (20-Agustus-2017):
sumber
EDIT: Apakah Anda menggunakan transformasi kanvas? Jika demikian, Anda harus melacak matriks transformasi. Metode berikut harus mengukur ketinggian teks dengan transformasi awal.
EDIT # 2: Anehnya kode di bawah ini tidak menghasilkan jawaban yang benar ketika saya menjalankannya di halaman StackOverflow ini; sangat mungkin bahwa keberadaan beberapa aturan gaya dapat merusak fungsi ini.
Kanvas menggunakan font seperti yang didefinisikan oleh CSS, jadi secara teori kita bisa menambahkan potongan teks yang sesuai gaya ke dokumen dan mengukur tingginya. Saya pikir ini jauh lebih mudah daripada rendering teks dan kemudian memeriksa data piksel dan juga harus menghormati ascenders dan descenders. Lihat yang berikut ini:
Anda harus memastikan Anda mendapatkan gaya font yang benar pada elemen DOM yang Anda ukur tingginya tetapi itu cukup mudah; Anda benar-benar harus menggunakan sesuatu seperti
sumber
Bukankah tinggi teks dalam piksel sama dengan ukuran font (dalam poin) jika Anda mendefinisikan font menggunakan context.font?
sumber
Seperti yang disarankan JJ Stiff, Anda dapat menambahkan teks ke rentang dan kemudian mengukur offsetHeight rentang.
Seperti yang ditunjukkan pada HTML5Rocks
sumber
Hanya untuk menambah jawaban Daniel (yang hebat! Dan benar sekali!), Versi tanpa JQuery:
Saya baru saja menguji kode di atas dan berfungsi dengan baik pada Chrome, FF, dan Safari terbaru di Mac.
EDIT: Saya telah menambahkan ukuran font juga dan diuji dengan webfont daripada font sistem - bekerja luar biasa.
sumber
Saya memecahkan masalah ini langsung - menggunakan manipulasi piksel.
Inilah jawaban grafisnya:
Ini kode:
sumber
Saya sedang menulis terminal emulator jadi saya perlu menggambar persegi panjang di sekitar karakter.
Jelas jika Anda ingin jumlah ruang yang dibutuhkan karakter, itu tidak akan membantu. Tapi itu akan memberi Anda perkiraan yang baik untuk penggunaan tertentu.
sumber
Saya telah menerapkan perpustakaan yang bagus untuk mengukur tinggi dan lebar teks yang tepat menggunakan kanvas HTML. Ini harus melakukan apa yang Anda inginkan.
https://github.com/ChrisBellew/text-measurer.js
sumber
Ini adalah fungsi sederhana. Tidak perlu perpustakaan.
Saya menulis fungsi ini untuk mendapatkan batas atas dan bawah relatif terhadap baseline. Jika
textBaseline
diatur kealphabetic
. Apa yang dilakukannya adalah menciptakan kanvas lain, dan kemudian menggambar di sana, dan kemudian menemukan pixel paling kosong paling atas dan paling bawah. Dan itu adalah batas atas dan bawah. Ini mengembalikannya sebagai relatif, jadi jika tinggi 20px, dan tidak ada yang di bawah garis dasar, maka batas atas adalah-20
.Anda harus memasukkan karakter ke dalamnya. Kalau tidak, itu akan memberi Anda 0 tinggi dan 0 lebar, jelas.
Pemakaian:
Inilah fungsinya:
relativeBot
,,relativeTop
danheight
hal-hal yang berguna di objek kembali.Berikut ini contoh penggunaannya:
The
relativeBot
danrelativeTop
adalah apa yang Anda lihat dalam gambar ini di sini:https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Drawing_text
sumber
satu jawaban baris
CSS "line-height: normal" adalah antara 1 dan 1.2
baca di sini untuk info lebih lanjut
sumber
Lucu bahwa TextMetrics hanya memiliki lebar dan tidak ada tinggi:
http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#textmetrics
Bisakah Anda menggunakan Span seperti pada contoh ini?
http://mudcu.be/journal/2011/01/html5-typographic-metrics/#alignFix
sumber
Inilah yang saya lakukan berdasarkan beberapa jawaban lain di sini:
sumber
Pertama-tama, Anda perlu mengatur ketinggian ukuran font, dan kemudian sesuai dengan nilai tinggi font untuk menentukan ketinggian saat ini dari teks Anda adalah berapa banyak, baris teks silang, tentu saja, ketinggian yang sama dari font perlu terakumulasi, jika teks tidak melebihi Tinggi kotak teks terbesar, semua tampilan, jika tidak, hanya menampilkan teks dalam teks kotak. Nilai tinggi membutuhkan definisi Anda sendiri. Semakin tinggi tinggi prasetel, semakin besar tinggi teks yang perlu ditampilkan dan dicegat.
Setelah efek diproses (selesaikan)
Sebelum efek diproses (belum terpecahkan)
sumber
Saya menemukan bahwa JUST FOR ARIAL cara paling sederhana, tercepat dan paling akurat untuk menemukan ketinggian kotak pembatas adalah dengan menggunakan lebar huruf-huruf tertentu. Jika Anda berencana untuk menggunakan font tertentu tanpa membiarkan pengguna untuk memilih font yang berbeda, Anda dapat melakukan sedikit riset untuk menemukan huruf yang tepat yang melakukan pekerjaan untuk font tersebut.
sumber
pengaturan ukuran font mungkin tidak praktis, karena pengaturan
ctx.font = ''
akan menggunakan yang ditentukan oleh CSS dan juga tag font yang tertanam. Jika Anda menggunakan font CSS, Anda tidak tahu tingginya dari cara yang terprogram, menggunakan metode ukur, yang sangat singkat. Pada catatan lain, IE8 TIDAK mengembalikan lebar dan tinggi.
sumber
Ini berfungsi 1) untuk teks multiline juga 2) dan bahkan di IE9!
sumber
Saya tahu ini adalah pertanyaan lama, tetapi untuk referensi di masa mendatang saya ingin menambahkan solusi pendek, minimal, hanya JS (tanpa jquery) yang saya percaya orang dapat memperoleh manfaat dari:
sumber
Dalam situasi normal, yang berikut ini harus berfungsi:
sumber
Ini gila ... Tinggi teks adalah ukuran font .. Tidak ada di antara Anda yang membaca dokumentasi?
ini akan mengatur ketinggian ke 22px.
satu-satunya alasan ada ..
adalah karena lebar string tidak dapat ditentukan kecuali ia tahu string yang Anda inginkan lebar tetapi untuk semua string yang digambar dengan font .. tingginya akan 22px.
jika Anda menggunakan pengukuran lain dari px maka tingginya akan tetap sama tetapi dengan pengukuran itu maka yang paling harus Anda lakukan adalah mengonversi pengukuran.
sumber
Solusi perkiraan:
Ini akan menghasilkan font monospace yang akurat.
sumber