Tôi có thể ngăn các hộp văn bản có chiều rộng 100% vượt ra khỏi thùng chứa của chúng không?


181

Hãy nói rằng tôi có một hộp văn bản mà tôi muốn điền vào một dòng. Tôi sẽ cho nó một phong cách như thế này:

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

Điều này gây ra vấn đề vì chiều rộng dựa trên nội dung của hộp văn bản. Các hộp văn bản có lề, viền và đệm theo mặc định, làm cho hộp văn bản có chiều rộng 100% lớn hơn thùng chứa của nó.

Ví dụ, ở đây bên phải:

nhập mô tả hình ảnh ở đây

Có cách nào để làm cho một hộp văn bản lấp đầy chiều rộng của thùng chứa của nó mà không mở rộng ra ngoài nó không?

Dưới đây là một số ví dụ HTML để hiển thị ý tôi là:

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

Nếu điều này được chạy, bạn có thể thấy bằng cách nhìn vào hộp văn bản "bình thường" mà hộp văn bản "rộng" đang nhô ra ngoài thùng chứa. Hộp văn bản "bình thường" nổi lên cạnh thực tế của container. Tôi đang cố gắng làm cho hộp văn bản "rộng" lấp đầy thùng chứa của nó, mà không mở rộng ra ngoài cạnh như hộp văn bản "bình thường".

Câu trả lời:


87

Những gì bạn có thể làm là xóa "phần bổ sung" mặc định trên input:

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

Điều này sẽ giữ inputbên trong container của nó. Bây giờ nếu bạn muốn biên giới, quấn inputtrong một div, với biên giới thiết lập trên div(cách mà bạn có thể loại bỏ các display:blocktừ inputquá). Cái gì đó như:

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

Chỉnh sửa: Một tùy chọn khác là, thay vì xóa kiểu khỏi input, bù cho kiểu đó trong gói div:

input.wide {width:100%;}

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

Điều này sẽ cung cấp cho bạn một số kết quả khác nhau trong các trình duyệt khác nhau, nhưng chúng sẽ không chồng lấp lên vùng chứa. Các giá trị trong div phụ thuộc vào mức độ lớn của đường viền trên inputvà khoảng cách bạn muốn giữa inputđường viền và đường viền.


3
Đây là một giải pháp rất sáng tạo. Vấn đề duy nhất tôi gặp phải là tôi không thể xác định một phác thảo trên hộp văn bản khi nó được lấy nét trừ khi tôi sử dụng JavaScript để thay đổi đường viền của div trình bao bọc.
Dan Herbert

@DanHerbert, bạn nói đúng, đó là một lỗ hổng UX chính của phương pháp này
Baumr

275

Có cách nào để làm cho một hộp văn bản lấp đầy chiều rộng của thùng chứa của nó mà không mở rộng ra ngoài nó không?

Có: bằng cách sử dụng thuộc tính CSS3 'box-size: Border-box', bạn có thể xác định lại 'width' nghĩa là gì để bao gồm phần đệm và viền bên ngoài.

Thật không may vì đó là CSS3, hỗ trợ chưa hoàn thiện và vì quá trình đặc tả chưa kết thúc, nên trong thời gian này, nó có các tên tạm thời khác nhau. Vì thế:

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

Phương án thay thế trường học cũ chỉ đơn giản là đặt một số lượng 'phần đệm bên phải' trên phần tử <div> hoặc <td> kèm theo tương đương với khoảng bao nhiêu phần đệm / phần bên trái và bên phải trong 'px' mà bạn nghĩ các trình duyệt sẽ đưa ra đầu vào. (Thường là 6px cho IE <8.)


Điều này sẽ hoạt động rất tốt, ngoại trừ không thể sử dụng điều này vì tôi đang nhắm mục tiêu các thiết bị di động có thể sẽ không hỗ trợ điều này trong nhiều năm. : - \
Dan Herbert

20
Tôi nghĩ các thiết bị di động sẽ có hỗ trợ HTML5 đầy đủ trước máy tính.
Mariano Cavallo

4
@Kindred: chắc chắn không nếu bạn bao gồm IEMobile và Blackberry trong đó.
bobince

1
Điều này có hỗ trợ tuyệt vời cho các trình duyệt máy tính để bàn, tuy nhiên: quirksmode.org/css/contents.html
logan

2
Làm thế nào mà tôi mất nhiều thời gian để tìm thấy buttersauce tuyệt vời này ??? Chúng tôi có thể làm cho câu trả lời được chấp nhận?
streetlogics

14

Điều này giải quyết các vấn đề đối với tôi!

Nếu không cần một div bên ngoài. Chỉ cần áp dụng nó vào hộp văn bản nhất định của bạn.

box-sizing: border-box; 

Với thuộc tính này "Các thuộc tính chiều rộng và chiều cao (và thuộc tính tối thiểu / tối đa) bao gồm nội dung, phần đệm và đường viền, nhưng không phải là lề"

Xem mô tả tài sản tại w3schools .

