Saya perlu menampilkan teks yang dimasukkan pengguna ke dalam div ukuran tetap. Yang saya inginkan adalah ukuran font disesuaikan secara otomatis sehingga teks memenuhi kotak sebanyak mungkin.
Jadi - Jika divnya adalah 400px x 300px. Jika seseorang memasuki ABC maka itu font yang sangat besar. Jika mereka memasukkan paragraf, maka itu akan menjadi font kecil.
Saya mungkin ingin memulai dengan ukuran font maksimum - mungkin 32px, dan sementara teks terlalu besar untuk muat wadah, perkecil ukuran font sampai cocok.
Jawaban:
Terima kasih Attack . Saya ingin menggunakan jQuery.
Anda menunjuk saya ke arah yang benar, dan inilah yang akhirnya saya dapatkan:
Berikut ini tautan ke plugin: https://plugins.jquery.com/textfill/
Dan tautan ke sumber: http://jquery-textfill.github.io/
dan html saya seperti ini
Ini adalah plugin jquery pertama saya, jadi mungkin tidak sebagus yang seharusnya. Pointer tentu diterima.
sumber
404
.Saya tidak menemukan salah satu solusi sebelumnya yang cukup memadai karena kinerja yang buruk, jadi saya membuat sendiri yang menggunakan matematika sederhana alih-alih perulangan. Seharusnya berfungsi dengan baik di semua browser juga.
Menurut kasus uji kinerja ini jauh lebih cepat daripada solusi lain yang ditemukan di sini.
Jika Anda ingin berkontribusi saya telah menambahkan ini ke Gist .
sumber
.css("font-size")
dalam satu lingkaran. Dari mana Anda mendapatkan itu? Solusi saya mungkin lebih cepat karena tidak ada hal-hal mewah yang Anda tambahkan ke plugin Anda. Anda dapat menambahkan plugin Anda ke jsperf dan kita akan melihat mana yang paling cepat;)Meskipun saya suka upvotes yang sesekali saya dapatkan untuk jawaban ini (terima kasih!), Ini sebenarnya bukan pendekatan terhebat untuk masalah ini. Silakan periksa beberapa jawaban indah lainnya di sini, terutama yang telah menemukan solusi tanpa mengulang.
Namun, demi referensi, inilah jawaban asli saya :
Dan inilah versi dengan kelas :
sumber
offsetWidth
, saya juga harus membuat variabel untuk ukuran dan kemudian menambahkan pxtextSpan.style.fontSize = size+"px";
Sebagian besar jawaban lain menggunakan loop untuk mengurangi ukuran font hingga pas pada div, ini SANGAT lambat karena halaman perlu merender ulang elemen setiap kali font berubah ukuran. Saya akhirnya harus menulis algoritma saya sendiri untuk membuatnya tampil dengan cara yang memungkinkan saya untuk memperbarui isinya secara berkala tanpa membekukan browser pengguna. Saya menambahkan beberapa fungsionalitas lain (memutar teks, menambahkan padding) dan mengemasnya sebagai plugin jQuery, Anda bisa mendapatkannya di:
https://github.com/DanielHoffmann/jquery-bigtext
cukup telepon
dan itu akan pas dengan wadah Anda.
Lihat beraksi di sini:
http://danielhoffmann.github.io/jquery-bigtext/
Untuk saat ini memiliki beberapa batasan, div harus memiliki tinggi dan lebar yang tetap dan tidak mendukung pembungkusan teks menjadi beberapa baris.
Saya akan berusaha untuk mendapatkan opsi untuk mengatur ukuran font maksimum.
Sunting: Saya telah menemukan beberapa masalah dengan plugin, itu tidak menangani model kotak lain selain yang standar dan div tidak dapat memiliki margin atau batas. Saya akan mengerjakannya.
Sunting2: Saya sekarang telah memperbaiki masalah dan keterbatasan itu dan menambahkan lebih banyak opsi. Anda dapat mengatur ukuran font maksimum dan Anda juga dapat memilih untuk membatasi ukuran font menggunakan lebar, tinggi atau keduanya. Saya akan berusaha menerima nilai lebar-lebar dan tinggi-maksimum di elemen pembungkus.
Edit3: Saya telah memperbarui plugin ke versi 1.2.0. Pembersihan besar-besaran pada kode dan opsi baru (verticalAlign, horizontalAlign, textAlign) dan dukungan untuk elemen-elemen dalam di dalam tag span (seperti ikon garis-putus atau ikon-mengagumkan.)
sumber
Ini didasarkan pada apa yang diposting GeekyMonkey di atas, dengan beberapa modifikasi.
sumber
Berikut adalah metode pengulangan yang ditingkatkan yang menggunakan pencarian biner untuk menemukan ukuran terbesar yang sesuai dengan induk dalam langkah sesedikit mungkin (ini lebih cepat dan lebih akurat daripada melangkah dengan ukuran font tetap). Kode ini juga dioptimalkan dalam beberapa cara untuk kinerja.
Secara default, 10 langkah pencarian biner akan dilakukan, yang akan mencapai 0,1% dari ukuran optimal. Anda bisa mengatur numIter ke beberapa nilai N untuk mendapatkan dalam 1/2 ^ N dari ukuran optimal.
Sebut saja dengan pemilih CSS, misalnya:
fitToParent('.title-span');
sumber
vAlign
danpadding
.vAlign == true
mengatur ketinggian garis elemen yang dipilih dengan tinggi orangtua. Padding mengurangi ukuran akhir dengan nilai yang diteruskan. Standarnya menjadi 5. Saya pikir itu terlihat sangat bagus.Saya telah membuat arahan untuk AngularJS - sangat terinspirasi oleh jawaban GeekyMonkey tetapi tanpa ketergantungan jQuery.
Demo: http://plnkr.co/edit/8tPCZIjvO3VSApSeTtYr?p=preview
Markup
<div class="fittext" max-font-size="50" text="Your text goes here..."></div>
Pengarahan
sumber
resizeText
tampaknya dipanggil sebelumng-bind
benar - benar memberikan teks ke elemen, sehingga ukurannya berdasarkan pada teks sebelumnya daripada teks saat ini. Ini tidak terlalu buruk dalam demo di atas di mana ia disebut berulang kali sebagai tipe pengguna, tetapi jika dipanggil sekali pergi dari nol ke nilai nyata (seperti dalam satu arah mengikat) itu tetap pada ukuran maksimal.Saya bercabang script di atas dari Marcus Ekwall: https://gist.github.com/3945316 dan men-tweak itu untuk preferensi saya, sekarang menyala ketika jendela diubah ukurannya, sehingga anak selalu sesuai wadahnya. Saya telah menempelkan skrip di bawah ini untuk referensi.
sumber
Inilah modifikasi saya atas jawaban OP.
Singkatnya, banyak orang yang mencoba mengoptimalkan ini mengeluh bahwa loop sedang digunakan. Ya, meskipun loop bisa lambat, pendekatan lain mungkin tidak akurat.
Karena itu, pendekatan saya menggunakan Binary Search untuk menemukan Ukuran Font terbaik:
Ini juga memungkinkan elemen menentukan font minimum dan maksimum:
Lebih lanjut, algoritma ini tidak memiliki unit. Anda dapat menentukan
em
,rem
,%
, dll dan akan menggunakannya untuk hasil akhir.Inilah Fiddle: https://jsfiddle.net/fkhqhnqe/1/
sumber
Saya memiliki masalah yang persis sama dengan situs web saya. Saya memiliki halaman yang ditampilkan pada proyektor, di dinding, layar besar ..
Karena saya tidak tahu ukuran maksimum font saya, saya menggunakan kembali plugin di atas dari @GeekMonkey tetapi menambah ukuran font:
sumber
Ini adalah versi dari jawaban yang diterima yang juga dapat mengambil parameter minFontSize.
sumber
Anda dapat menggunakan FitText.js ( halaman github ) untuk menyelesaikan masalah ini. Sangat kecil dan efisien dibandingkan dengan TextFill. TextFill menggunakan loop sementara yang mahal dan FitText tidak.
Juga FitText lebih fleksibel (saya menggunakannya dalam proyect dengan persyaratan yang sangat khusus dan berfungsi seperti jagoan!).
HTML:
Anda juga dapat mengatur opsi untuk itu:
CSS:
Dan jika Anda membutuhkannya, FitText juga memiliki versi no-jQuery .
sumber
EDIT: Kode ini digunakan untuk menampilkan catatan di atas video HTML5. Ini mengubah ukuran font dengan cepat ketika video diubah ukurannya (ketika jendela browser diubah ukurannya). Catatan terhubung ke video (seperti catatan di YouTube), itulah sebabnya kode menggunakan instance bukannya pegangan DOM langsung.
Sesuai permintaan saya akan memasukkan beberapa kode yang saya gunakan untuk mencapai ini. (Kotak teks di atas video HTML5.) Kode itu sudah lama ditulis, dan saya pikir itu cukup berantakan. Karena pertanyaan sudah dijawab dan jawaban sudah lama diterima, saya tidak repot menulis ulang ini. Tetapi jika ada yang ingin menyederhanakan ini sedikit, Anda lebih dari diterima!
Anda mungkin perlu mengubah angka-angka ini dari font-family ke font-family. Cara yang baik untuk melakukan ini adalah mengunduh visualizer grafik gratis yang disebut GeoGebra. Ubah panjang teks dan ukuran kotak. Kemudian Anda mengatur ukuran secara manual. Plot hasil manual ke dalam sistem koordinat. Kemudian Anda memasukkan dua persamaan yang saya posting di sini dan Anda mengubah angka-angka sampai grafik "saya" cocok dengan poin yang Anda buat secara manual.
sumber
Solusi iteratif yang diusulkan dapat dipercepat secara dramatis di dua bidang:
1) Lipat gandakan ukuran font dengan konstanta, daripada menambah atau mengurangi 1.
2) Pertama, nol dalam menggunakan konstanta saja, katakanlah, gandakan ukuran setiap loop. Kemudian, dengan ide kasar dari mana harus memulai, lakukan hal yang sama dengan penyesuaian yang lebih baik, katakanlah, kalikan dengan 1.1. Sementara perfeksionis mungkin menginginkan ukuran piksel integer yang tepat dari font yang ideal, sebagian besar pengamat tidak melihat perbedaan antara 100 dan 110 piksel. Jika Anda perfeksionis, ulangi untuk yang ketiga kalinya dengan penyesuaian yang bahkan lebih baik.
Daripada menulis rutin atau plug-in tertentu yang menjawab pertanyaan yang tepat, saya hanya mengandalkan ide-ide dasar dan menulis variasi kode untuk menangani semua jenis masalah tata letak, bukan hanya teks, termasuk pas div, rentang, gambar,. .. berdasarkan lebar, tinggi, luas, ... dalam sebuah wadah, cocok dengan elemen lain ....
Ini sebuah contoh:
sumber
Ini adalah solusi paling elegan yang saya buat. Ini menggunakan pencarian biner, melakukan 10 iterasi. Cara naif adalah melakukan loop sementara dan meningkatkan ukuran font sebanyak 1 hingga elemen mulai meluap. Anda bisa menentukan kapan suatu elemen mulai meluap menggunakan element.offsetHeight dan element.scrollHeight . Jika scrollHeight lebih besar dari offsetHeight, Anda memiliki ukuran font yang terlalu besar.
Pencarian biner adalah algoritma yang jauh lebih baik untuk ini. Itu juga dibatasi oleh jumlah iterasi yang ingin Anda lakukan. Cukup panggil flexFont dan masukkan id id dan itu akan menyesuaikan ukuran font antara 8px dan 96px .
Saya telah menghabiskan beberapa waktu meneliti topik ini dan mencoba berbagai perpustakaan, tetapi pada akhirnya saya pikir ini adalah solusi termudah dan paling mudah yang benar-benar akan berhasil.
Catatan jika mau, Anda dapat mengubah untuk menggunakan
offsetWidth
danscrollWidth
, atau menambahkan keduanya ke fungsi ini.sumber
ReferenceError: lastSizeTooSmall is not defined
. Mungkin itu perlu didefinisikan di suatu tempat?Saya mendapat masalah yang sama dan solusinya pada dasarnya menggunakan javascript untuk mengontrol ukuran font. Lihat contoh ini pada codepen:
https://codepen.io/ThePostModernPlatonic/pen/BZKzVR
Ini adalah contoh hanya untuk tinggi, mungkin Anda perlu menaruh jika tentang lebar.
sumber
saya suka
sumber
Hanya ingin menambahkan versi saya untuk konten yang dapat diedit.
sumber
Saya telah menemukan cara untuk mencegah penggunaan loop untuk menyusutkan teks. Ini menyesuaikan ukuran font dengan mengalikannya untuk tingkat antara lebar wadah dan lebar konten. Jadi, jika lebar penampung adalah 1/3 dari konten, ukuran font akan berkurang 1/3 dan lebar penampung. Untuk meningkatkan, saya telah menggunakan loop sementara, hingga konten lebih besar dari wadah.
Kode ini adalah bagian dari tes yang saya unggah ke Github https://github.com/ricardobrg/fitText/
sumber
Saya menggunakan solusi geekMonkey, tetapi terlalu lambat. Apa yang dia lakukan, adalah dia menyesuaikan ukuran font ke maksimum (maxFontPixels) dan kemudian memeriksa apakah cocok di dalam wadah. selain itu mengurangi ukuran font sebanyak 1px dan memeriksa lagi. Mengapa tidak memeriksa ketinggian wadah sebelumnya dan mengirimkan nilai itu? (ya, saya tahu mengapa, tetapi saya sekarang membuat solusi, yang hanya berfungsi pada ketinggian dan juga memiliki opsi min / max)
Inilah solusi yang jauh lebih cepat:
dan ini akan menjadi HTML:
Sekali lagi: solusi ini HANYA memeriksa ketinggian wadah. Itu sebabnya fungsi ini tidak harus memeriksa, jika elemen cocok di dalam. Tapi saya juga menerapkan nilai min / max (40 menit, 150max) jadi bagi saya ini berfungsi dengan baik (dan juga bekerja pada ukuran jendela).
sumber
Ini adalah versi lain dari solusi ini:
sumber