% 100 Genişlik Metin Kutularının kaplarının dışına taşmasını engelleyebilir miyim?


181

Diyelim ki tüm satırı doldurmak istediğim bir metin kutusu var. Ben böyle bir stil verecekti:

input.wide {display:block; width: 100%}

Genişlik metin kutusunun içeriğine dayandığından, bu sorunlara neden olur. Metin kutuları varsayılan olarak kenar boşluğu, kenarlıklar ve dolguya sahiptir, bu da% 100 genişlikli bir metin kutusunu kabından daha büyük yapar.

Örneğin, burada sağda:

resim açıklamasını buraya girin

Bir metin kutusunu konteynerinin genişliğini genişletmeden doldurmanın herhangi bir yolu var mı?

İşte ne demek istediğimi göstermek için bazı örnek HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Untitled Page</title>
    <style type="text/css">
        #outer{border: 1px solid #000; width: 320px; margin: 0px;padding:0px}
        #inner{margin: 20px; padding: 20px; background: #999;border: 1px solid #000;}
        input.wide {display:block; margin: 0px}
        input.normal {display:block; float: right}
    </style>
</head>
<body>
    <div id="outer">
        <div id="inner">
            <input type="text" class="wide" />
            <input type="text" class="normal" />
            <div style="clear:both;"></div>
        </div>
    </div>
</body>
</html>

Bu çalıştırılırsa, "geniş" metin kutusunun kabın dışına taştığını "normal" metin kutusuna bakarak görebilirsiniz. "Normal" metin kutusu kabın gerçek kenarına doğru yüzer. Ben "normal" metin kutusu gibi kenar ötesine genişlemeden, "geniş" metin kutusunu kendi konteyner doldurmaya çalışıyorum.

Yanıtlar:


87

Yapabileceğiniz şey, varsayılan "ekstraları" kaldırmaktır input:

input.wide {display:block; width:100%;padding:0;border-width:0}

Bu input, kabın içini tutacaktır . Eğer sınırları istiyorsun Şimdi, eğer sarın inputbir yer divayarlamak sınırlara sahip, div(eğer kaldırabilirsiniz bu şekilde display:blockgelen inputçok). Gibi bir şey:

<div style="border:1px solid gray;">
 <input type="text" class="wide" />
</div>

Düzenleme: Başka bir seçenek, stilini 'dan kaldırmak yerine input, sarılmış olarak telafi etmektir div:

input.wide {width:100%;}

<div style="padding-right:4px;padding-left:1px;margin-right:2px">
  <input type="text" class="wide" />
</div>

Bu, farklı tarayıcılarda size biraz farklı sonuçlar verecektir, ancak kapsayıcıyla çakışmayacaktır. Div'deki değerler kenarlığın ne kadar büyük olduğuna ve ve kenarlık inputarasında ne kadar boşluk olmasını istediğinize bağlıdır input.


3
Bu çok yaratıcı bir çözüm. Bununla ilgili tek sorun, sarmalayıcı div kenarlığını değiştirmek için JavaScript kullanmadıkça odak kazandığında metin kutusunda bir anahat tanımlayamıyorum.
Dan Herbert

@DanHerbert, haklısın, bu yöntemin büyük bir UX kusuru
Baumr

275

Bir metin kutusunu konteynerinin genişliğini genişletmeden doldurmanın herhangi bir yolu var mı?

Evet: 'box-sizeing: border-box' CSS3 özelliğini kullanarak, 'genişliğin' dış dolgu ve kenarlığı dahil etmek için ne anlama geldiğini yeniden tanımlayabilirsiniz.

Ne yazık ki CSS3 olduğu için destek çok olgun değil ve spec işlemi henüz bitmediğinden, bu arada tarayıcılarda farklı geçici isimler var. Yani:

input.wide {
    width: 100%;
    box-sizing: border-box;
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
}

Eski okul alternatifi, etrafındaki <div> veya <td> öğesine bir miktar 'sağa doğru' koymaktır. girdiyi vermek. (Genellikle IE <8 için 6 piksel.)


Bu işe yaramaz, ancak bunu kullanamazsınız, çünkü muhtemelen yıllarca desteklemeyen mobil cihazları hedefliyorum. : - \
Dan Herbert

20
Mobil cihazların bilgisayarlardan önce tam HTML5 desteğine sahip olacağını düşünüyorum.
Mariano Cavallo

4
@Kindred: IEMobile ve Blackberry'yi buna dahil ederseniz kesinlikle olmaz.
bobince

1
Bunun masaüstü tarayıcılar için büyük bir desteği var: quirksmode.org/css/contents.html
logan

2
Bu harika buttersauce'u bulmak beni bu kadar uzun sürdü mü ??? Bunu kabul edilen cevap yapabilir miyiz?
streetlogics

14

Bu benim için problemi çözdü!

Harici bir div'e ihtiyaç duymadan. Sadece verilen metin kutusuna uygulayın.

box-sizing: border-box; 

Bu özellik ile "width ve height özellikleri (ve min / max özellikleri) içerik, dolgu ve kenarlık içerir, ancak kenar boşluğunu içermez"

W3schools'daki tesisin açıklamasına bakın .

Umarım bu birine yardımcı olur!


Harika basit! Teşekkürler!
nurider

10

