Girişler içindeki dolgu, genişliği% 100 keser


130

Tamam, bir nesneye padding ayarlamanın, açıkça ayarlanmış olsa bile genişliğinin değişmesine neden olduğunu biliyoruz. Bunun arkasındaki mantık tartışılsa da bazı unsurlarda bazı sorunlara neden olur.

Çoğu durumda, yalnızca bir alt öğe eklersiniz ve buna% 100'e ayarlanmış olan yerine dolgu eklersiniz, ancak form girdileri için bu olası bir adım değildir.

Şuna bir göz atın: http://sandman.net/test/formcss.html

İkinci girişin dolgusu, varsayılan ayara çok tercih ettiğim 5px'e ayarlanmış. Ancak maalesef bu,% 100 genişliğe 10 piksel eklemek de dahil olmak üzere girdinin her yönde 10 piksel büyümesini sağlar.

Buradaki sorun, girişin içine bir alt öğe ekleyemem, bu yüzden düzeltemem. Yani soru şu:

Genişliği% 100 tutarken girişin içine dolgu eklemenin bir yolu var mı? Formlar farklı genişlikte ebeveynlerde oluşturulacağı için% 100 olması gerekir, bu yüzden önceden ebeveynin genişliğini bilmiyorum.


3
CSS3 özniteliğinin nasıl kullanılacağını öğrenmek için stackoverflow.com/questions/628500/… sayfasına bakınbox-sizing
Daniel LeCheminant

15
Söylemeliyim ki, örnek sayfanızı bunca zaman yukarıda tuttuğunuz için teşekkürler. Birisi soruda bir url yayınladığında ve cevap yanıtlandıktan sonra veya jsfiddle gibi bir şey kullanmadığında beni deli ediyor.
Jonathan Dumanie'nin

Kutu boyutlandırma özelliğini kullanmaya gelince; benim sorunum da aynı sorundu, ancak yüksekliği - yüksekliği% 100 olarak ayarlamak, yükseklik + border + padding = konteyner yüksekliği anlamına gelir. Girdinin kabın gerçek yüksekliğine sahip olmasını sağlamak için sadece kutu boyutlandırma: içerik kutusu kullanmam gerekiyordu.
Skychan

Az önce söylediğim şeyin IE'de çalışmaması dışında. Kutu boyutlandırmalı IE11: içerik kutusu yüksekliği hiç ayarlamaz:% 100. Belirli bir piksel yüksekliğine saygı duyar. Yani yükseklik: Kutu boyutsuz 31px yükseklikten 6px daha azdır: 31px + box-sizeing: content-box. Ancak fikir, yüksekliği kullanmaktır:% 100, bu yüzden belirli piksel boyutu konusunda endişelenmiyorum!
Skychan

Yanıtlar:


288

CSS3'ü kullanarak , tarayıcının girdinin genişliğini hesaplama şeklini değiştirmek için özellik kutusu boyutlandırmasını kullanabilirsiniz .

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

Bununla ilgili daha fazla bilgiyi buradan okuyabilirsiniz: http://css-tricks.com/box-sizing/


@ Víctor Dieppa Garriga Teşekkürler, Harika bir çözüm.
sinanakyazici

1
Destek şu şekildedir: Chrome (herhangi): kutu boyutlandırma Opera 8.5+: kutu boyutlandırma Firefox (herhangi biri): -moz-kutu boyutlandırma Safari 3: -webkit-kutu boyutlandırma (5.1+ sürümlerinde öneksiz) IE8 +: kutu bir değer biçme. Ayrıca kabul edilen cevap için bunu tavsiye ederim, daha şık bir çözüm.
Baconbeastnz

1
IE'de kutu boyutlandırma desteğini açıklığa kavuşturmak için, IE için kutu boyutlandırma özelliği IE Belge Moduna bağlıdır, "IE8 Standartları modu" ve üzerinde çalışır. Dolayısıyla, belge modu "IE8 Standartları modu" ise, IE8 tarayıcı sürümünde de çalışacaktır. Umarım bu yardımcı olur
Sanjeev

Dürüst olmak gerekirse, box-sizing: border-box;aklıma gelen ilk şey bu, ama kesinlikle benim için çalışmıyor. Belki de büyük-büyük-büyük-büyükbaba display: flex;bununla uğraşıyor?
Cody

