Padding pada input memecah lebar 100%

130

Oke, jadi kita tahu bahwa menyetel padding ke objek menyebabkan lebarnya berubah walaupun diatur secara eksplisit. Sementara seseorang dapat memperdebatkan logika di balik ini, itu menyebabkan beberapa masalah dengan beberapa elemen.

Untuk sebagian besar kasus, Anda hanya menambahkan elemen turunan dan menambahkan padding ke elemen itu alih-alih yang ditetapkan menjadi 100%, tetapi untuk input formulir, itu bukan langkah yang mungkin.

Lihatlah ini: http://sandman.net/test/formcss.html

Input kedua memiliki padding set ke 5px yang saya lebih suka dari pengaturan default. Namun sayangnya hal itu membuat input tumbuh 10px ke segala arah, termasuk menambahkan 10px ke lebar 100%.

Masalahnya di sini adalah saya tidak bisa menambahkan elemen turunan di dalam input jadi saya tidak bisa memperbaikinya. Jadi pertanyaannya adalah:

Apakah ada cara untuk menambahkan padding di dalam input dengan tetap menjaga lebar 100%? Ini harus 100% karena formulir akan membuat orang tua lebar yang berbeda jadi saya tidak tahu sebelumnya lebar orang tua.

Sandman
sumber
3
Lihat stackoverflow.com/questions/628500/… untuk cara menggunakan box-sizingatribut CSS3
Daniel LeCheminant
15
Harus saya katakan, terima kasih telah menjaga halaman contoh Anda selama ini. Membuat saya gila ketika seseorang memposting url di pertanyaan dan turun setelah jawabannya dijawab atau mereka tidak menggunakan sesuatu seperti jsfiddle.
Jonathan Dumaine
Mengenai menggunakan atribut ukuran kotak; masalah saya adalah masalah yang sama tetapi dengan tinggi - pengaturan tinggi hingga 100% saja berarti tinggi + batas + bantalan = tinggi wadah. Untuk mendapatkan input agar memiliki tinggi aktual wadah, saya hanya perlu menggunakan ukuran kotak: isi-kotak.
Skychan
Kecuali apa yang saya katakan tidak bekerja di IE. IE11 dengan ukuran kotak: kotak konten tidak menyesuaikan ketinggian sama sekali dengan tinggi: 100%. Itu menghormatinya dengan tinggi px tertentu. Jadi tinggi: 31px tanpa ukuran kotak adalah 6px kurang dari tinggi: 31px + ukuran kotak: isi-kotak. Tapi idenya adalah menggunakan tinggi: 100% jadi saya tidak khawatir tentang ukuran piksel tertentu!
Skychan

Jawaban:

288

Menggunakan CSS3 Anda dapat menggunakan ukuran kotak properti untuk mengubah cara browser menghitung lebar input .

  input.input {
    width: 100%;
    -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
    -moz-box-sizing: border-box;    /* Firefox, other Gecko */
    box-sizing: border-box;         /* Opera/IE 8+ */
  }

Anda dapat membaca lebih lanjut tentang ini di sini: http://css-tricks.com/box-sizing/

Víctor Dieppa Garriga
sumber
@ Víctor Dieppa Garriga Terima kasih, Ini adalah solusi yang bagus.
sinanakyazici
1
Dukungan adalah sebagai berikut: Chrome (apa saja): kotak-ukuran Opera 8.5+: kotak-ukuran Firefox (apa saja): -moz-kotak-ukuran Safari 3: -webkit-kotak-ukuran (tidak diperbaiki dalam versi 5.1+) IE8 +: kotak -perekat. Saya juga merekomendasikan ini untuk jawaban yang diterima, ini solusi yang lebih elegan.
Baconbeastnz
1
Untuk memperjelas dukungan ukuran kotak pada IE, untuk properti ukuran kotak IE tergantung pada Mode Dokumen IE, ini bekerja pada "Mode Standar IE8" & lebih tinggi. Jadi itu akan bekerja di versi browser IE8 juga jika mode dokumen adalah "Mode standar IE8". Semoga ini bisa membantu
Sanjeev
Jujur, box-sizing: border-box;adalah hal pertama yang saya pikirkan, tetapi sama sekali tidak bekerja untuk saya. Mungkin kakek buyut buyut display: flex;ini mengacaukan ini?
Cody
Tampak seperti itu didukung di semua browser utama tanpa awalan, dan telah selama beberapa versoins: caniuse.com/#feat=css3-boxsizing
Jason
7

Saya tidak tahu bagaimana cross browser kompatibel (berfungsi di firefox dan safari), tetapi Anda bisa mencoba solusi ini:

DIV.formvalue {
padding: 15px;
}
input.input {
margin: -5px;
}

(Hanya memposting nilai yang saya ubah)

