จัดรูปแบบองค์ประกอบอินพุตเพื่อเติมความกว้างที่เหลือของคอนเทนเนอร์


199

สมมติว่าฉันมีตัวอย่าง HTML แบบนี้:

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

นี่ไม่ใช่รหัสที่แน่นอนของฉัน แต่สิ่งสำคัญคือมีป้ายกำกับและป้อนข้อความในบรรทัดเดียวกันในคอนเทนเนอร์ที่มีความกว้างคงที่ ฉันจะจัดรูปแบบอินพุตให้เติมความกว้างที่เหลือของภาชนะโดยไม่ต้องห่อและไม่ทราบขนาดของฉลากได้อย่างไร


ฉันรู้ว่าคำถามนั้นนานมาแล้ว แต่ฉันจะเพิ่มทางออกที่ดีซึ่งแน่นอนว่าไม่ล้าสมัย
danijar

คำตอบ:


138

เท่าที่ทุกคนเกลียดตารางสำหรับการจัดวางพวกเขาช่วยอะไรแบบนี้ไม่ว่าจะใช้แท็กตารางที่ชัดเจนหรือใช้การแสดง: table-cell

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

มันจะใช้งานกับ IE6 ได้ไหม? มิฉะนั้นก็อาจจะต้องจริงกำหนดตารางเล็ก ๆ น้อย ๆ สำหรับ :( นี้
โจเอล Coehoorn

ไม่แน่ใจว่าผมจะบอกว่าทำแบบทดสอบอย่างรวดเร็วเพื่อดูสิ่งที่พวกเขาทำ แต่ฉันไม่สามารถเข้าถึงได้ง่าย IE
cobbal

ไม่เป็นไร: สิ่งนี้ชี้ให้ฉันเห็นสิ่งที่ใช้งานได้
Joel Coehoorn

42
สนใจที่จะแบ่งปัน Joel?
จอห์น

10
ตกลงคุณควรแบ่งปันทางออกที่แท้จริงของคุณกับพวกเราที่เหลือและทำเครื่องหมายว่าเป็นคำตอบแทน - เช่นนี้เป็นเรื่องที่น่ารำคาญ
BrainSlugs83

156

นี่เป็นวิธีที่ง่ายและสะอาดโดยไม่ต้องใช้ JavaScript หรือการแฮ็กเค้าโครงตาราง มันคล้ายกับคำตอบนี้: ป้อนข้อความความกว้างอัตโนมัติเติม 100% กับองค์ประกอบอื่น ๆ ที่ลอยอยู่

display:blockมันเป็นสิ่งสำคัญที่จะตัดช่องใส่กับช่วงซึ่งเป็น สิ่งต่อไปคือปุ่มต้องมาก่อนและฟิลด์อินพุตที่สอง

จากนั้นคุณสามารถลอยปุ่มไปทางขวาและช่องป้อนข้อมูลเติมพื้นที่ที่เหลือ

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>

ซอง่าย ๆ : http://jsfiddle.net/v7YTT/90/

อัปเดตที่ 1:หากเว็บไซต์ของคุณมีเป้าหมายต่อเบราว์เซอร์ที่ทันสมัยเท่านั้นฉันขอแนะนำให้ใช้กล่องที่มีความยืดหยุ่น นี่คุณสามารถเห็นในปัจจุบันการสนับสนุน

อัปเดต 2:สิ่งนี้สามารถใช้งานได้กับหลายปุ่มหรือองค์ประกอบอื่น ๆ ที่ใช้งานร่วมกันอย่างสมบูรณ์กับช่องป้อนข้อมูล นี่คือตัวอย่าง


สิ่งนี้จะเปลี่ยน html: รายการที่คุณต้องการในตอนท้ายจะแสดงเป็นรายการแรกใน html
Joel Coehoorn

@JoelCoehoorn ถูกต้องแล้ว มันเป็นการตัดสินใจของคุณไม่ว่าคุณจะชอบมันมากกว่าการใช้โต๊ะหรือเปล่า
danijar

2
มันใช้งานได้ดี ใช้โฟลต: ซ้ายแทนขวาเพื่อสร้างแท็กสไตล์ Facebook หรืออะไรที่คล้ายกัน
hobberwickey

1
มันใช้งานได้ดี! แต่ใครบางคนสามารถอธิบายตรรกะที่อยู่เบื้องหลังวิธีการทำงานนี้!
Sherlock

1
นี่เป็นคำตอบที่ไม่ดี ดูเหมือนว่าจะใช้งานได้ถ้าคุณเพียง แต่มองไปที่มัน แต่ไปลองเล่นซอ จริงๆแล้วมันคือการสับครึ่งหนึ่งของช่องป้อนข้อมูล แต่คุณไม่สามารถบอกได้จนกว่าคุณจะเริ่มทำการทดสอบ เป้าหมายคือเพื่อให้พอดีกับกล่องอินพุตกับความกว้างของพื้นที่แสดงผลไม่ใช่ตัดให้สั้นลง หากคุณพยายามที่จะจัดแต่งทรงผมใด ๆ (มุมโค้งมน, เส้นขอบ, เหตุผลที่เหมาะสมของข้อความ) นี้ล้มเหลวอย่างเต็มที่
Roger Hill

55

ฉันแนะนำให้ใช้ Flexbox:

ให้แน่ใจว่าได้เพิ่มคำนำหน้าผู้ขายที่เหมาะสมแม้ว่า!

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>


คำถามนั้นเก่ามาก ... นี่น่าจะเป็นวันนี้ หากฉันมีโอกาสลองใช้และใช้ได้กับเบราว์เซอร์ทั้งหมดที่ฉันต้องการฉันจะอัปเดตคำตอบที่ยอมรับได้ แม้ว่าอาจจะเป็นเวลานานก่อนที่ฉันจะลอง ฉันอยู่ในทีมผู้ดูแลระบบ sys ในขณะนี้ไม่ต้องทำสิ่งต่าง ๆ บนเว็บมากขึ้น
Joel Coehoorn

คุณสามารถให้ตัวอย่างโดยใช้label? ฉันจะสนใจเป็นพิเศษว่า HTML จากคำถามเดิมสามารถจัดวางโดยใช้border-box...
lacco

4
ทำไมflex: 2ไม่flex: 1?
Iulius Curt

42

กรุณาใช้ flexbox สำหรับสิ่งนี้ คุณมีตู้คอนเทนเนอร์ที่จะงอเด็กในแถว เด็กคนแรกใช้พื้นที่ของมันเท่าที่จำเป็น อันที่สองโค้งงอเพื่อใช้พื้นที่ที่เหลือทั้งหมด:

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


สวัสดีห้า! :) สิ่งหนึ่งที่ควรค่าแก่การเพิ่ม (ในบริบทของพวกเราหลายคนยังคงสวมกอด flexbox model ใหม่): INPUT จะอยู่ในรูปแบบซึ่งในที่สุดอาจจะจบลงใน flex container โดยรวม (เช่นกับสิ่งอื่น ๆ ที่ไม่ใช่แบบฟอร์ม) ) และจากนั้นจะไม่สามารถใช้งานได้อีกต่อไป - เนื่องจากพฤติกรรมการทำงานแบบยืดหยุ่นจะใช้เฉพาะกับผู้สืบทอดโดยตรง (เช่นองค์ประกอบลูก) ดังนั้น FORM ต้องเป็น flex contrainer เช่นกัน!
ของแท้