Görünüşe göre tüm büyük tarayıcılarda önek olmadan destekleniyor ve birkaç sürümde destekleniyor: caniuse.com/#feat=css3-boxsizing
Jason

7

Çapraz tarayıcı ile ne kadar uyumlu olduğunu bilmiyorum (firefox ve safari'de çalışıyor), ancak bu çözümü deneyebilirsiniz:

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

(Sadece değiştirdiğim değerleri gönderdi)


1
IE'de soruna neden olur.
Tarik

Pekala, bu beni pek şaşırtmıyor :) İşaretlemeyi değiştirmeden kolay bir çapraz tarayıcı çözümü olduğunu düşünmeyin.
michaelk

Tamam, marj eklemeden beri bu çözümü oyluyorum: -5px görünüşe göre bir ihlal değil. Bunu kullanan sayfaya dördüncü bir girdi ekledim ve gerçekten çalışıyor gibi görünüyor. jigsaw.w3.org/css-validator/…
Sandman

7

Seçeneklerden biri sarılmasıdır INPUTbir de DIVdolgu olan.

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>

8
Bir kapsayıcı div'i doldurmak, bir giriş alanına dolgu eklemeyle aynı olmayan sonuçlar üretir.
Felix Fung

Felix Fung'un söylediği şeye ekleyin - Doldurma alanında fare ile tıklama yeteneğini kaybedersiniz ve daha dikkat çekici diğer sorunların yanı sıra giriş alanına odaklanmasını sağlarsınız. Sadece bu daha az fark edilen / bilinen soruna dikkat çekmek istedim - Bu saldırıyı kullanan web sayfalarını kullanmak beni sonsuza kadar sinirlendiriyor.
eselk

5

Sıklıkla unutulanlar calcburada kurtarmaya gelebilir:

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

Dolgunun öğenin genişliğini artıracağını bildiğimizden, dolguyu genel genişlikten çıkarıyoruz. Tüm büyük tarayıcılar tarafından desteklenir, duyarlıdır ve dağınık sarmalayıcı div'leri gerektirmez.


4

Buna benzer bir şeyle ilgili bazı sorunlar yaşıyorum. Girişleri% 100 ve küçük bir dolgusu olan tds var. Yaptığım şey, td üzerindeki dolguyu şu şekilde telafi etmekti:

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

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

girdi / metin alanının kenarlığını ve dolgusunu dahil etmek için 8px dolgu. Bu yardımcı olur umarım!


Bu teknik, yastıklı girdiler içeren hücrelerin genişliğini, içermeyen hücrelerle hizalamak için harika çalışıyor. Yalnızca% 100 genişlik girdisi içeren herhangi bir TD'ye seçici olarak dolgu sağını uygulayın.
SEB Barre

1

Belki kenarlık + arka planı çıkarın inputve bunun yerine divkenarlık + arka plan ve genişliğe sahip bir içine alın :% 100 ve input?


Şu anda bu sorun için kullandığım türden bir hack, ancak "stil nedenleriyle" ya da başka nedenlerle girdide kenarlık kullanmayı tercih ederim. Ama evet, şu anda böyle yapıyorum, bu yüzden uygulanabilir bir çözüm
Sandman

1

İşe yaradığını bulduğum bir çözüm, girdiyi göreceli olarak konumlandırılmış bir üst etiketle kesinlikle konumlandırmaktır.

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

Stili uygulayın:

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

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

Dikkat edilmesi gereken tek şey, kesinlikle konumlandırılmış çocukları yüksekliğini genişletmeyeceği için paragraf etiketinin bir yükseklik ayarı gerektirmesidir. Bu, width: 100%onu ana elemanın sol ve sağ taraflarına kilitleyerek ayarlama ihtiyacını ortadan kaldırır .


0

Dolgunuz için yüzdeler kullanmayı deneyin:

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

}

Kutu gölgesini göremeyen eski tarayıcılardaki kullanıcılar için endişeleniyorsanız, girişe yedek olarak ince bir arka plan rengi verin. Bu tür bir şey için piksel kullanıyorsanız, o zaman onları başka bir yerde kullanıyorsunuzdur, bu da birkaç ekstra zorluk yaratabilir, bunlarla karşılaşırsanız bana bildirin.


-3

Bunu önlemek için bildiğim tek şey% 100 - 10 gibi değerler atamaktır. Ancak bazı uyumluluk sorunları var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.