Bagaimana membuat lebar elemen: 100% minus padding?

397

Saya punya input html.

Inputnya padding: 5px 10px;saya ingin 100% dari lebar div induk (yang cair).

Namun menggunakan width: 100%;menyebabkan input menjadi 100% + 20pxbagaimana saya bisa mengatasi ini?

Contoh

Hailwood
sumber
1
Lihat jawaban ini yang saya posting bukan 15 menit yang lalu: stackoverflow.com/questions/5219030/... Ini seharusnya bekerja dengan baik untuk Anda, kecuali jika Anda mengharuskannya bekerja di IE7.
tigapuluh
Jika Anda menggunakan metode saya, lihat sedikit pengeditan yang saya buat pada jawaban saya. Ini memastikan "even padding" di beberapa browser.
fiftydot
@Hailwood saya punya solusi yang menjaga bantalan inputdan mendukung IE7
Vladimir Starkov
Silakan juga lihat jawaban di bawah ini menggunakan fungsi calc
Daan

Jawaban:

486

box-sizing: border-box adalah cara cepat dan mudah untuk memperbaikinya:

Ini akan bekerja di semua browser modern , dan IE8 +.

Berikut ini demo: http://jsfiddle.net/thirtydot/QkmSk/301/

.content {
    width: 100%;
    box-sizing: border-box;
}

Versi awalan peramban ( -webkit-box-sizing, dll.) Tidak diperlukan di peramban modern.

tigapuluh
sumber
5
Saya kira ini bukan solusi yang buruk. Secara umum, elemen pembungkus dalam div tambahan adalah cara yang baik untuk elemen pad tanpa mendorong lebar keseluruhan elemen di luar wadah induknya.
Jake Wilson
1
Padding a wrapping div juga menghasilkan hasil yang tidak sama dengan menambahkan padding ke input secara langsung.
Felix Fung
@ thirtydot saya punya beberapa solusi yang lebih fleksibel dan elegan yang menjaga lebar input
Vladimir Starkov
8
@ thirtydot ya, biarkan saja rusak untuk IE7 dan biarkan M $ memperbaikinya :)
Petr Peller
Ini juga menjaga textareas ukuran otomatis untuk Anda jQuery orang vs kotak-ukuran sekrup itu kecuali Anda menerapkannya pada div tersembunyi.
Michael J. Calkins
276

Ini sebabnya kami punya box-sizing CSS.

Saya telah mengedit contoh Anda, dan sekarang ini berfungsi di Safari, Chrome, Firefox, dan Opera. Lihat: http://jsfiddle.net/mathias/Bupr3/ Yang saya tambahkan adalah ini:

input {
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
}

Sayangnya browser lama seperti IE7 tidak mendukung ini. Jika Anda mencari solusi yang berfungsi di IE lama, lihat jawaban lain.

Mathias Bynens
sumber
3
+1, tetapi caniuse.com/#search=box-sizing IE 8? Selain itu, github.com/Schepp/box-sizing-polyfill tampaknya memberikan solusi untuk IE 6-7.
Alix Axel
1
+1, ini bagus jika Anda tidak peduli tentang IE (saat menggunakan PhoneGap misalnya)
Luke B.
3
Jenis sihir apa ini? +1 untuk jawaban dan +1 untuk komentar di atas saya (untuk itulah saya membutuhkannya).
Eduard Luca
20
Ini harus menjadi perilaku default .. bukannya lebar +20. Terkadang CSS tampak sangat kacau.
Soth
2
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 membantu.
Sanjeev
40

Gunakan pengisi dalam persentase juga dan hapus dari lebar:

bantalan: 5%;
lebar: 90%;
Alex
sumber
19
Fyi, solusi ini hanya ideal untuk tata letak yang tidak fleksibel.
muffs
+1, Masalahnya dengan ini adalah perbatasan, saya kira. Biasanya, mereka hanya terlihat "benar" dengan maks 1 hingga 3 piksel. Hasilnya terlalu tidak dapat diprediksi mengingat inkonsistensi browser mengenai pembulatan sub-pixel.
Alix Axel
27

Anda dapat melakukannya tanpa menggunakan box-sizingdan tidak menghapus solusi seperti width~=99%.

Demo di jsFiddle :
masukkan deskripsi gambar di sini

  • Simpan input paddingdanborder
  • Tambahkan ke input horisontal negatif margin= border-width+horizontal padding
  • Tambahkan ke pembungkus input horisontal paddingsama dengan margindari langkah sebelumnya

Markup HTML:

<div class="input_wrap">
    <input type="text" />
</div>

CSS:

div {
    padding: 6px 10px; /* equal to negative input's margin for mimic normal `div` box-sizing */
}

input {
    width: 100%; /* force to expand to container's width */ 
    padding: 5px 10px;
    border: none;
    margin: 0 -10px; /* negative margin = border-width + horizontal padding */ 
}
Vladimir Starkov
sumber
4
Itu trik yang bagus, menggunakan margin untuk input dan padding untuk wrapper untuk mengimbangi input padding.
maulik13
Setuju sepenuhnya !!! Saya telah menggunakan solusi ini dan bekerja secara luas tanpa trik kotor! Ini harus menjadi solusi untuk setiap jenis jawaban ini ..
Andre Figueiredo
Saya tidak begitu mengerti apa peran margin negatif - yang saya tahu adalah jika nilainya salah, maka kotak berakhir ke satu sisi, tetapi entah bagaimana margin simetris memperbaikinya
Casebash
21