ทิศทางการโค้งงออยู่แล้วrowตามค่าเริ่มต้นคุณไม่จำเป็นต้องระบุ
Fabian Picone

ดิ้นเพื่อชนะ (อีกครั้ง); คำตอบที่เกี่ยวข้องมากในปี 2019
secretwep

17

วิธีที่ง่ายที่สุดในการบรรลุเป้าหมายนี้คือ:

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>

ดูเหมือนว่า: http://jsfiddle.net/JwfRX/


มันใช้งานได้ดีสำหรับฉัน น้ำล้นจะป้องกันไม่ให้สิ่งห่อหุ้มส่วนขวา - ขวาจะป้องกันไม่ให้ถูกสับ
Prof Von Lemongargle

PS: ด้วยเบราว์เซอร์ที่ทันสมัยฉันขอแนะนำให้ใช้ flex-box ตามที่อธิบายไว้ข้างต้นโดย leishman ...
llange

4

เคล็ดลับง่าย ๆ คือใช้CSS calcสูตร เบราว์เซอร์สมัยใหม่ทั้งหมด IE9 เบราว์เซอร์มือถือที่หลากหลายควรรองรับสิ่งนี้

<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
สิ่งนี้จะถือว่าคุณทราบความกว้างที่แน่นอนของฉลากหรือยินดีที่จะเพิ่มพื้นที่ว่างเพิ่มเติม
Nelson Rothermel

2

คุณสามารถลองสิ่งนี้:

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>


วิธีที่ดีที่สุดในวันนี้
yota

0

หากคุณใช้ 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>

ดีกว่าใช้สิ่งที่มีอยู่ใน 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/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.