% 100 genişliğe sahip HTML giriş metin kutusu tablo hücrelerini taşır


106

% 100 genişliğe sahip giriş öğelerinin neden tablonun hücre sınırını aştığını bilen var mı?

Aşağıdaki giriş kutusunun tablonun hücre sınırını aşan basit örneğinde, sonuç korkunçtur. Bu test edildi ve şu şekilde oluyor: Firefox, IE7 ve Safari.

Senin için mantıklı mı? Bir şey mi kaçırıyorum, olası bir çözüm hakkında bir fikriniz var mı?

<!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>

1
Girişleri sunmak için sadece bir tablo kullanıyorsanız, a veya içinde s ve s formile a kullanmaya geçebilirsiniz . bu, en azından biraz daha anlamsaldır. Kesinlikle olsa da ,. labelinputulolformtable
David, Monica'nın

Yanıtlar:


216

box-sizingHarici dolgu ve kenarlığı eklemek için CSS3 özelliğini kullanabilirsiniz :

input[type="text"] {
     width: 100%; 
     box-sizing: border-box;
     -webkit-box-sizing:border-box;
     -moz-box-sizing: border-box;
}

1
Söylemesi üzücü ama ne yazık ki IE 7 kutu boyutlandırması ile doğru şekilde ilgilenmiyor. IE 7 ... css3.info/preview/box-sizing'de aşağıdakileri deneyin veya css-tricks.com/box-sizing
AnthonyVO

@AnthonyVO: doğru, IE7 için tek geçici çözüm, IE koşullu yorumları kullanarak bunun için belirli CSS eklemektir <!--[if lt IE 8]>veinput[type="text"] {width:95%}
Marco Demaio

24

Genişlik değeri, sınır veya dolguyu hesaba katmaz:

http://www.htmldog.com/reference/cssproperties/width/

Her bir tarafta 2 piksel dolgu ve her bir tarafta 1 piksel kenarlık elde edersiniz.
% 100 + 2 * (2px + 1px) =% 100 + 6px, bu, üst td'nin sahip olduğu% 100 alt içerikten daha fazladır.

Şu seçeneklere sahipsiniz:

  • Ya ayar box-sizing: border-box;gereği pricco cevabı @ ;
  • Veya 0 kenar boşluğu ve dolgu kullanarak (ekstra boyuttan kaçınarak).

Sr pts cevabına ek olarak, dolgu ve kenarlığı 0px olarak ayarlayabilirsiniz, sonra% 100 çalışmalıdır.
Mauro

Aslında, td için herhangi bir dolgu ayarlamadan bile - çok iyi eklenmiş.
ANeves

1
Ayrıca, dolgu bir sorun yaratırsa text-indent, metnin ön kenarının önünde dolguyu simüle etmek ve line-heightdikey dolgu için kullanmak mümkündür (dikey dolguyu korumak genişliği yine de etkilemez).
David, Monica'nın

14

Bu tür şeylerle ilgili sorun width:95%;, geniş esnek düzenlerde doğru görünmemeleridir (çünkü% 5 daha sonra 30 piksel gibi olabilir).

Aşağıdaki çözümler benim için çok iyi çalışıyor (Firefox, IE 9, Safari'de test edildi):

<table style="background-color: blue; width: 100%;" cellpadding="0" cellspacing="0">
<tr>
    <td style="background-color: red;   padding: 3px;">
        <div style="margin-right: 3px;">
            <div style="padding-right: 3px;">
                <input type="text" style="width:100%;">
            </div>
        </div>
    </td>
    <td style="background-color: purple;   padding: 3px;">
        <div style="margin-right: 3px;">
            <div style="padding-right: 3px;">
                <input type="text" style="width:100%;">
            </div>
        </div>
    </td>
    <td style="background-color: green;   padding: 3px;">
        <div style="margin-right: 3px;">
            <div style="padding-right: 3px;">
                <input type="text" style="width:100%;">
            </div>
        </div>
    </td>
</tr>
</table>

(doğru dolguyu fark etmeyi kolaylaştırmak için renkler eklendi)

İşin püf noktası, girişi iki div ile sarmaktır, dış tarafın 3px'lik bir marjı vardır (bu, onu td'den 3px daha küçük yapar), iç kısımda 3px dolgusu vardır. Bu, girdiyi 6px td'den daha küçük yapar, bu da başlamak istediğiniz şeydir.

Bunun mekaniğinden emin değilim ama işe yarıyor.

Bu basit örnekte, sağ kenar boşluğu olan tek bir div ile de çalışır. Ancak benim web uygulamam durumunda, sadece yukarıdaki çözüm çalışır.