Gunakan css calc ()

Sangat sederhana dan mengagumkan.

input {
    width: -moz-calc(100% - 15px);
    width: -webkit-calc(100% - 15px);
    width: calc(100% - 15px);
}​

Seperti terlihat di sini: Lebar Div 100% dikurangi jumlah piksel tetap
Oleh webvitaly ( https://stackoverflow.com/users/713523/webvitaly )
Sumber asli: http://web-profile.com.ua/css/dev/css -width-100prc-minus-100px /

Hanya menyalin ini di sini, karena saya hampir melewatkannya di utas lainnya.

Daan
sumber
Anda perlu memprogramnya secara manual. Idealnya itu akan ditentukan secara otomatis.
JackHasaKeyboard
11

Dengan asumsi saya berada dalam wadah dengan bantalan 15px, inilah yang selalu saya gunakan untuk bagian dalam:

width:auto;
right:15px;
left:15px;

Itu akan meregangkan bagian dalam untuk apa pun lebar itu harus kurang dari 15px di kedua sisi.

Andologi
sumber
Bisakah Anda memposting contoh lengkap width:autoditerapkan ke inputbidang?
jakubiszon
itu hanya setengah jawaban. posisi default elemen adalah statis, jadi kiri & kanan tidak akan melakukan apa pun di sini. dan lebar otomatis juga merupakan nilai awal, jadi .. semua jawaban ini tidak apa-apa :)
honk31
5

Anda dapat mencoba beberapa trik penentuan posisi. Anda dapat memasukkan input dalam div dengan position: relativedan ketinggian tetap, kemudian pada input miliki position: absolute; left: 0; right: 0;, dan bantalan apa pun yang Anda suka.

Contoh langsung

Felix
sumber
Di browser apa Anda mengujinya? :(
fiftydot
Hmm, hanya berfungsi di Chrome. Tapi saya tahu saya punya sesuatu yang sangat mirip dengan bekerja di FF & IE juga.
Felix
Sepertinya itu tidak bekerja dengan <input>elemen - elemen di Firefox (idk tentang IE). Ini bekerja dengan <div>s. Dan tidak, display: blockpada <input>tidak berhasil juga: - /
Felix
5

Berikut adalah rekomendasi dari codeontrack.com , yang memiliki contoh solusi yang baik:

Alih-alih mengatur lebar div ke 100%, atur ke auto, dan pastikan, bahwa div <div>diatur ke tampilan: blok (default untuk <div>).

M.YPC
sumber
3
Anda tidak boleh memposting tautan secara langsung. Anda dapat memasukkan informasi dari tautan itu. Alasannya adalah, mungkin besok tautan itu tidak akan tersedia dan jawaban Anda tidak akan lagi valid ..
Amnesh Goel
4

Pindahkan padding kotak input ke elemen pembungkus.

<style>
div.outer{ background: red; padding: 10px; }
div.inner { border: 1px solid #888; padding: 5px 10px; background: white; }
input { width: 100%; border: none }
</style>

<div class="outer">
    <div class="inner">
       <input/>
    </div>
</div>

Lihat contoh di sini: http://jsfiddle.net/L7wYD/1/

Martin Jespersen
sumber
2

Cukup pahami perbedaan antara lebar: otomatis; dan lebar: 100%; Lebar: otomatis; akan (OTOMATIS) MATERI menghitung lebar agar sesuai dengan yang diberikan dengan pembungkus div termasuk padding. Lebar 100% memperluas lebar dan menambahkan bantalan.

pengguna3849374
sumber
Bisakah Anda memasukkan contoh di mana ini bekerja dengan <input>? Kalau tidak, Anda hanya mengirim orang mengejar angsa liar.
Tuan Lister
0

Bagaimana dengan membungkusnya dalam wadah. Container harus memiliki gaya seperti:

{
    width:100%;
    border: 10px solid transparent;
}
Vitali Protosovitski
sumber
0

Coba ini:

width: 100%;
box-sizing: border-box;
Manolo Ramos
sumber
-1

Bagi saya, menggunakan margin:15px;padding:10px 0 15px 23px;width:100%, hasilnya adalah ini:

masukkan deskripsi gambar di sini

Solusi bagi saya adalah menggunakan width:autoalih-alih width:100%. Kode baru saya adalah:

margin:15px;padding:10px 0 15px 23px;width:auto. Kemudian elemen disejajarkan dengan benar:

masukkan deskripsi gambar di sini

Jaime Montoya
sumber
-1

Saya memiliki masalah yang sama. Perbaiki seperti ini:

width: 100%;
box-sizing: border-box;
Manny Alvarado
sumber
-9

Kamu bisa melakukan ini:

width: auto;
padding: 20px;
MissHD
sumber
Ini tidak sama dengan 100% - margin.
James