michaelk
sumber
1
Ini menyebabkan masalah di IE.
Tarik
Yah, itu tidak mengejutkan saya :) Jangan berpikir bahwa ada solusi browser lintas mudah tanpa mengubah markup.
michaelk
Ok, saya memilih solusi ini sekarang karena menambahkan margin: -5px tampaknya bukan pelanggaran. Saya telah menambahkan input keempat ke halaman yang menggunakan ini dan tampaknya benar-benar berfungsi. jigsaw.w3.org/css-validator/…
Sandman
7

Salah satu pilihan adalah untuk membungkus INPUTdalam DIVyang memiliki padding.

CSS:

div.formvalue {
    background-color: #eee;
    border: 1px solid red;
    padding: 10px;
    margin: 0px;
}

div.paddedInput {
    padding: 5px;
    border: 1px solid black;
    background-color: white;
}

div.paddedInput input {
    border: 0px;
    width: 100%;
}

HTML:

<div class="formvalue">
    <div class="paddedInput"><input type="text" value="Padded!" /></div>
</div>
pengguna7116
sumber
8
Padding a div kontainer menghasilkan hasil yang tidak sama dengan menambahkan padding ke bidang input.
Felix Fung
Tambahkan apa yang dikatakan Felix Fung - Anda kehilangan kemampuan untuk mengklik dengan mouse di area padding dan minta fokus pada bidang input - di antara masalah lain yang lebih mencolok. Hanya ingin menunjukkan masalah yang kurang diperhatikan / diketahui ini - Ini mengganggu saya tanpa akhir ketika menggunakan halaman web yang menggunakan hack ini.
eselk
5

Yang sering dilupakan calcbisa datang ke penyelamatan di sini:

input {
  width: calc(100% - 1em);
  padding: 0.5em;
}

Karena kita tahu padding akan menambah lebar elemen, kita cukup mengurangi padding dari keseluruhan lebar. Ini didukung oleh semua browser utama, responsif, dan tidak memerlukan div pembungkus yang berantakan.

XanderStrike
sumber
4

Saya telah mengalami beberapa masalah dengan sesuatu yang mirip dengan ini. Saya memiliki tds dengan input 100% dan padding kecil. Apa yang saya lakukan adalah mengkompensasi bantalan pada td sebagai berikut:

.form td {
    padding-right:8px;
}

.form input, .form textarea {
    border: 1px solid black;
    padding:3px;
    width:100%;
}

padding 8px untuk menyertakan batas dan padding dari input / textarea. Semoga ini membantu!

Keye
sumber
Teknik ini bekerja sangat baik untuk menyejajarkan lebar sel yang berisi input empuk dengan sel yang tidak .. Hanya menerapkan hak padding secara selektif untuk setiap TD yang berisi input lebar 100%.
Seb Barre
1

Mungkin mengambil latar belakang perbatasan + dari input, dan sebaliknya melampirkannya divdengan perbatasan + latar belakang dan lebar: 100%, dan menetapkan margin pada input?

Amber
sumber
Itulah jenis peretasan yang saat ini saya gunakan untuk masalah ini, tetapi saya lebih suka menggunakan batas pada input untuk "alasan gaya" atau yang lainnya. Tapi ya, ini adalah bagaimana saya saat ini melakukannya jadi solusi yang layak
Sandman
1

Salah satu solusi yang saya temukan berfungsi adalah benar-benar memposisikan input dengan tag induk yang relatif diposisikan.

<p class="full-width-input">
    <input type="text" class="text />
</p>

Terapkan gaya:

p.full-width-input {
    position: relative;
    height: 35px;
}

p.full-width-input input.text {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    padding: 5px;
}

Satu-satunya hal yang perlu diperhatikan adalah bahwa tag paragraf memerlukan pengaturan ketinggian karena anak-anak yang diposisikan mutlak tidak akan memperluas ketinggiannya. Ini menghindari kebutuhan untuk mengatur width: 100%dengan menguncinya ke sisi kiri dan kanan elemen induk.

Gabz
sumber
0

Coba gunakan persentase untuk lapisan Anda:

.input { 

  // remove border completely
  border: none;

  // don't forget to use the browser prefixes
  box-shadow: 0 0 0 1px silver;

  // Use PERCENTAGES for at least the horizontal padding
  padding: 5%; 

  // 100% - (2 * 5%)
  width: 90%; 

}

Jika Anda khawatir tentang pengguna di browser lama yang tidak bisa melihat bayangan kotak, berikan saja warna latar belakang halus sebagai cadangan. Jika Anda menggunakan piksel untuk hal-hal semacam ini, maka kemungkinan Anda menggunakannya di tempat lain, yang bisa menghadirkan beberapa tantangan ekstra, beri tahu saya jika Anda mengalaminya.

stephenmurdoch
sumber
-3

Satu-satunya hal yang saya tahu untuk mencegah hal ini adalah menetapkan nilai seperti itu 100% -10. Tetapi memiliki beberapa masalah kompatibilitas.

Tarik
sumber