<table style="background-color: blue; width: 100%;" cellpadding="0" cellspacing="0">
<tr>
    <td style="background-color: red;   padding: 3px;">
        <div style="margin-right: 6px;">
                <input type="text" style="width:100%;">
        </div>
    </td>
    <td style="background-color: purple;   padding: 3px;">
        <div style="margin-right: 6px;">
                <input type="text" style="width:100%;">
        </div>
    </td>
    <td style="background-color: green;   padding: 3px;">
        <div style="margin-right: 6px;">
                <input type="text" style="width:100%;">
        </div>
    </td>
</tr>
</table>

Çalışır (+1 oy aldı). Garip bir şekilde, her <input> 'un önüne biraz metin ekledim ve onları aynı satırda tutmak için "white-space: nowrap" ekledim, ardından "white-space: nowrap" her şeyi kaldırırsam, üç <inputs> tablo hücrelerini taştı tekrar çalışır. Tuhaf.
Jose Manuel Abarca Rodríguez

8

Sorun daha önce açıklanmıştı, bu yüzden sadece tekrarlayacağım: genişlik, sınır ve dolguyu hesaba katmaz. Bunun tartışılmamış olası bir cevabı, ancak bulduğum bir grupta bana yardımcı oldu, girdilerinizi özetlemek. İşte kod ve bunun nasıl yardımcı olduğunu birazdan açıklayacağım:

<table>
  <tr>
    <td><div style="overflow:hidden"><input style="width:100%" type="text" name="name" value="hello world" /></div></td>
  </tr>
</table>

GİRİŞ'i saran DIV'nin dolgusu veya sınırı yoktur. Çözüm bu. Bir DIV, kabının boyutuna genişler, ancak aynı zamanda kenarlık ve dolguyu da dikkate alır. Şimdi, INPUT, kenarlıksız ve pedsiz olduğu için kabının boyutuna genişleme konusunda herhangi bir sorun yaşamayacak. Ayrıca DIV'nin taşmasının gizli olarak ayarlandığını unutmayın. Görünüşe göre, öğeler varsayılan olarak kapsayıcılarının dışına çıkabilir ve varsayılan görünür taşması olabilir. Bu sadece girdinin kabının içinde kalmasını ve içeri girmeye çalışmamasını sağlar.

Bunu Chrome'da ve Fire Fox'ta test ettim. Görünüşe göre ikisi de bu çözüme saygı duyuyor.

GÜNCELLEME : Rastgele bir olumsuz oy aldığım için, taşma ile başa çıkmanın daha iyi bir yolunun, pricco tarafından açıklanan CSS3 kutu boyutlandırma özelliğiyle olduğunu söylemek isterim:

.myinput {
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
    -ms-box-sizing: border-box;
    -o-box-sizing: border-box;
    box-sizing: border-box;
}

Bu, büyük tarayıcılar tarafından oldukça iyi destekleniyor gibi görünüyor ve taşma hilesi gibi "hacky" değil. Ancak, mevcut tarayıcılarda bu yaklaşımla ilgili bazı küçük sorunlar vardır (bkz. Http://caniuse.com/#search=box-sizing Bilinen Sorunlar).


3
Kısa bir not: overflow: hidden;içerik hala aynı şekilde kutunun dışına 'geçerken', ancak gösterilmek yerine kesilir - böylece diğer içerikle örtüşmez.
ANeves

2

Bu sorunun 3 yaşında olduğunu biliyorum, ancak mevcut tarayıcılar için sorun hala devam ediyor ve insanlar hala buraya geliyor. Şimdilik çözüm calc () :

input {
    width: calc(100% - 12px); /* IE 9,10 , Chrome, Firefox */
    width: -webkit-calc(100% - 12px); /*For safari 6.0*/
}

Çoğu modern tarayıcı tarafından desteklenmektedir.


1

Sorun, giriş öğesi kutusu modelinden kaynaklanmaktadır. Yakın zamanda girdimi mobil cihazlar için% 100'de tutmaya çalışırken soruna güzel bir çözüm buldum.

Girişinizi başka bir öğeyle, örneğin bir div ile sarın. Ardından, girdiniz için istediğiniz stili sarıcı div'e uygulayın. Örneğin:

<div class="input-wrapper">
 <input type="text" />
</div>

.input-wrapper {
    border-raius:5px;
    padding:10px;
}
.input-wrapper input[type=text] {
    width:100%;
    font-size:16px;
}

.İnput-wrapper yuvarlak köşe dolgusu vb. Girdiniz için istediğinizi verin, ardından girdi genişliğini% 100 verin. Girişinizi bir sınır vb. İle güzel bir şekilde doldurmuşsunuz, ancak sinir bozucu taşma olmadan!


1

Bu sorunu @ hallodom'un cevabından başlayarak düzelttim. Tüm girdilerim li'lerin içindeydi, bu yüzden tek yapmam gereken li overflow'u ayarlamaktı: bu fazla girdi taşmasını ortadan kaldırmak için gizli.

.ie7 form li {
  width:100%;
  overflow:hidden;
}

.ie7 input {
  width:100%;
}

1

bu marj mücadelesi yerine sadece yap

input{
    width:100%;
    background:transparent !important;
}

bu şekilde hücre kenarlığı görünür ve satır arka plan rengini kontrol edebilirsiniz


0

DOCTYPE bildiriminden "http://www.w3.org/TR/html4/loose.dtd" dosyasını çıkarın ve sorununuzu düzeltin.

Şerefe! :)


