Girdisinin kalan genişliğini dolduracak şekilde stil girdisi öğesi


199

Diyelim ki böyle bir html snippet'im var:

<div style="width:300px;">
    <label for="MyInput">label text</label>
    <input type="text" id="MyInput" />
</div>

Bu benim tam kodum değil, ama önemli olan, sabit genişlikli bir kapta aynı satırda bir etiket ve metin girişi olması. Girdiyi, ambalajın boyutunu etiketini bilmeden sarmadan ve dolduracak şekilde nasıl doldurabilirim?


Sorunun uzun zaman önce olduğunu biliyorum ama elbette eski olmayan iyi bir çözüm ekleyeceğim.
danijar

Yanıtlar:


138

herkes mizanpaj için tablolardan nefret ettikçe, açık tablo etiketleri veya display: table-cell kullanarak bu tür şeylere yardımcı olurlar.

<div style="width:300px; display:table">
    <label for="MyInput" style="display:table-cell; width:1px">label&nbsp;text</label>
    <input type="text" id="MyInput" style="display:table-cell; width:100%" />
</div>

Bu IE6 ile çalışır mı? Aksi takdirde bunun için küçük bir tablo tanımlamam gerekebilir :(
Joel Coehoorn

emin değilim, ne yaptıklarını görmek için hızlı bir test yapın diyebilirim, ama IE'ye kolay erişimim yok
kobbal

Sorun değil: Bu beni işe yarayan bir şeye yöneltti.
Joel Coehoorn

42
Joel'i paylaşmak ister misin?
John

10
Anlaştık, gerçek çözümünüzü geri kalanımızla paylaşmalı ve bunun yerine cevap olarak işaretlemelisiniz - olduğu gibi, bu biraz sinir bozucu.
BrainSlugs83

156

İşte JavaScript veya tablo düzeni kesmek kullanmadan basit ve temiz bir çözüm. Bu cevaba benzer: Girilen metin otomatik genişlik% 100 diğer öğelerle doluyor

Giriş alanını bir açıklık ile sarmak önemlidir display:block. Bir sonraki şey, düğmenin önce ve giriş alanının ikinci olması gerektiğidir.

Ardından düğmeyi sağa kaydırabilirsiniz ve giriş alanı kalan alanı doldurur.

form {
    width: 500px;
    overflow: hidden;
    background-color: yellow;
}
input {
    width: 100%;
}
span {
    display: block;
    overflow: hidden;
    padding-right:10px;
}
button {
    float: right;
}
<form method="post">
     <button>Search</button>
     <span><input type="text" title="Search" /></span>
</form>

Basit bir keman: http://jsfiddle.net/v7YTT/90/

Güncelleme 1: Web siteniz yalnızca modern tarayıcıları hedefliyorsa, esnek kutular kullanmanızı öneririm . Burada mevcut desteği görebilirsiniz .

Güncelleme 2: Bu, giriş alanıyla tamı paylaşan birden fazla düğme veya diğer öğelerle bile çalışır. İşte bir örnek .


Bu, html'yi değiştirir: sonunda istediğiniz öğe ilk olarak html'de listelenir.
Joel Coehoorn

@CoelCoehoorn, doğru. Bunu bir tablo kullanmayı tercih edip etmeme kararınızdır.
danijar

2
Harika çalışıyor. Facebook tarzı bir etiketleyici veya benzeri bir şey oluşturmak için sağ yerine float: left kullanın.
hobberwickey

1
Harika çalışıyor! Ama birisi bunun nasıl çalıştığının arkasındaki mantığı açıklayabilir mi ?!
sherlock

1
Bu kötü bir cevap. Sadece bakarsanız işe yarıyor gibi görünüyor, ama git kemanı deneyin. Aslında giriş kutusunun yarısını kesiyor, ancak test etmeye başlamadığınız sürece söyleyemezsiniz. Amaç, giriş kutusunu ekran alanının genişliğine sığdırmak, kısaltmak değil. Herhangi bir stil (yuvarlatılmış köşeler, kenarlık, metnin doğru gerekçesi) yapmaya çalışırsanız bu tamamen başarısız olur.
Roger Hill

55

Flexbox kullanmanızı öneririm:

Yine de uygun satıcı öneklerini eklediğinizden emin olun!

form {
  width: 400px;
  border: 1px solid black;
  display: flex;
}

input {
  flex: 2;
}

input, label {
  margin: 5px;
}
<form method="post">
  <label for="myInput">Sample label</label>
  <input type="text" id="myInput" placeholder="Sample Input"/>
</form>


Soru çok eski ... muhtemelen bugün böyle yapardım. Deneme şansım olursa ve ihtiyacım olan tüm tarayıcılarla çalışırsa, kabul edilen yanıtı güncelleyeceğim. Muhtemelen, bunu denemem uzun zaman alacaktır. Şu anda sys yönetici ekibindeyim, artık çok fazla web işi yapma.
Joel Coehoorn

A kullanarak bir örnek verebilir misiniz label? Özellikle orijinal sorudan HTML'nin nasıl düzenlenmiş olabileceğini border-box
merak ediyorum

4
Neden flex: 2olmasın flex: 1?
Iulius Curt

42

Lütfen bunun için flexbox kullanın. Çocuklarını arka arkaya bükecek bir konteynerin var. İlk çocuk gerektiğinde yerini alır. İkincisi, kalan tüm alanı almak için esner:

<div style="display:flex;flex-direction:row">
    <label for="MyInput">label&nbsp;text</label>
    <input type="text" id="MyInput" style="flex:1" />
</div>


Çak bir beşlik! :) Eklemeye değer bir şey (çoğumuz hala flexbox modelini yeni kucaklayan bağlamda): INPUT bir FORM'da olacak ve bu da genel esnek kapta (örneğin, diğer form olmayan şeylerle) ), ve sonra artık çalışmaz - çünkü esnek davranış sadece doğrudan torunlar (yani alt öğeler) için geçerlidir . Yani, FORM da esnek bir kontrainer olmalı!
Sz.

