Disana ada utas lain tentang ini , yang telah saya coba. Tapi ada satu masalah: textarea
tidak menyusut jika Anda menghapus konten. Saya tidak dapat menemukan cara untuk mengecilkannya ke ukuran yang benar - clientHeight
nilainya kembali sebagai ukuran penuh textarea
, bukan isinya.
Kode dari halaman itu di bawah ini:
function FitToContent(id, maxHeight)
{
var text = id && id.style ? id : document.getElementById(id);
if ( !text )
return;
var adjustedHeight = text.clientHeight;
if ( !maxHeight || maxHeight > adjustedHeight )
{
adjustedHeight = Math.max(text.scrollHeight, adjustedHeight);
if ( maxHeight )
adjustedHeight = Math.min(maxHeight, adjustedHeight);
if ( adjustedHeight > text.clientHeight )
text.style.height = adjustedHeight + "px";
}
}
window.onload = function() {
document.getElementById("ta").onkeyup = function() {
FitToContent( this, 500 )
};
}
Jawaban:
Ini berfungsi untuk saya (Firefox 3.6 / 4.0 dan Chrome 10/11):
Jika Anda ingin mencobanya di jsfiddle Ini dimulai dengan satu baris dan hanya tumbuh jumlah yang tepat yang diperlukan. Tidak apa-apa untuk satu
textarea
, tetapi saya ingin menulis sesuatu di mana saya akan memiliki banyak begitu banyaktextarea
(sekitar sebanyak satu biasanya akan memiliki baris dalam dokumen teks besar). Dalam hal ini sangat lambat. (Di Firefox sangat lambat.) Jadi saya benar-benar ingin pendekatan yang menggunakan CSS murni. Ini mungkin dengancontenteditable
, tapi saya ingin hanya teks biasa.sumber
style.height='auto'
. Saya menduga solusinya adalah dengan menambahkan saudara kandung tersembunyi yang hanya digunakan untuk pengukuran.SOLUSI SIMPLE BELUM LENGKAP
Diperbarui 2020-05-14 (Dukungan browser yang ditingkatkan untuk ponsel dan tablet)
Kode berikut akan berfungsi:
OPSI 1 (Dengan jQuery)
Opsi ini membutuhkan jQuery dan telah diuji dan bekerja dengan 1.7.2 - 3.3.1
Sederhana (Tambahkan kode jquery ini ke file skrip master Anda dan lupakan tentang itu.)
Test on jsfiddle
OPSI 2 (JavaScript Murni)
Sederhana (Tambahkan JavaScript ini ke file skrip master Anda dan lupakan saja.)
Test on jsfiddle
OPSI 3 (Ekstensi jQuery)
Berguna jika Anda ingin menerapkan rangkaian lebih lanjut ke area teks yang Anda inginkan berukuran otomatis.
Ajak dengan
$('textarea').autoHeight()
MEMPERBARUI TEXTAREA MELALUI JAVASCRIPT
Saat menyuntikkan konten ke dalam textarea melalui JavaScript, tambahkan kode berikut untuk menjalankan fungsi di opsi 1.
PRESET TEXTAREA HEIGHT
Untuk memperbaiki ketinggian awal teks Anda perlu menambahkan kondisi tambahan:
sumber
this.style.height = 'auto';
adalah memperbaiki perilaku ajaib. Saya sangat frustrasi mengapa scrollHeight sangat aneh dalam perilaku. Ketinggian ke otomatis, kemudian mencocokkan scrollHeight dalam siklus render yang sama masih meniup pikiran saya bagaimana itu 'memperbaiki' masalah ini meskipun seharusnya hanya secara teknis mengecat ketinggian kedua.this.style.height = 'auto';
memperbaiki perilaku scrollHeight? Itu hanya sihir.Solusi jQuery menyesuaikan css agar sesuai dengan kebutuhan Anda
css ...
javascript ...
ATAU alternatif untuk jQuery 1.7 + ...
Saya telah membuat biola dengan gaya minimum absolut sebagai titik awal untuk percobaan Anda ... http://jsfiddle.net/53eAy/951/
sumber
overflow-y: hidden;
ke css untuk mencegah bilah gulir berkedip sebentar ketika mengubah ukuran terjadi.$('textarea.auto-resize').on('change cut paste drop keyup', function(){...})
Diuji di Firefox 14 dan Chromium 18. Angka 24 dan 12 adalah arbitrer, uji untuk melihat apa yang paling cocok untuk Anda.
Anda bisa melakukannya tanpa tag gaya dan skrip, tetapi itu menjadi imho yang sedikit berantakan (ini adalah gaya lama HTML + JS dan tidak dianjurkan).
Edit: kode yang dimodernisasi. Atribut onkeyup yang diubah menjadi addEventListener.
Edit: keydown bekerja lebih baik daripada keyup
Edit: mendeklarasikan fungsi sebelum menggunakan
Edit: input bekerja lebih baik daripada keydown (thnx @ WASD42 & @ MA-Maddin)
jsfiddle
sumber
input
acara itu. Lihat stackoverflow.com/a/14029861/1951524textarea
dukungan sebagai satu-liner:document.querySelectorAll('textarea').forEach(function(te){ te.addEventListener("input", function() { this.style.height='24px'; this.style.height=this.scrollHeight+12+'px'; }); });
removeEventListener
dan membersihkan pendengar acara Anda. Ini sangat penting saat membuat pendengar acara di semua tempat dalam loop forEach. Plus, dalam pandangan saya, keterbacaan jauh lebih penting daripada keringkasan.box-sizing: border-box;
properti diatur atau yang lain textarea explands sebesar 4px untuk setiap acara onput. Saya menghabiskan waktu 3 jam sampai saya tahu ini masalahnya.Solusi terbaik (berfungsi dan singkat) bagi saya adalah:
Ini bekerja seperti pesona tanpa berkedip dengan pasta (dengan mouse juga), memotong, masuk dan menyusut ke ukuran yang tepat.
Silakan lihat di jsFiddle .
sumber
Anda menggunakan nilai yang lebih tinggi dari clientHeight saat ini dan konten scrollHeight. Saat Anda membuat scrollHeight lebih kecil dengan menghapus konten, area yang dihitung tidak bisa menjadi lebih kecil karena clientHeight, yang sebelumnya ditetapkan oleh style.height, menahannya. Sebagai gantinya Anda dapat mengambil maks () dari scrollHeight dan nilai ketinggian minimum yang telah Anda tentukan atau hitung dari textarea.rows.
Secara umum Anda mungkin tidak harus benar-benar mengandalkan scrollHeight pada kontrol formulir. Terlepas dari scrollHeight yang secara tradisional kurang didukung secara luas daripada beberapa ekstensi IE lainnya, HTML / CSS tidak mengatakan apa-apa tentang bagaimana kontrol formulir diimplementasikan secara internal dan Anda tidak dijamin scrollHeight akan menjadi sesuatu yang bermakna. (Secara tradisional beberapa browser telah menggunakan widget OS untuk tugas tersebut, membuat interaksi CSS dan DOM pada internal mereka menjadi tidak mungkin.) Setidaknya mengendus untuk scrollHeight / clientHeight keberadaan sebelum mencoba untuk mengaktifkan efek.
Alternatif pendekatan lain yang mungkin untuk menghindari masalah ini jika penting bahwa ia bekerja lebih luas mungkin dengan menggunakan div tersembunyi yang berukuran sama lebar dengan textarea, dan atur dalam font yang sama. Pada keyup, Anda menyalin teks dari textarea ke node teks dalam div tersembunyi (ingat untuk mengganti '\ n' dengan jeda baris, dan keluar '<' / '&' dengan benar jika Anda menggunakan innerHTML). Maka cukup mengukur offset div. Tinggi akan memberi Anda ketinggian yang Anda butuhkan.
sumber
scrollHeight
untuk textareas? Bekerja dengan baik dengan versi IE, Firefox dan Opera saat ini ...Jika Anda tidak perlu mendukung IE8 Anda dapat menggunakan
input
acara ini:Sekarang Anda hanya perlu menambahkan beberapa CSS dan Anda selesai:
Pemakaian:
Anda dapat membaca lebih lanjut tentang cara kerjanya di posting blog saya .
sumber
input
acara selama inisialisasi dalam siklus foreach.ukuran Otomatis
https://github.com/jackmoore/autosize
Hanya bekerja, mandiri, populer (3.0k + GitHub bintang per Oktober 2018), tersedia di cdnjs ) dan ringan (~ 3.5k). Demo:
BTW, jika Anda menggunakan ACE editor, gunakan
maxLines: Infinity
: Secara otomatis menyesuaikan ketinggian ke konten di Ace Cloud 9 editorsumber
autosize
Plugin tidak memungkinkan untuk secara manual mengubah ukuran menggunakan ikon resize di textarea.Menemukan satu liner dari sini ;
sumber
Adakah yang menganggap konten dapat diedit? Tidak main-main dengan menggulir, dan satu-satunya JS yang saya suka tentang itu adalah jika Anda berencana untuk menyimpan data pada blur ... dan tampaknya, itu kompatibel pada semua browser populer: http://caniuse.com/#feat = dapat diedit
Cukup beri gaya agar terlihat seperti kotak teks, dan otomatis ... Jadikan min-height-nya tinggi teks yang disukai dan miliki.
Apa yang keren tentang pendekatan ini adalah Anda dapat menyimpan dan memberi tag pada beberapa browser.
http://jsfiddle.net/gbutiri/v31o8xfo/
sumber
contenteditable
itu bagus, tetapi jika Anda ingin plaintext itu membutuhkan banyak opsi seperti-webkit-user-modify: read-write-plaintext-only
danwhite-space: pre-wrap
.[dom-element].innerText
. @WebmasterG IMHO akan lebih baik untuk menghilangkan jquery (untuk transparansi) dan untuk memasukkan contoh di halaman ini melalui Cuplikan Kode runnable alih-alih pada jsfiddle.Saya menggunakan kode berikut untuk beberapa textareas. Bekerja dengan baik di Chrome 12, Firefox 5 dan IE 9, bahkan dengan tindakan hapus, potong, dan tempel yang dilakukan di textareas.
sumber
Ada pendekatan yang sedikit berbeda.
Idenya adalah untuk menyalin teks dari
textarea
dalampre
dan biarkan CSS memastikan bahwa mereka memiliki ukuran yang sama.Manfaatnya adalah kerangka kerja menghadirkan alat sederhana untuk memindahkan teks tanpa menyentuh peristiwa apa pun. Yaitu, di AngularJS Anda akan menambahkan
ng-model="foo" ng-trim="false"
ketextarea
danng-bind="foo + '\n'"
kepre
. Lihat biola .Pastikan yang
pre
memiliki ukuran font yang sama dengantextarea
.sumber
pre
memiliki ukuran font yang sama dengantextarea
" - Mereka membutuhkan yang samaline-height
, dan jumlah yang samapadding
dan / atauborder
juga. Ini adalah solusi terbaik untuk Angular.Berikut ini berfungsi untuk memotong, menempel, dll., Terlepas dari apakah tindakan itu dari mouse, pintasan keyboard, memilih opsi dari bilah menu ... beberapa jawaban menggunakan pendekatan yang sama tetapi mereka tidak memperhitungkan kotak- ukuran, itulah sebabnya mereka salah menerapkan gaya
overflow: hidden
.Saya melakukan hal berikut, yang juga berfungsi baik dengan
max-height
danrows
untuk ketinggian minimum dan maksimum.Untuk kelengkapan absolut, Anda harus memanggil
adjust
fungsi dalam beberapa keadaan lagi:textarea
perubahan dengan ukuran jendela, atau peristiwa lain yang mengubah lebar tekstextarea
'sdisplay
gaya perubahan atribut, misalnya ketika pergi darinone
(tersembunyi) keblock
textarea
diubah secara terprogramPerhatikan bahwa menggunakan
window.getComputedStyle
atau mendapatkancurrentStyle
bisa agak mahal secara komputasi, jadi Anda mungkin ingin men-cache hasilnya.Bekerja untuk IE6, jadi saya sangat berharap itu dukungan yang cukup baik.
sumber
Sebagai pendekatan yang berbeda, Anda dapat menggunakan
<span>
yang menyesuaikan ukurannya secara otomatis. Anda harus membuatnya dapat diedit dengan menambahkancontenteditable="true"
properti dan Anda selesai:Satu-satunya masalah dengan pendekatan ini adalah jika Anda ingin mengirimkan nilai sebagai bagian dari formulir, Anda harus melakukannya sendiri di JavaScript. Melakukannya relatif mudah. Misalnya, Anda bisa menambahkan bidang tersembunyi dan dalam
onsubmit
hal formulir menetapkan nilaispan
bidang yang tersembunyi yang kemudian akan secara otomatis dikirimkan bersama formulir.sumber
Sedikit koreksi. Bekerja dengan sempurna di Opera
sumber
Saya tahu cara yang singkat dan benar untuk mengimplementasikan ini dengan jquery. Tidak diperlukan div tambahan yang tersembunyi dan berfungsi di sebagian besar browser
sumber
.live()
sudah tidak digunakan lagi. api.jquery.com/live Biasanya Anda ingin menggunakannya.on()
.Saya tidak tahu apakah ada yang menyebutkan cara ini tetapi dalam beberapa kasus dimungkinkan untuk mengubah ukuran ketinggian dengan baris Atribut
Demo
sumber
white-space: nowrap;
. Ketika sebuah baris membungkus ke baris lain tanpa putus baris, textarea tidak akan disesuaikan dengan benar lagi.Berikut adalah arahan sudut untuk jawaban panzi.
HTML:
sumber
Anda dapat menggunakan JQuery untuk memperluas
textarea
saat mengetik:sumber
${textarea.scrollHeight}px
;});Mereka yang ingin mencapai hal yang sama di versi baru Angular.
Grab textArea elementRef.
Saya juga menambahkan use case lain yang mungkin berguna bagi beberapa pengguna yang membaca utas, ketika pengguna ingin meningkatkan ketinggian area teks ke ketinggian tertentu dan kemudian menggunakannya
overflow:scroll
, metode di atas dapat diperluas untuk mencapai use-case yang disebutkan.sumber
Beberapa jawaban di sini tidak memperhitungkan bantalan.
Dengan asumsi Anda memiliki maxHeight yang tidak ingin Anda kunjungi, ini bekerja untuk saya:
sumber
Pendekatan yang lebih sederhana dan lebih bersih adalah ini:
// dan CSS
Yang diperlukan hanyalah menambahkan
.auto-height
kelas ke apa puntextarea
yang ingin Anda targetkan.Diuji dalam FF, Chrome dan Safari. Beri tahu saya jika ini tidak berhasil untuk Anda, karena alasan apa pun. Tapi, ini adalah cara paling bersih dan paling sederhana yang saya temukan ini berfungsi. Dan itu berhasil! : D
sumber
Kode ini berfungsi untuk menempel dan memilih hapus juga.
Ini JSFiddle
sumber
Saya merekomendasikan perpustakaan javascript dari http://javierjulio.github.io/textarea-autosize .
Per komentar, tambahkan contoh kode kunci pada penggunaan plugin:
Minimum CSS yang dibutuhkan:
sumber
MakeTextAreaResisable yang menggunakan qQuery
sumber
Tampaknya tidak ada jawaban yang berhasil. Tapi yang ini berfungsi untuk saya: https://coderwall.com/p/imkqoq/resize-textarea-to-fit-content
sumber
implementasi saya sangat sederhana, hitung jumlah baris dalam input (dan minimum 2 baris untuk menunjukkan bahwa itu adalah textarea):
contoh kerja penuh dengan stimulus: https://jsbin.com/kajosolini/1/edit?html,js,output
(dan ini bekerja dengan pegangan ukuran manual manual misalnya)
sumber
Jawaban yang diterima bekerja dengan baik. Tapi itu banyak kode untuk fungsi sederhana ini. Kode di bawah ini akan melakukan triknya.
sumber
Inilah yang saya lakukan saat menggunakan MVC HTML Helper untuk TextArea. Saya memiliki beberapa elemen textarea sehingga harus membedakan mereka menggunakan Model Id.
dan dalam skrip menambahkan ini:
Saya telah mengujinya di IE10 dan Firefox23
sumber
Anda dapat menggunakan kode ini:
Naskah:
Javascript
sumber