Hy vọng điều này sẽ giúp được ai đó!


Tuyệt vời đơn giản! Cám ơn!
nuôi dưỡng

10

Bản thân tôi đã gặp phải vấn đề này và giải pháp duy nhất tôi có thể tìm thấy đã hoạt động trong tất cả các trình duyệt thử nghiệm của mình (IE6, IE7, Firefox) là:

  1. Bọc trường đầu vào trong hai DIV riêng biệt
  2. Đặt DIV bên ngoài thành chiều rộng 100%, điều này ngăn container của chúng tôi tràn tài liệu
  3. Đặt phần đệm vào DIV bên trong của số tiền chính xác để bù cho phần tràn ngang của đầu vào.
  4. Đặt phần đệm tùy chỉnh trên đầu vào để nó tràn ra cùng số lượng như tôi cho phép trong DIV bên trong

Mật mã:

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

Ở đây, tổng tràn ngang cho phần tử đầu vào là 6px - 2x (phần đệm + viền) - vì vậy chúng tôi đặt phần đệm bên phải cho DIV bên trong là 6px.


thêm vào phần tử đầu vào một phần đệm 8px và nó không hoạt động nữa
JuHwon

7

Hỗ trợ kích thước hộp thực sự khá tốt: http://caniuse.com/#search=box-sizing

Vì vậy, trừ khi bạn nhắm mục tiêu IE7, bạn sẽ có thể giải quyết loại vấn đề này bằng cách sử dụng thuộc tính này. Một lớp như sass hoặc ít hơn giúp dễ dàng xử lý các quy tắc tiền tố như thế, btw.


3

Trên thực tế, đó là vì CSS xác định 100% liên quan đến toàn bộ chiều rộng của vùng chứa, bao gồm lề, đường viền và phần đệm của nó; điều đó có nghĩa là không gian tận dụng. với nội dung của nó là một số lượng nhỏ hơn 100%, trừ khi container không có lề, đường viền hoặc phần đệm.

Điều này là phản trực giác và được nhiều người coi là một sai lầm mà chúng ta hiện đang mắc kẹt . Điều đó có nghĩa là% kích thước không tốt cho bất kỳ thứ gì ngoài thùng chứa cấp cao nhất và thậm chí sau đó, chỉ khi nó không có lề, đường viền hoặc phần đệm.

Lưu ý rằng lề, viền và phần đệm của trường văn bản bao gồm trong kích thước CSS được chỉ định cho nó - đó là phần chứa có thể loại bỏ mọi thứ.

Tôi đã chấp nhận làm việc xung quanh nó bằng cách sử dụng 98%, nhưng đó là một giải pháp chưa hoàn hảo, vì các trường đầu vào có xu hướng giảm ngắn hơn khi container trở nên lớn hơn.


EDIT: Tôi đã bắt gặp câu hỏi tương tự này - Tôi chưa bao giờ thử câu trả lời được đưa ra và tôi không biết chắc chắn liệu nó có áp dụng cho vấn đề của bạn không, nhưng có vẻ như nó sẽ như vậy.


1

Một giải pháp có thể hoạt động (nó hiệu quả với tôi) là áp dụng lề âm ở đầu vào (hộp văn bản) ... hoặc chiều rộng cố định cho eg7 hoặc bỏ hỗ trợ eg7. Kết quả này cho pixel chiều rộng hoàn hảo .. Đối với tôi là 7 vì vậy tôi đã thêm 3 và 4 nhưng nó vẫn là pixel hoàn hảo ..

Tôi đã có cùng một vấn đề và tôi ghét phải có thêm div cho biên giới vv!

Vì vậy, đây là giải pháp của tôi mà dường như làm việc!

Bạn nên sử dụng biểu định kiểu chỉ có7 để tránh các dấu sao.

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

Nếu bạn không thể sử dụng, box-sizing:border-boxbạn có thể thử xóa width:100%và đặt một sizethuộc tính rất lớn vào thành <input>phần, tuy nhiên nhược điểm là bạn phải sửa đổi html và không thể làm điều đó chỉ với CSS:

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

0

Nếu bạn không cần phải thực hiện một cách linh hoạt (ví dụ: biểu mẫu của bạn có chiều rộng cố định), bạn chỉ có thể đặt chiều rộng của <input>các phần tử con thành chiều rộng của vùng chứa của chúng trừ đi mọi trang trí như đệm, lề, viền, v.v.:

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

Nếu bạn không thể sử dụng kích thước hộp (ví dụ: khi bạn chuyển đổi HTML sang PDF bằng iText). Thử cái này:

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

Những công việc này:

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

'Chiều rộng' đầu tiên là quy tắc dự phòng cho các trình duyệt cũ hơn.


0

Chỉ cần định kiểu đầu vào để bù cho phần đệm thêm. Trong ví dụ sau, phần đệm trên đầu vào sẽ là 10px ở bên trái và bên phải cho tổng phần bù của phần đệm là 20px:

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