Sadece kendim bu sorunla karşılaştım ve tüm test tarayıcılarımda (IE6, IE7, Firefox) işe yarayan tek çözüm şuydu:

  1. Giriş alanını iki ayrı DIV'ye sarın
  2. Dış DIV'yi% 100 genişliğe ayarlayın, bu da kabımızın belgeyi taşmasını önler
  3. Girişin yatay taşmasını telafi etmek için dolguyu tam miktarın iç DIV'sine koyun.
  4. Girişteki özel dolguyu iç DIV'de izin verdiğim miktarda taşacak şekilde ayarlayın

Kod:

<div style="width: 100%">
    <div style="padding-right: 6px;">
        <input type="text" style="width: 100%; padding: 2px; margin: 0;
                                  border : solid 1px #999" />
    </div>
</div>

Burada, giriş elemanı için toplam yatay taşma 6px - 2x (dolgu + kenarlık) - bu nedenle 6px'lik iç DIV için bir dolgu hakkı ayarladık.


giriş elemanına 8px dolgu eklemek ve artık çalışmıyor
JuHwon

7

kutu boyutlandırma desteği aslında oldukça iyi: http://caniuse.com/#search=box-sizing

IE7'yi hedeflemediğiniz sürece, bu özelliği kullanarak bu tür sorunları çözebilmeniz gerekir. Sass veya daha az gibi bir katman, btw gibi önceden eklenmiş kuralların kullanılmasını kolaylaştırır.


3

Aslında, CSS, kenar boşlukları, kenarlıklar ve dolgu dahil kapın tüm genişliğine göre% 100 tanımlamasıdır; bu boşluğun boş olduğu anlamına gelir. kabında kenar boşluğu, kenarlık veya dolgu bulunmadığı sürece, içeriğinde% 100'den daha küçük bir miktar bulunur.

Bu sezgiseldir ve çoğu kişi tarafından artık sıkıştığımız bir hata olarak kabul edilir . Etkili bir şekilde,% boyutlarının en üst seviye bir konteynerden başka bir şey için iyi olmadığı ve hatta o zaman bile, sadece kenar boşlukları, kenarlıkları veya dolguları yoksa iyi olduğu anlamına gelir.

Metin alanının kenar çizgileri, ve dolgu geldiğini hatırlatırız olan kapalı şeyleri atmak konteyner 's var - bunun için belirtilen CSS boyutunda bulunmaktadır.

% 98 kullanarak tolere edilebilir bir şekilde çalıştım, ancak bu daha az bir çözüm, çünkü giriş alanları konteyner büyüdükçe daha kısa düşüyor.


EDIT: Bu benzer soruya rastladım - verilen cevabı hiç denemedim ve probleminiz için geçerli olup olmadığından emin değilim, ama öyle olacak gibi görünüyor.


1

İşe yarayabilecek bir çözüm (benim için işe yarar), girişe negatif kenar boşluğu uygulamaktır (metin kutusu) veya ie7 için sabit genişlik uygulamak veya ie7 desteğini bırakmaktır. Bu piksel mükemmel genişliği sonuçlanır .. Benim için onun 7 böylece 3 ve 4 ekledi ama yine de piksel mükemmel ..

Aynı sorunu vardı ve sınır vb için ekstra div var nefret!

İşte işime yarayan çözümüm!

Yıldız saldırılarından kaçınmak için yalnızca ie7 stil sayfası kullanmalısınız.

input.text{
    background-color: #fbfbfb;
    border : solid #eee 1px;
    width: 100%;
    -box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    height: 32px;

    *line-height:32px;
    *margin-left:-3px;
    *margin-right:-4px;
    display: inline;   
    padding: 0px 0 0 5px;

}

1

Eğer kullanamıyorsanız box-sizing:border-boxkaldırmakta deneyebilirsiniz width:100%ve çok büyük koyarak sizeözniteliği <input>elemanı, dezavantajı html değiştirmek zorunda ve sadece CSS ile bunu yapamaz ancak geçerli:

<input size="1000"></input>

0

Dinamik olarak yapmanız gerekmiyorsa (örneğin, formunuz sabit bir genişliktedir), alt <input>öğelerin genişliğini, dolgu, kenar boşluğu, kenarlık vb.

 // the parent div here has a width of 200px:
.form-signin input[type="text"], .form-signin input[type="password"], .form-signin input[type="email"], .form-signin input[type="number"] {
  font-size: 16px;
  height: auto;
  display: block;
  width: 280px;
  margin-bottom: 15px;
  padding: 7px 9px;
}

0

Kutu boyutlandırmasını kullanamıyorsanız (örn. HTML'yi iText kullanarak PDF'ye dönüştürdüğünüzde). Bunu dene:

CSS

.input-wrapper { border: 1px solid #ccc; padding: 0 5px; min-height: 20px; } 
.input-wrapper input[type=text] { border: none; height: 20px; width: 100%; padding: 0; margin: 0; }

HTML

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

0

Bu çalışıyor:

<div>
    <input type="text" 
        style="margin: 5px; padding: 4px; border: 1px solid; 
        width: 200px; width: calc(100% - 20px);">
</div>

İlk 'genişlik' eski tarayıcılar için bir geri dönüş kuralıdır.


0

Ekstra dolgu için ofseti dengelemek için sadece stil verin. Aşağıdaki örnekte, 20px'lik toplam dolgu ofseti için girişteki dolgu sol ve sağda 10 piksel olacaktır:

input[type=text]{
   width: calc(100% - 20px);
}
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.