Kiểu phần tử đầu vào để điền vào chiều rộng còn lại của vùng chứa


196

Hãy nói rằng tôi có một đoạn mã html như thế này:

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

Đây không phải là mã chính xác của tôi, nhưng điều quan trọng là có nhãn và kiểu nhập văn bản trên cùng một dòng trong một thùng chứa có chiều rộng cố định. Làm thế nào tôi có thể định kiểu đầu vào để lấp đầy chiều rộng còn lại của container mà không cần bọc và không biết kích thước của nhãn?


Tôi biết câu hỏi đã có từ lâu nhưng tôi sẽ thêm giải pháp tốt mà tất nhiên là không lỗi thời.
danijar

Câu trả lời:


137

nhiều như mọi người ghét bảng để bố trí, họ giúp đỡ với những thứ như thế này, bằng cách sử dụng thẻ bảng rõ ràng hoặc sử dụng display: cell-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>

Điều này sẽ làm việc với IE6? Nếu không, tôi có thể phải thực sự xác định một bảng nhỏ cho việc này :(
Joel Coehoorn

không chắc chắn, tôi sẽ nói hãy làm một bài kiểm tra nhanh để xem họ làm gì, nhưng tôi không có quyền truy cập dễ dàng vào IE
cobbal

Không sao đâu: điều này chỉ cho tôi một cái gì đó hoạt động.
Joel Coehoorn

42
Muốn chia sẻ Joel?
Giăng

10
Đồng ý, bạn nên chia sẻ giải pháp thực tế của mình với phần còn lại của chúng tôi và đánh dấu đó là câu trả lời thay vào đó - như vậy, đây là loại gây phiền nhiễu.
BrainSlugs83

155

Đây là một giải pháp đơn giản và gọn gàng mà không cần sử dụng JavaScript hoặc hack bố cục bảng. Nó tương tự như câu trả lời này: Nhập văn bản chiều rộng tự động điền 100% với các phần tử khác trôi nổi

Điều quan trọng là phải bọc trường đầu vào bằng một nhịp display:block. Điều tiếp theo là nút phải đến trước và trường đầu vào thứ hai.

Sau đó, bạn có thể thả nút sang phải và trường đầu vào sẽ lấp đầy khoảng trống còn lại.

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>

Một câu đố đơn giản: http://jsfiddle.net/v7YTT/90/

Cập nhật 1: Nếu trang web của bạn chỉ nhắm mục tiêu đến các trình duyệt hiện đại, tôi khuyên bạn nên sử dụng các hộp linh hoạt . Ở đây bạn có thể thấy sự hỗ trợ hiện tại .

Cập nhật 2: Điều này thậm chí hoạt động với nhiều nút hoặc các yếu tố khác chia sẻ đầy đủ với trường đầu vào. Đây là một ví dụ .


Điều này thay đổi html, mặc dù: mục bạn muốn ở cuối được liệt kê đầu tiên trong html.
Joel Coehoorn

@JoelCoehoorn, đúng vậy. Đó là quyết định của bạn cho dù bạn thích sử dụng bảng hơn hay không.
danijar

2
Điều này làm việc tuyệt vời. Sử dụng float: left thay vì right để tạo tagger theo phong cách facebook hoặc một cái gì đó tương tự.
hobberwickey 24/214

1
Điều này làm việc tuyệt vời! Nhưng ai đó có thể giải thích logic đằng sau cách thức này hoạt động không?!
sherlock

1
Đây là một câu trả lời xấu. Có vẻ như nó hoạt động nếu bạn chỉ liếc nhìn nó, nhưng hãy đi thử. Nó thực sự đang cắt một nửa hộp đầu vào, nhưng bạn không thể biết trừ khi bạn bắt đầu thử nghiệm nó. Mục tiêu là để khớp hộp đầu vào với chiều rộng của khu vực hiển thị, không cắt bớt nó. Nếu bạn cố gắng thực hiện bất kỳ kiểu dáng nào (các góc tròn, đường viền, phần bên phải của văn bản) thì điều này hoàn toàn thất bại.
Roger Hill

55

Tôi đề nghị sử dụng Flexbox:

Hãy chắc chắn để thêm tiền tố nhà cung cấp thích hợp mặc dù!

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>


Câu hỏi rất cũ ... đây có lẽ là cách tôi làm hôm nay. Nếu tôi có cơ hội dùng thử và nó hoạt động với tất cả các trình duyệt tôi cần, tôi sẽ cập nhật câu trả lời được chấp nhận. Có lẽ, mặc dù, sẽ còn rất lâu nữa tôi mới có thể thử nó. Bây giờ tôi đang ở trong nhóm quản trị hệ thống, đừng làm quá nhiều thứ trên web nữa.
Joel Coehoorn

Bạn có thể cung cấp một ví dụ bằng cách sử dụng một label? Tôi sẽ đặc biệt quan tâm đến cách HTML từ câu hỏi ban đầu có thể được bố trí bằng cách sử dụng border-box...
lacco

4
Tại sao flex: 2và không flex: 1?
Iulius Curt

42

Vui lòng sử dụng flexbox cho việc này. Bạn có một container sẽ uốn con của nó thành một hàng. Đứa trẻ đầu tiên lấy không gian của nó khi cần thiết. Cái thứ hai uốn cong để lấy tất cả không gian còn lại:

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


Đập tay! :) Một điều đáng để thêm vào (trong bối cảnh nhiều người trong chúng ta vẫn mới chấp nhận mô hình flexbox): INPUT sẽ ở dạng FORM, do đó có thể kết thúc trong thùng chứa flex tổng thể (ví dụ như với các công cụ không phải dạng khác ), và sau đó nó sẽ không còn hoạt động nữa - vì hành vi flex chỉ áp dụng cho con cháu trực tiếp (tức là các phần tử con). Vì vậy, FORM cũng phải là một contrainer flex!
Sz.

flex-direction đã được rowmặc định, bạn không phải chỉ định nó.
Fabian Picon

flex cho chiến thắng (một lần nữa); câu trả lời rất phù hợp vào năm 2019
secretwep

17

Cách dễ nhất để đạt được điều này sẽ là:

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>

Hình như: http://jsfiddle.net/JwfRX/


Công việc này tốt cho tôi. Phần tràn giữ cho mọi thứ không bị quấn, phần đệm bên phải giữ cho phần bên phải không bị băm nhỏ.
Giáo sư Von Lemongargle

Tái bút: Với trình duyệt hiện đại, tôi khuyên bạn nên sử dụng hộp flex như được mô tả ở trên bởi leishman Nhận
llange

4

Thủ thuật rất dễ dàng là sử dụng một CSS calccông thức. Tất cả các trình duyệt hiện đại, IE9, nhiều trình duyệt di động nên hỗ trợ điều này.

<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
Điều này giả định rằng bạn biết chiều rộng chính xác của nhãn hoặc sẵn sàng để có thêm không gian.
Nelson Rothermel

2

bạn có thể thử điều này:

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>


phương pháp tốt nhất hiện nay
yota

0

Nếu bạn đang sử dụng 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>

Tốt hơn nữa, hãy sử dụng những gì được tích hợp trong 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/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.