Adakah yang tahu mengapa elemen input dengan lebar 100% melewati batas sel tabel.
Dalam contoh sederhana di bawah kotak input melewati batas sel tabel, hasilnya mengerikan. Ini telah diuji dan terjadi dengan cara yang sama di: Firefox, IE7 dan Safari.
Apakah ini masuk akal untuk Anda? Apakah saya melewatkan sesuatu, apakah Anda tahu tentang solusi yang mungkin?
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <!-- don't use closing slash in meta tag, it breaks HTML4.01 transitional -->
<title>Test input text in table</title>
<style type="text/css">
table {border-top: 1px solid #ff0000; border-left: 1px solid #ff0000;}
table td {border-right: 1px solid #00ff00; border-bottom: 1px solid #00ff00;}
input[type="text"] {width: 100%;} /* removing this would make input not to go over cells border, but they would be too short, I want them to fit cells size */
</style>
</head><body>
<table cellpadding="0" cellspacing="0">
<tr>
<td><p>column one hello babe babe babe</p></td>
<td><p>column two hello babe more</p></td>
<td><p>column three hello babe more and more</p></td>
</tr>
<tr>
<td><input type="text" value="test"></td>
<td><input type="text" value="test"></td>
<td><input type="text" value="test"></td>
</tr>
</table>
</body></html>
html
input
html-table
width
Marco Demaio
sumber
sumber
form
denganlabel
s daninput
s di dalamul
atauol
. yaitu, setidaknya sedikit lebih semantik. Tentu saja, Anda harus menggunakanform
, meskipun Anda tetap menggunakan filetable
.Jawaban:
Anda dapat menggunakan
box-sizing
properti CSS3 untuk menyertakan padding dan batas eksternal:sumber
<!--[if lt IE 8]>
daninput[type="text"] {width:95%}
Nilai lebar tidak memperhitungkan batas atau bantalan akun:
http://www.htmldog.com/reference/cssproperties/width/
Anda mendapatkan 2px padding di setiap sisi, ditambah 1px perbatasan di setiap sisi.
100% + 2 * (2px + 1px) = 100% + 6px, yang lebih dari 100% konten anak yang dimiliki td induk.
Anda memiliki pilihan untuk:
box-sizing: border-box;
sesuai jawaban @ pricco ;sumber
text-indent
untuk mensimulasikan padding di depan tepi terdepan teks, danline-height
untuk padding vertikal (meskipun mempertahankan padding vertikal tidak akan memengaruhi lebarnya).Masalah dengan hal-hal seperti itu
width:95%;
adalah mereka tidak terlihat benar dalam tata letak fleksibel yang lebar (karena 5% kemudian bisa seperti 30 piksel).Solusi berikut berfungsi dengan sangat baik untuk saya (diuji di Firefox, IE 9, Safari):
(menambahkan warna agar lebih mudah melihat padding yang benar)
Triknya adalah untuk membungkus input dengan dua div, bagian luar memiliki margin 3px (yang membuatnya lebih kecil 3px dari td), bagian dalam memiliki bantalan 3px. Ini membuat input 6px lebih kecil dari td, yang Anda ingin mulai.
Saya tidak yakin tentang mekanisme ini, tetapi berhasil.
Dalam contoh sederhana ini, ini juga bekerja hanya dengan satu div dengan margin kanan 6. Namun, dalam kasus aplikasi web saya, hanya solusi di atas yang berfungsi.
sumber
Masalahnya telah dijelaskan sebelumnya jadi saya hanya akan mengulangi: lebar tidak memperhitungkan batas dan bantalan. Satu kemungkinan jawaban untuk ini tidak dibahas tetapi yang saya temukan membantu saya adalah dengan membungkus masukan Anda. Inilah kodenya, dan saya akan menjelaskan bagaimana ini membantu sebentar lagi:
DIV yang membungkus INPUT tidak memiliki bantalan dan juga tidak memiliki batas. Inilah solusinya. DIV akan meluas ke ukuran wadahnya, tetapi juga akan menghormati batas dan bantalan. Sekarang, INPUT tidak akan mengalami masalah dalam memperluas ukuran penampungnya karena tidak memiliki batas dan tanpa bantalan. Perhatikan juga bahwa DIV memiliki overflow yang disetel ke tersembunyi. Tampaknya secara default, item dapat berada di luar penampungnya dengan luapan default terlihat. Ini hanya memastikan bahwa input tetap berada di dalam penampungnya dan tidak mencoba untuk masuk.
Saya telah menguji ini di Chrome dan di Fire Fox. Keduanya tampaknya menghargai solusi ini dengan baik.
UPDATE : Karena saya baru saja mendapat downvote acak, saya ingin mengatakan bahwa cara yang lebih baik untuk menangani overflow adalah dengan atribut ukuran kotak CSS3 seperti yang dijelaskan oleh pricco:
Ini tampaknya didukung dengan cukup baik oleh browser utama dan tidak "hacky" seperti trik overflow. Namun, ada beberapa masalah kecil pada browser saat ini dengan pendekatan ini (lihat http://caniuse.com/#search=box-sizing Masalah yang Diketahui).
sumber
overflow: hidden;
konten yang masih 'menonjol' ke luar kotak dengan cara yang persis sama, tetapi terpotong alih-alih ditampilkan - sehingga tidak tumpang tindih dengan konten lain.Saya tahu bahwa pertanyaan ini sudah berumur 3 tahun tetapi masalah masih berlanjut untuk browser saat ini dan orang-orang masih datang ke sini. Solusi untuk saat ini adalah calc () :
Ini didukung oleh sebagian besar browser modern.
sumber
Masalahnya adalah karena model kotak elemen masukan. Saya baru-baru ini menemukan solusi yang bagus untuk masalah ini ketika mencoba menjaga masukan saya 100% untuk perangkat seluler.
Bungkus masukan Anda dengan elemen lain, div misalnya. Kemudian terapkan gaya yang Anda inginkan untuk masukan Anda ke div pembungkus itu. Sebagai contoh:
Berikan .input-wrapper rounded corner padding dll, apapun yang anda inginkan untuk masukan anda, kemudian berikan lebar masukan 100%. Anda memiliki masukan Anda yang dilapisi dengan baik dengan perbatasan dll tetapi tanpa luapan yang mengganggu!
sumber
Saya memperbaiki masalah ini dimulai dengan jawaban @ hallodom. Semua input saya terkandung dalam li, jadi yang harus saya lakukan hanyalah mengatur li overflow: hidden untuk menghilangkan kelebihan input overflow.
sumber
alih-alih perjuangan margin ini lakukan saja
dengan cara ini batas sel terlihat dan Anda dapat mengontrol warna latar belakang baris
sumber
Keluarkan "http://www.w3.org/TR/html4/loose.dtd" dari deklarasi DOCTYPE dan itu memperbaiki masalah Anda.
Bersulang! :)
sumber
http://www.w3.org/TR/html4/strict.dtd
Ketat? ref. w3.org/QA/2002/04/valid-dtd-list.html Bagaimanapun, ini bukan pilihan karena mengubah DOCTYPE sekarang mungkin akan berdampak pada rendering banyak stuf lainnya di halaman web.Dengan beberapa Javascript Anda bisa mendapatkan lebar yang tepat dari TD yang mengandung dan kemudian menetapkannya langsung ke elemen input.
Berikut ini adalah javascript mentah tetapi jQuery akan membuatnya lebih bersih ...
Masalah dengan solusi ini adalah:
1) Jika Anda memiliki input yang terkandung dalam elemen lain seperti SPAN maka Anda perlu melakukan loop up dan menemukan TD karena elemen seperti SPAN akan membungkus input dan menunjukkan ukurannya daripada dibatasi pada ukuran TD.
2) Jika Anda memiliki padding atau margin yang ditambahkan pada level yang berbeda, maka Anda mungkin harus menguranginya secara eksplisit dari [pEl.offsetWidth]. Bergantung pada struktur HTML Anda yang dapat dihitung.
3) Jika kolom tabel berukuran dinamis, maka mengubah ukuran satu elemen akan menyebabkan tabel mengalir ulang di beberapa browser dan Anda mungkin mendapatkan efek bertahap saat Anda "memperbaiki" ukuran input secara berurutan. Solusinya adalah dengan menetapkan lebar tertentu ke kolom baik sebagai persentase atau piksel ATAU mengumpulkan lebar baru dan mengaturnya setelahnya. Lihat kode di bawah ini ..
sumber
Saya memecahkan masalah dengan menerapkan
box-sizing:border-box
; ke sel tabel itu sendiri, selain melakukan hal yang sama dengan input dan pembungkusnya.sumber
Saya memecahkan masalah dengan menggunakan ini
sumber
Saya biasanya mengatur lebar input saya menjadi 99% untuk memperbaiki ini:
Anda juga dapat menghapus gaya default, tetapi itu akan membuatnya kurang jelas bahwa itu adalah kotak teks. Namun, saya akan menunjukkan kode untuk itu:
Iklan @ m
sumber
Masalahnya terletak pada
border-width
elemen masukan. Singkatnya, coba setelmargin-left
dari elemen masukan ke-2px
.sumber