http://www.w3.org/TR/html4/strict.dtdStrict mi demek istiyorsun ? ref. w3.org/QA/2002/04/valid-dtd-list.html Her neyse, bu bir seçenek değildir, çünkü DOCTYPE'ın şimdi değiştirilmesi muhtemelen web sayfalarındaki diğer birçok stuf'un oluşturulmasını etkileyecektir.
Marco Demaio

0

Bazı Javascript ile, içeren TD'nin tam genişliğini elde edebilir ve ardından bunu doğrudan giriş öğesine atayabilirsiniz.

Aşağıdaki ham javascript ancak jQuery onu daha temiz hale getirecektir ...

var inputs = document.getElementsByTagName('input');
for (var i = 0; i < inputs.length; i++)
{
    var el = inputs[i];
    if (el.style.width == '100%')
    {
        var pEl = el.parentNode;  // Assumes the parent node is the TD...
        el.style.width = pEl.offsetWidth;
    }
}

Bu çözümle ilgili sorunlar şunlardır:

1) Girişleriniz bir SPAN gibi başka bir öğede yer alıyorsa, döngü oluşturmaya ve TD'yi bulmaya ihtiyacınız olacak çünkü SPAN'lar gibi öğeler girişi saracak ve TD'nin boyutuyla sınırlı olmak yerine boyutunu gösterecektir.

2) Farklı seviyelerde eklenmiş dolgu veya kenar boşluklarınız varsa, bunu [pEl.offsetWidth] 'den açıkça çıkarmanız gerekebilir. Hesaplanabilen HTML yapınıza bağlı olarak.

3) Tablo sütunları dinamik olarak boyutlandırılmışsa, bir öğenin boyutunu değiştirmek tablonun bazı tarayıcılarda yeniden akmasına neden olur ve giriş boyutlarını sırayla "düzeltirken" aşamalı bir etki elde edebilirsiniz. Çözüm, sütuna yüzde veya piksel olarak belirli genişlikler atamak VEYA yeni genişlikleri toplamak ve sonra bunları ayarlamaktır. Aşağıdaki koda bakın ..

var inputs = document.getElementsByTagName('input');
var newSizes = [];
for (var i = 0; i < inputs.length; i++)
{
    var el = inputs[i];
    if (el.style.width == '100%')
    {
        var pEl = el.parentNode;  // Assumes the parent node is the TD...
        newSizes.push( { el: el, width: pEl.offsetWidth });
    }
}

// Set the sizes AFTER to avoid stepping...
for (var i = 0; i < newSizes.length; i++)
{
    newSizes[i].el.style.width = newSizes[i].width;
}

0

Sorunu uygulayarak çözdüm box-sizing:border-box; girdi ve sarmalayıcıyla aynı şeyi yapmanın yanı sıra tablo hücrelerinin kendilerine.


0

Bunu kullanarak sorunu çözdüm

tr td input[type=text] {
  width: 100%;
  box-sizing: border-box;
  -webkit-box-sizing:border-box;
  -moz-box-sizing: border-box;
  background:transparent !important;
  border: 0px;
}

-1

Bunu düzeltmek için genellikle girdilerimin genişliğini% 99 olarak ayarlıyorum:

input {
    width: 99%;
}

Varsayılan stilleri de kaldırabilirsiniz, ancak bu, bunun bir metin kutusu olduğunu daha az belirgin hale getirir. Ancak yine de bunun kodunu göstereceğim:

input {
    width: 100%;
    border-width: 0;
    margin: 0;
    padding: 0;
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
}

Ad @ m


-2

Sorun border-width, girdi öğesinde yatıyor . Kısaca, margin-leftgiriş öğesinin olarak ayarlamayı deneyin -2px.

table input {
  margin-left: -2px;
}

öyle düşünmeyin. bu sadece kutuyu sola kaydırır ve sol marjı yok eder
cc young
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.