Saya bertanya-tanya apakah ada cara untuk menghitung baris di dalam div misalnya. Katakanlah kita memiliki div seperti ini:
<div id="content">hello how are you?</div>
Bergantung pada banyak faktor, div dapat memiliki satu, atau dua, atau bahkan empat baris teks. Apakah ada cara untuk mengetahui skrip?
Dengan kata lain, apakah jeda otomatis terwakili di DOM?
javascript
html
dom
buti-oxa
sumber
sumber
line-height
(yang tidak diatur secara eksplisit) adalah dengan menggunakanwindow.getComputedStyle(element, null).getPropertyValue('line-height')
Salah satu solusinya adalah memasukkan setiap kata dalam tag span menggunakan script. Kemudian jika dimensi Y dari tag span tertentu lebih kecil daripada dimensi Y dari tag span yang diberikan sebelumnya, maka baris baru telah terjadi.
sumber
Lihat fungsi getClientRects () yang bisa digunakan untuk menghitung jumlah baris dalam sebuah elemen. Berikut ini contoh cara menggunakannya.
Ini mengembalikan objek DOM javascript. Jumlah garis dapat diketahui dengan melakukan ini:
Itu dapat mengembalikan ketinggian setiap baris, dan banyak lagi. Lihat berbagai hal yang dapat dilakukan dengan menambahkan ini ke skrip Anda, lalu cari di log konsol Anda.
Meskipun beberapa hal yang perlu diperhatikan adalah ini hanya berfungsi jika elemen penampungnya sebaris, namun Anda dapat mengelilingi elemen inline penampung dengan elemen blok untuk mengontrol lebarnya seperti ini:
Meskipun saya tidak merekomendasikan pengkodean keras gaya seperti itu. Itu hanya untuk tujuan contoh.
sumber
Saya tidak puas dengan jawaban di sini dan pertanyaan lain. Jawaban berperingkat tertinggi tidak memperhitungkan
padding
atauborder
memperhitungkan, dan karena itu jelas mengabaikanbox-sizing
juga. Jawaban saya menggabungkan beberapa teknik di sini dan dan di utas lainnya untuk mendapatkan solusi yang sesuai dengan kepuasan saya.Ini tidak sempurna: Ketika tidak ada nilai numerik yang dapat diambil untuk
line-height
(misalnyanormal
atauinherit
), ini hanya menggunakanfont-size
dikalikan dengan1.2
. Mungkin orang lain dapat menyarankan cara yang andal untuk mendeteksi nilai piksel dalam kasus tersebut.Selain itu, ia mampu menangani dengan benar sebagian besar gaya dan kasing yang telah saya lemparkan.
jsFiddle untuk bermain-main dan menguji. Juga sebaris di bawah.
sumber
Kloning objek kontainer dan tulis 2 huruf dan hitung tingginya. Ini mengembalikan tinggi sebenarnya dengan semua gaya diterapkan, tinggi garis, dll. Sekarang, hitung tinggi objek / ukuran huruf. Di Jquery, tingginya melebihi padding, margin, dan border, sangat bagus untuk menghitung tinggi sebenarnya dari setiap baris:
Jika Anda menggunakan font langka dengan tinggi yang berbeda untuk setiap huruf, ini tidak berhasil. Tetapi bekerja dengan semua font normal, seperti Arial, mono, komik, Verdana, dll. Uji dengan font Anda.
Contoh:
Hasil:
6 Lines
Bekerja di semua browser tanpa fungsi langka di luar standar.
Periksa: https://jsfiddle.net/gzceamtr/
sumber
clone
→cloneNode
,hide
→style.visibility = "hidden"
,html('a<br>b')
→textContent='a\r\nb'
,appendTo('body')
→document.documentElement.appendChild
,height()
→getBoundingClientRect().height
Bagi mereka yang menggunakan jQuery http://jsfiddle.net/EppA2/3/
sumber
$(selector).css('line-height');
, Anda tidak akan mendapatkan angka dari fungsi itu.Saya yakin itu tidak mungkin sekarang. Tapi memang begitu.
Implementasi getClientRects dari IE7 melakukan apa yang saya inginkan. Buka halaman ini di IE8, coba muat ulang dengan lebar jendela yang bervariasi, dan lihat bagaimana jumlah baris pada elemen pertama berubah sesuai. Inilah baris kunci javascript dari halaman itu:
Sayangnya bagi saya, Firefox selalu mengembalikan satu persegi panjang klien per elemen, dan IE8 melakukan hal yang sama sekarang. (Halaman Martin Honnen berfungsi hari ini karena IE membuatnya dalam tampilan compat IE; tekan F12 di IE8 untuk bermain dengan mode yang berbeda.)
Ini menyedihkan. Sepertinya sekali lagi implementasi spesifikasi Firefox yang literal tetapi tidak berharga menang atas aplikasi Microsoft yang berguna. Atau apakah saya melewatkan situasi di mana getClientRects baru dapat membantu pengembang?
sumber
berdasarkan jawaban GuyPaddock dari atas, ini sepertinya berhasil untuk saya
trik di sini adalah meningkatkan tinggi baris sedemikian rupa sehingga akan "menelan" perbedaan browser / OS apa pun dalam cara merender font
Memeriksa dengan berbagai gaya dan ukuran font / keluarga yang berbeda hanya hal yang tidak diperhitungkan (karena dalam kasus saya itu tidak masalah), adalah padding - yang dapat dengan mudah ditambahkan ke solusi.
sumber
Tidak, tidak bisa diandalkan. Ada terlalu banyak variabel yang tidak diketahui
Daftarnya terus berlanjut. Suatu hari nanti saya berharap akan ada metode yang andal untuk menyelesaikan ini dengan JavaScript, tetapi sampai hari itu tiba, Anda kurang beruntung.
Saya benci jawaban seperti ini dan saya berharap seseorang bisa membuktikan bahwa saya salah.
sumber
Anda harus bisa membagi panjang ('\ n') dan mendapatkan jeda baris.
update: ini berfungsi di FF / Chrome tetapi tidak di IE.
sumber
getClientRects
kembalikan klien rects seperti ini dan jika Anda ingin mendapatkan garis, gunakan fungsi ikuti seperti inisumber
Saya menemukan cara untuk menghitung nomor baris saat saya mengembangkan editor html. Metode utamanya adalah:
Di IE Anda dapat memanggil getBoundingClientRects, yang mengembalikan setiap baris sebagai persegi panjang
Di webkit atau mesin html standar baru, ia mengembalikan setiap elemen atau persegi panjang klien node, dalam hal ini Anda dapat membandingkan setiap persegi panjang, maksud saya setiap persegi panjang harus ada yang terbesar, jadi Anda dapat mengabaikan persegi panjang yang tingginya lebih kecil (jika ada bagian atas persegi panjang yang lebih kecil dari itu dan bagian bawah lebih besar darinya, kondisinya benar.)
jadi mari kita lihat hasil tesnya:
Persegi panjang hijau adalah persegi panjang terbesar di setiap baris
Persegi panjang merah adalah batas seleksi
Persegi panjang biru adalah batas dari awal hingga seleksi setelah meluas, kita melihatnya mungkin lebih besar dari persegi panjang merah, jadi kita harus memeriksa setiap bagian bawah persegi panjang untuk membatasinya harus lebih kecil dari bagian bawah persegi panjang merah.
sumber
Coba solusi ini:
Anda dapat melihatnya beraksi di sini: https://jsfiddle.net/u0r6avnt/
Coba ubah ukuran panel pada halaman (untuk membuat sisi kanan halaman lebih lebar atau lebih pendek) dan kemudian jalankan lagi untuk melihat bahwa panel dapat mengetahui berapa banyak garis yang ada.
Masalah ini lebih sulit daripada yang terlihat, tetapi sebagian besar kesulitan berasal dari dua sumber:
Penyajian teks terlalu rendah di browser untuk ditanyai langsung dari JavaScript. Bahkan pseudo-selector CSS :: first-line tidak berperilaku seperti penyeleksi lain (Anda tidak dapat membalikkannya, misalnya, untuk menerapkan gaya ke semua kecuali baris pertama).
Konteks memainkan peran besar dalam cara Anda menghitung jumlah garis. Misalnya, jika tinggi baris tidak secara eksplisit disetel dalam hierarki elemen target, Anda mungkin mendapatkan kembali "normal" sebagai tinggi baris. Selain itu, elemen tersebut mungkin menggunakan
box-sizing: border-box
dan oleh karena itu tunduk pada bantalan.Pendekatan saya meminimalkan # 2 dengan mengontrol ketinggian garis secara langsung dan memfaktorkan dalam metode ukuran kotak, yang mengarah ke hasil yang lebih deterministik.
sumber
Dalam kasus tertentu, seperti tautan yang membentang di beberapa baris dalam teks tidak rata, Anda bisa mendapatkan jumlah baris dan setiap koordinat dari setiap baris, saat Anda menggunakan ini:
https://developer.mozilla.org/en-US/docs/Web/API/Element/getClientRects
Ini berfungsi karena setiap baris akan berbeda meskipun sedikit. Selama ada, mereka digambar sebagai "persegi panjang" yang berbeda oleh perender.
sumber
Mengikuti saran @BobBrunius 2010, saya membuat ini dengan jQuery. Tidak diragukan lagi ini dapat ditingkatkan tetapi mungkin membantu beberapa.
sumber
Anda dapat membandingkan tinggi elemen dan tinggi elemen dengan
line-height: 0
sumber