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


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.


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.


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%;

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 */ 
}

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.


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.


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


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>).


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/


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.


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;
}


-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


-1

Saya memiliki masalah yang sama. Perbaiki seperti ini:

width: 100%;
box-sizing: border-box;

-9

Kamu bisa melakukan ini:

width: auto;
padding: 20px;

Ini tidak sama dengan 100% - margin.
James
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.