<html>
<head>
</head>
<body>
<input type="text" value="1" style="min-width:1px;" />
</body>
</html>
Ini kode saya dan tidak berfungsi. Apakah ada cara lain dalam HTML, JavaScript, PHP atau CSS untuk menetapkan lebar minimum?
Saya ingin bidang input teks dengan lebar yang berubah secara dinamis, sehingga bidang input mengalir di sekitar isinya. Setiap input memiliki built-in padding 2em
, itulah masalahnya dan masalah kedua adalah bahwa min-width
tidak bekerja pada input sama sekali.
Jika saya mengatur lebar lebih dari yang dibutuhkan daripada keseluruhan program berantakan, saya membutuhkan lebar 1px, lebih hanya jika diperlukan.
javascript
html
css
Kerc
sumber
sumber
Jawaban:
Kedengarannya seperti harapan Anda adalah bahwa gaya diterapkan secara dinamis ke lebar kotak teks berdasarkan pada isi kotak teks. Jika demikian, Anda akan memerlukan beberapa js untuk berjalan pada perubahan isi kotak teks, sesuatu seperti ini :
Catatan: solusi ini hanya berfungsi ketika setiap karakter persis
8px
lebar.sumber
onInput
Dalam versi browser modern, unit CSS
ch
juga tersedia. Menurut pemahaman saya, ini adalah unit font-independent, di mana1ch
sama dengan lebar karakter0
(nol) di setiap font yang diberikan.Dengan demikian, sesuatu yang sesederhana berikut ini dapat digunakan sebagai fungsi ukuran:
Contoh itu akan mengubah ukuran "elem" menjadi panjang nilai + 2 karakter ekstra.
sumber
input
elemen, sepertifont-style
,letter-spacing
dan sebagainya. Saya telah mengedit jawabannya dengan demo langsung..
ditemukan.Untuk menghitung lebar input saat ini, Anda harus menanamkannya dalam
span
elemen sementara , lampirkan hal itu ke DOM, dapatkan lebar yang dihitung (dalam piksel) menggunakanscrollWidth
properti dan hapusspan
lagi. Tentu saja Anda harus memastikan bahwa keluarga font yang sama, ukuran font, dll, digunakan di dalaminput
dan dispan
elemen. Karena itu saya menugaskan kelas yang sama kepada mereka.Saya melampirkan fungsi ke
keyup
acara tersebut, karena padakeypress
karakter input belum ditambahkan ke inputvalue
, sehingga akan menghasilkan lebar yang salah. Sayangnya, saya tidak tahu cara menyingkirkan pengguliran bidang input (saat menambahkan karakter ke akhir bidang); itu bergulir, karena karakter ditambahkan dan ditampilkan sebelumadjustWidthOfInput()
dipanggil. Dan, seperti yang saya katakan, saya tidak bisa melakukan ini dengan cara sebaliknya karena Anda akan memiliki nilai field input sebelum karakter yang ditekan dimasukkan. Saya akan mencoba menyelesaikan masalah ini nanti.BTW, saya hanya menguji ini di Firefox (3.6.8), tetapi Anda akan mengerti intinya, saya harap.
sumber
white-space: pre;
ke css cara ini:.tmp-element{ visibility: hidden; white-space: pre;}
. Jika tidak, spasi putih digabungkan dan penghitungan lebar gagal.<input>
dan<span>
berperilaku berbeda terkait penanganan ruang putih,<input>
mempertahankan ruang putih dan<span>
menggabungkan ruang putih berurutan menjadi satu jikawhite-space: pre;
tidak ditambahkan.tmp.getBoundingClientRect().width
lebih baik daripadatmp.scrollWidth
, karena kadang-kadang mengembalikan 0.replace(/ /g, " ")
Berikut ini modifikasi jawaban Lyth yang memperhitungkan:
Ini juga memungkinkan sejumlah bidang input! Untuk melihatnya beraksi: http://jsfiddle.net/4Qsa8/
Naskah:
Gaya:
HTML:
Tampilkan cuplikan kode
sumber
change
atauinput
acara tersebut sudah cukupIni adalah solusi tanpa font monospace yang diperlukan, dengan hanya kode potongan javascript yang sangat kecil , tidak perlu menghitung gaya yang dikomputasi , dan, bahkan mendukung ime , mendukung teks rtl .
Menggunakan
span.text
untuk menyesuaikan lebar teks, dan biarkan ukuran input sama denganposition: absolute
kontainer. Salin nilai input kespan
setiap kali itu berubah (Anda dapat dengan mudah mengubah kode ini menjadi vanilla js). Jadi input hanya akan "sesuai" dengan ukuran kontennya.sumber
UNTUK MENCARI NICER & MERASA
Anda harus menggunakan jQuery keypress () event dalam kombinasi dengan String.fromCharCode (e.which) untuk mendapatkan karakter yang ditekan. Oleh karena itu Anda dapat menghitung apa yang lebar Anda akan . Mengapa? Karena itu akan terlihat jauh lebih seksi :)Berikut ini adalah jsfiddle yang menghasilkan perilaku yang baik dibandingkan dengan solusi yang menggunakan acara keyup: http://jsfiddle.net/G4FKW/3/
Di bawah ini adalah vanilla JS yang mendengarkan
input
acara<input>
elemen dan mengaturspan
saudara kandung untuk memiliki nilai teks yang sama untuk mengukurnya.sumber
span
dan css untuknya.Ini adalah jawaban khusus sudut, tetapi ini bekerja untuk saya dan telah sangat memuaskan dalam hal kesederhanaan dan kemudahan penggunaan:
Secara otomatis memperbarui melalui unit karakter dalam jawaban Jani .
sumber
Berikut ini cara alternatif untuk menyelesaikan masalah ini menggunakan DIV dan properti 'dapat diedit':
HTML:
CSS: (untuk memberi DIV beberapa dimensi dan membuatnya lebih mudah dilihat)
Catatan: Jika Anda berencana untuk menggunakan ini di dalam elemen FORMULIR yang Anda rencanakan untuk dikirim, Anda harus menggunakan Javascript / jQuery untuk menangkap acara pengiriman sehingga Anda dapat menguraikan 'nilai' (
.innerHTML
atau.html()
masing - masing) dari DIV.sumber
Anda dapat mengatur lebar input menggunakan atribut ukuran juga. Ukuran input menentukan lebar karakter.
Sebuah input dapat secara dinamis menyesuaikan ukurannya dengan mendengarkan acara utama.
Sebagai contoh
JsFiddle di sini
sumber
Anda bisa melakukan sesuatu seperti ini
sumber
Cukup tambahkan di atas jawaban lain.
Saya perhatikan bahwa saat ini di beberapa browser bidang input memiliki scrollWidth. Yang berarti:
harus bekerja dengan baik. diuji dalam chrome, firefox dan safari.
Untuk dukungan penghapusan, Anda dapat menambahkan '= 0' terlebih dahulu dan kemudian menyesuaikan kembali.
sumber
Berikut ini adalah JS sederhana dan plugin jQuery yang saya tulis yang akan menangani pengubahan ukuran elemen input menggunakan kanvas dan ukuran font / keluarga untuk menentukan panjang string aktual saat dirender. (hanya berfungsi di> IE9, chrome, safari, firefox, opera dan sebagian besar browser utama lainnya yang telah mengimplementasikan elemen kanvas).
PlainJS:
Plugin jQuery:
Catatan: ini tidak akan menangani transformasi teks, spasi baris dan spasi huruf, dan mungkin beberapa properti perubahan ukuran teks lainnya. Untuk menangani set properti transformasi-teks dan sesuaikan nilai teks agar sesuai dengan properti itu. Yang lain mungkin cukup lurus ke depan. Saya akan menerapkan jika ini mulai mendapatkan beberapa daya tarik ...
sumber
Perlu dicatat bahwa ukuran yang terlihat bagus dapat dilakukan ketika font monospace, jadi kita dapat dengan sempurna mengubah ukuran
input
elemen menggunakanch
unit.Juga dalam pendekatan ini kita dapat memperbarui lebar bidang dengan hanya memperbarui variabel CSS ( properti khusus ) pada
input
acara dan kita juga harus menjaga input yang sudah diisi sebelumnya padaDOMContentLoaded
acaraMarkup
CSS
Sebagai variabel root yang kami tetapkan
--size: 0
: variabel ini akan berisi panjang input dan akan dikalikan dengan1ch
di dalamcalc()
ekspresi. Secara default kita juga bisa mengatur min-width, mis10ch
Bagian Javascript membaca panjang nilai yang dimasukkan dan memperbarui variabel
--size
:JS
tentu saja ini masih berfungsi bahkan jika Anda tidak menggunakan font monospace, tetapi dalam hal ini Anda perlu mengubah
calc()
rumus dengan mengalikan--size
variabel dengan nilai lain (yang sangat bergantung padafont-family
danfont-size
) berbeda dari1ch
.sumber
Jawaban ini memberikan salah satu metode paling akurat untuk mengambil lebar teks yang tersedia di browser dan lebih akurat daripada jawaban yang diterima. Ia menggunakan elemen kanvas html5 dan tidak seperti jawaban lain tidak menambahkan elemen ke DOM dan dengan demikian menghindari masalah reflow yang disebabkan oleh terlalu banyak menambahkan elemen ke DOM.
Baca lebih lanjut tentang elemen Canvas di sini terkait dengan lebar teks.
sumber
Anda dapat melakukannya dengan lebih mudah di sudut menggunakan direktif gaya bawaan.
Di html Anda:
Di controller Anda:
Di css Anda:
Sesuaikan karakter untuk mencocokkan lebar font Anda. Tampaknya menjadi 7 dengan ukuran font 12px;
sumber
Jika Anda menggunakan Bootstrap, itu bisa dilakukan dengan sangat mudah:
<div contenteditable="true" class="form-control" style="display: inline"></div>
Anda hanya perlu mengambil konten div dan memasukkannya ke dalam input tersembunyi sebelum mengirimkan formulir.
sumber
Saya pikir Anda salah mengartikan properti CSS min-width . min-width umumnya digunakan untuk menentukan lebar DOM minimum dalam tata letak fluida, seperti:
Itu akan mengatur elemen input ke lebar minimum 200 piksel. Dalam konteks ini, "px" adalah singkatan dari "piksel".
Sekarang, jika Anda mencoba memeriksa untuk memastikan bahwa bidang input berisi setidaknya satu karakter ketika pengguna mengirimkannya, Anda harus melakukan beberapa validasi formulir dengan JavaScript dan PHP. Jika memang itu yang ingin Anda lakukan, saya akan mengedit jawaban ini dan melakukan yang terbaik untuk membantu Anda.
sumber
<input type="text" value="1" style="width:1px;" />
Saya sangat menyukai jawaban Lyth , tetapi juga sangat menginginkannya:
Saya mengadaptasi JSFiddle-nya dan muncul dengan ini . Salah satu peningkatan yang tidak ada dalam biola ini adalah menggunakan sesuatu seperti Parser CSS jQuery untuk benar-benar membaca lebar awal dari aturan input.textbox-autosize, dan menggunakannya sebagai minWidth. Benar saya hanya menggunakan atribut pada, yang membuat untuk demo yang ringkas tetapi tidak ideal. karena memerlukan atribut tambahan pada setiap input. Anda mungkin juga hanya ingin menempatkan minWidth sebagai 100 tepat di JavaScript.
HTML:
CSS:
JavaScript:
sumber
Lebih baik adalah
onvalue
:Ini juga melibatkan menempel, menyeret dan menjatuhkan, dll.
sumber
Ini 2 sen saya. Buat div tak terlihat kosong. Isi dengan konten input dan kembalikan lebar ke bidang input. Cocokkan gaya teks antara setiap kotak.
sumber
Cukup sederhana:
Di mana N adalah angka (2 dalam contoh, 17 pada sesuatu yang saya kembangkan) yang ditentukan secara eksperimental.
Mengurangkan N mencegah ruang ekstrenuous aneh ini mengakumulasi jauh sebelum teks mencapai akhir kotak teks.
Membandingkan. Perhatikan bagaimana perubahan ukuran bahkan setelah karakter pertama.
sumber
oninput='this.style.width = (this.scrollWidth-2) + "px";'
denganoninput='this.style.width = 0; this.style.width = this.scrollWidth + "px";'
menyingkirkan ruang yang terakumulasiSaya hanya menghabiskan waktu mencari tahu bagaimana melakukannya.
Sebenarnya cara paling sederhana yang saya temukan adalah untuk memindahkan nilai input ke span sebelum input, menjaga lebar simbol input 1. Meskipun saya tidak yakin itu cocok untuk kebutuhan awal Anda.
Mungkin beberapa kode tambahan, tetapi dalam bereaksi + aplikasi berbasis fluks itu solusi yang cukup alami.
sumber
Berdasarkan jawaban Michael, saya telah membuat versi saya sendiri menggunakan jQuery. Saya pikir ini adalah versi yang lebih bersih / lebih pendek dari sebagian besar jawaban di sini dan tampaknya menyelesaikan pekerjaan.
Saya melakukan hal yang sama seperti kebanyakan orang di sini dengan menggunakan rentang untuk menulis teks input kemudian mendapatkan lebar. Kemudian saya mengatur lebar ketika tindakan
keyup
danblur
dipanggil.Ini adalah codepen yang berfungsi . Codepen ini menunjukkan bagaimana ini dapat digunakan dengan beberapa bidang input.
Struktur HTML:
jQuery:
Fungsi di atas mendapatkan nilai input, memangkas ruang ekstra dan mengatur teks ke dalam rentang untuk mendapatkan lebar. Jika tidak ada teks, alih-alih mendapatkan placeholder dan memasukkannya ke dalam rentang. Setelah memasukkan teks ke dalam rentang itu kemudian mengatur lebar input. The
+ 5
pada lebar adalah karena tanpa bahwa input akan memotong sedikit di Edge Browser.Jika ini bisa diperbaiki tolong beri tahu saya karena ini adalah solusi terbersih yang bisa saya buat.
sumber
Mengapa tidak menggunakan css saja?
kode ini diperkenalkan oleh @Iain Todd dan saya pikir saya harus membagikannya
sumber
Cara umum anti peluru harus:
input
elemen yang diukurDemo codepen
sumber
Anda bisa mengatur
size
atribut. Jika Anda menggunakan salah satu kerangka kerja reaktif, berikut ini akan cukup:tetapi jika Anda menggunakan js murni, Anda harus mengatur penangan acara, seperti:
sumber