flex-yön zaten rowvarsayılan olarak belirtmeniz gerekmez.
Fabian Picone

kazanmak için esneme (tekrar); 2019'da çok alakalı cevap
secretwep

17

Bunu başarmanın en kolay yolu:

CSS:

label{ float: left; }

span
{
    display: block;
    overflow: hidden;
    padding-right: 5px;
    padding-left: 10px;
}

span > input{ width: 100%; }

HTML:

<fieldset>
    <label>label</label><span><input type="text" /></span>
    <label>longer label</label><span><input type="text" /></span>
</fieldset>

Görünüşe göre: http://jsfiddle.net/JwfRX/


Bu benim için iyi çalışıyor. Taşma işlerin sarılmasını önler, sağ taraftaki dolgu sağ tarafın kesilmesini önler.
Prof Von Lemongargle

Not: Modern tarayıcı ile yukarıda leishman tarafından açıklandığı gibi flex-box kullanmanızı tavsiye ederim…
llange

4

Çok kolay hile bir CSS calcformül kullanıyor . Tüm modern tarayıcılar, IE9, çok çeşitli mobil tarayıcılar bunu desteklemelidir.

<div style='white-space:nowrap'>
  <span style='display:inline-block;width:80px;font-weight:bold'>
    <label for='field1'>Field1</label>
  </span>
  <input id='field1' name='field1' type='text' value='Some text' size='30' style='width:calc(100% - 80px)' />
</div>

4
Bu, etiketin tam genişliğini bildiğinizi veya fazladan yer koymak istediğinizi varsayar.
Nelson Rothermel

2

bunu deneyebilirsiniz:

div#panel {
    border:solid;
    width:500px;
    height:300px;
}
div#content {
	height:90%;
	background-color:#1ea8d1; /*light blue*/
}
div#panel input {
	width:100%;
	height:10%;
	/*make input doesnt overflow inside div*/
	-webkit-box-sizing: border-box;
       -moz-box-sizing: border-box;
            box-sizing: border-box;
	/*make input doesnt overflow inside div*/
}
<div id="panel">
  <div id="content"></div>
  <input type="text" placeholder="write here..."/>
</div>


bugün en iyi yöntem
yota

0

Bootstrap 4 kullanıyorsanız:

<form class="d-flex">
  <label for="myInput" class="align-items-center">Sample label</label>
  <input type="text" id="myInput" placeholder="Sample Input" class="flex-grow-1"/>
</form>

Daha da iyisi, Bootstrap'ta yerleşik olanları kullanın:

  <form>
    <div class="input-group">
      <div class="input-group-prepend">
        <label for="myInput" class="input-group-text">Default</label>
      </div>
      <input type="text" class="form-control" id="myInput">
    </div>
  </form>

https://jsfiddle.net/nap1ykbr/

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.