Elemen input gaya untuk mengisi sisa lebar wadahnya

197

Katakanlah saya memiliki cuplikan html seperti ini:

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

Ini bukan kode persis saya, tetapi yang penting adalah ada label dan input teks pada baris yang sama dalam wadah dengan lebar tetap. Bagaimana cara mengatur input untuk mengisi sisa lebar wadah tanpa pembungkus dan tanpa mengetahui ukuran label?

Joel Coehoorn
sumber
Saya tahu pertanyaannya sudah lama, tetapi saya akan menambahkan solusi yang baik yang tentu saja tidak ketinggalan zaman.
danijar

Jawaban:

138

sama seperti semua orang membenci tabel untuk tata letak, mereka membantu dengan hal-hal seperti ini, baik menggunakan tag tabel eksplisit atau menggunakan tampilan: sel-tabel

<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>
cobbal
sumber
Apakah ini bekerja dengan IE6? Kalau tidak, aku mungkin harus benar-benar mendefinisikan meja kecil untuk :( ini
Joel Coehoorn
tidak yakin, saya akan mengatakan melakukan tes cepat untuk melihat apa yang mereka lakukan, tetapi saya tidak memiliki akses mudah ke IE
cobbal
Tidak apa-apa: ini mengarahkan saya ke sesuatu yang bekerja.
Joel Coehoorn
42
Mau berbagi Joel?
John
10
Setuju, Anda harus membagikan solusi Anda yang sebenarnya dengan yang lain, dan tandai sebagai jawabannya - seperti ini, ini agak menjengkelkan.
BrainSlugs83
155

Berikut ini adalah solusi sederhana dan bersih tanpa menggunakan JavaScript atau hack tata letak tabel. Ini mirip dengan jawaban ini: Input lebar teks otomatis mengisi 100% dengan elemen lain mengambang

Penting untuk membungkus bidang input dengan rentang yang display:block. Hal berikutnya adalah tombol harus didahulukan dan kolom input kedua.

Kemudian Anda dapat melayang tombol ke kanan dan bidang input mengisi ruang yang tersisa.

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>

Biola sederhana: http://jsfiddle.net/v7YTT/90/

Pembaruan 1: Jika situs web Anda ditargetkan hanya untuk peramban modern, saya sarankan menggunakan kotak fleksibel . Di sini Anda dapat melihat dukungan saat ini .

Pembaruan 2: Ini bahkan berfungsi dengan beberapa tombol atau elemen lain yang berbagi sepenuhnya dengan bidang input. Berikut ini sebuah contoh .

danijar
sumber
Ini mengubah html, meskipun: item yang Anda inginkan pada akhirnya tercantum pertama dalam html.
Joel Coehoorn
@ JoelCoehoorn, itu benar. Ini adalah keputusan Anda apakah Anda lebih suka menggunakan tabel atau tidak.
danijar
2
Ini sangat bagus. Gunakan float: left, bukannya right untuk membuat tagger gaya facebook atau yang serupa.
hobberwickey
1
Ini sangat bagus! Tetapi bisakah seseorang menjelaskan logika di balik cara kerjanya ?!
sherlock
1
Ini jawaban yang buruk. Sepertinya itu berfungsi jika Anda hanya meliriknya, tapi coba biola. Ini sebenarnya memotong setengah dari kotak input, tetapi Anda tidak bisa mengatakannya kecuali Anda mulai mengujinya. Tujuannya adalah untuk mencocokkan kotak input dengan lebar area tampilan, bukan memotongnya. Jika Anda mencoba melakukan penataan (sudut bulat, garis tepi, pembenaran teks yang tepat) ini sama sekali gagal.
Roger Hill
55

Saya sarankan menggunakan Flexbox:

Pastikan untuk menambahkan awalan vendor yang tepat!

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>

Leishman
sumber
Pertanyaannya sudah sangat lama ... ini mungkin bagaimana saya akan melakukannya hari ini. Jika saya mendapat kesempatan untuk mencobanya, dan berfungsi dengan semua browser yang saya butuhkan, saya akan memperbarui jawaban yang diterima. Namun, mungkin akan lama sekali sebelum saya mencoba ini. Saya di tim admin sistem sekarang, jangan melakukan hal-hal web lagi.
Joel Coehoorn
Bisakah Anda memberikan contoh menggunakan label? Saya akan sangat tertarik pada bagaimana HTML dari pertanyaan aslinya dapat ditata menggunakan border-box...
lacco
4
Kenapa flex: 2dan tidak flex: 1?
Iulius Curt
42

Silakan gunakan flexbox untuk ini. Anda memiliki wadah yang akan melenturkan anak-anaknya menjadi satu baris. Anak pertama mengambil ruangnya sesuai kebutuhan. Yang kedua melenturkan untuk mengambil semua ruang yang tersisa:

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

basarat
sumber
Hai lima! :) Satu hal yang patut ditambahkan (dalam konteks kebanyakan dari kita masih baru merangkul model flexbox): bahwa INPUT akan berada dalam FORMULIR, yang pada akhirnya mungkin berakhir di keseluruhan wadah fleksibel (mis. Dengan barang non-bentuk lainnya) ), dan kemudian tidak akan berfungsi lagi - karena perilaku fleksibel hanya berlaku untuk keturunan langsung (yaitu elemen anak). Jadi, FORMULIR juga harus merupakan kontrainer fleksibel!
Sz.
arah fleksibel sudah rowsecara default, Anda tidak perlu menentukannya.
Fabian Picone
fleksibel untuk menang (lagi); jawaban yang sangat relevan pada tahun 2019
secretwep
17

Cara termudah untuk mencapai ini adalah:

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>

Sepertinya: http://jsfiddle.net/JwfRX/

llange
sumber
Ini bekerja dengan baik untuk saya. Overflow menjaga barang-barang dari pembungkus, padding-right membuat sisi kanan tidak terpotong.
Prof Von Lemongargle
PS: Dengan browser modern saya akan merekomendasikan menggunakan flex-box seperti yang dijelaskan di atas oleh leishman ...
llange
4

Trik yang sangat mudah adalah menggunakan CSS calcformula. Semua browser modern, IE9, berbagai browser seluler harus mendukung ini.

<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>
Siapa
sumber
4
Ini mengasumsikan Anda tahu persis lebar label atau bersedia memasang dengan ruang ekstra.
Nelson Rothermel
2

Anda dapat mencoba ini:

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>

Andik
sumber
metode terbaik hari ini
yota
0

Jika Anda menggunakan Bootstrap 4:

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

Lebih baik lagi, gunakan apa yang ada di dalam Bootstrap:

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

DharmaTurtle
sumber