Làm thế nào để tạo chiều rộng phần tử: 100% trừ phần đệm?


396

Tôi có một đầu vào html.

Đầu vào padding: 5px 10px;tôi muốn nó là 100% chiều rộng của div cha (là chất lỏng).

Tuy nhiên, việc sử dụng width: 100%;nguyên nhân đầu vào là 100% + 20pxlàm thế nào tôi có thể khắc phục điều này?

Thí dụ


1
Xem câu trả lời này tôi đã đăng cách đây 15 phút: stackoverflow.com/questions/5219030/ Khăn Điều này sẽ hoạt động hoàn hảo cho bạn, trừ khi bạn yêu cầu nó hoạt động trong IE7.
ba mươi

Nếu bạn đã sử dụng phương pháp của tôi, hãy xem bản chỉnh sửa nhỏ mà tôi vừa thực hiện trên câu trả lời của mình. Nó đảm bảo "thậm chí đệm" trong một số trình duyệt.
ba mươi

@Hailwood tôi có giải pháp giữ đệm cho inputvà hỗ trợ IE7
Vladimir Starkov

Vui lòng xem câu trả lời bên dưới bằng hàm calc
Daan

Câu trả lời:


485

box-sizing: border-box là một cách nhanh chóng và dễ dàng để khắc phục nó:

Điều này sẽ hoạt động trong tất cả các trình duyệt hiện đại và IE8 +.

Đây là bản demo: http://jsfiddle.net/thundreddot/QkmSk/301/

.content {
    width: 100%;
    box-sizing: border-box;
}

Các phiên bản tiền tố trình duyệt ( -webkit-box-sizing, v.v.) không cần thiết trong các trình duyệt hiện đại.


5
Tôi không nghĩ rằng đây là một giải pháp tồi. Nói chung, gói các phần tử trong một div phụ là một cách tốt để đệm các phần tử mà không đẩy chiều rộng tổng thể của phần tử vượt ra khỏi vùng chứa chính của nó.
Jake Wilson

1
Việc đệm một div gói cũng tạo ra kết quả không giống nhau để thêm phần đệm vào đầu vào trực tiếp.
Felix Fung

@thentydot tôi có một số giải pháp linh hoạt và thanh lịch hơn giúp duy trì độ rộng của đầu vào
Vladimir Starkov

8
@thentydot yeah, cứ để nó bị hỏng cho IE7 và để M $ sửa nó :)
Petr Peller

Điều này cũng duy trì tự động thay đổi kích thước văn bản cho bất kỳ ai trong số các bạn jQuery so với các kích cỡ hộp kích hoạt trừ khi bạn áp dụng điều đó cho div ẩn.
Michael J. Calkins

276

Đây là lý do tại sao chúng ta có box-sizingCSS.

Tôi đã chỉnh sửa ví dụ của bạn và bây giờ nó hoạt động trong Safari, Chrome, Firefox và Opera. Hãy xem thử: http://jsfiddle.net/mathias/Bupr3/ Tất cả những gì tôi đã thêm là đây:

input {
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
}

Thật không may, các trình duyệt cũ hơn như IE7 không hỗ trợ điều này. Nếu bạn đang tìm kiếm một giải pháp hoạt động trong các IE cũ, hãy xem các câu trả lời khác.


3
+1, nhưng caniuse.com/#search=box-sizing IE 8? Ngoài ra, github.com/Schepp/box-sizing-polyfill dường như cung cấp giải pháp cho IE 6-7.
Alix Axel

1
+1, điều này thật tuyệt nếu bạn không quan tâm đến IE (ví dụ như khi sử dụng PhoneGap)
Luke B.

3
Đây là loại phù thủy gì? +1 cho câu trả lời và +1 cho nhận xét phía trên tôi (đó chính xác là những gì tôi cần nó).
Eduard Luca

20
Đây phải là hành vi mặc định .. thay vì +20 đến chiều rộng. Đôi khi CSS có vẻ sai lầm nghiêm trọng.
Soth

2
Để làm rõ hỗ trợ kích thước hộp trên IE, đối với thuộc tính kích thước hộp IE phụ thuộc vào Chế độ tài liệu IE, nó hoạt động trên "Chế độ tiêu chuẩn IE8" & cao hơn. Vì vậy, nó cũng sẽ hoạt động trong phiên bản trình duyệt IE8 nếu chế độ tài liệu là "Chế độ tiêu chuẩn IE8". Hi vọng điêu nay co ich.
Sanjeev

40

Sử dụng phần đệm theo tỷ lệ phần trăm quá và loại bỏ từ chiều rộng:

đệm: 5%;
chiều rộng: 90%;

19
Fyi, giải pháp này chỉ lý tưởng cho bố cục không linh hoạt.
muffs

+1, Vấn đề với điều này sẽ là biên giới tôi đoán. Thông thường, chúng chỉ trông "đúng" với tối đa 1 đến 3 pixel. Các kết quả quá khó lường khi xem xét sự không nhất quán của trình duyệt liên quan đến làm tròn pixel phụ.
Alix Axel

27

Bạn có thể làm điều đó mà không cần sử dụng box-sizingkhông rõ ràng giải pháp như thế nào width~=99%.

Bản demo trên jsFiddle :
nhập mô tả hình ảnh ở đây

  • Giữ đầu vào paddingborder
  • Thêm vào đầu vào âm ngang margin= border-width+horizontal padding
  • Thêm vào chiều ngang của trình bao bọc paddingbằng với marginbước trước

Đánh dấu HTML:

<div class="input_wrap">
    <input type="text" />
</div>

CSS:

div {
    padding: 6px 10px; /* equal to negative input's margin for mimic normal `div` box-sizing */
}

input {
    width: 100%; /* force to expand to container's width */ 
    padding: 5px 10px;
    border: none;
    margin: 0 -10px; /* negative margin = border-width + horizontal padding */ 
}

4
Đó là một mẹo hay, sử dụng lề cho đầu vào và đệm cho trình bao bọc để bù cho phần đệm đầu vào.
maulik13

Đồng ý hoàn toàn !!! Tôi đã sử dụng giải pháp này và nó hoạt động rộng rãi mà không có thủ đoạn bẩn! Đây phải là giải pháp cho mọi loại câu trả lời này ..
Andre Figueiredo

Tôi hoàn toàn không hiểu vai trò của lề âm - tất cả những gì tôi biết là nếu giá trị sai, thì hộp kết thúc ở một bên, nhưng bằng cách nào đó, lề đối xứng sẽ khắc phục điều này
Casebash

21

Sử dụng css calc ()

Siêu đơn giản và tuyệt vời.

input {
    width: -moz-calc(100% - 15px);
    width: -webkit-calc(100% - 15px);
    width: calc(100% - 15px);
}​

Như đã thấy ở đây: Div width 100% trừ số lượng pixel cố định
Theo webvitaly ( https://stackoverflow.com/users/713523/webvitaly )
Nguồn gốc: http://web-profile.com.ua/css/dev/css -Băng thông-100prc-âm-100px /

Chỉ cần sao chép ở đây, bởi vì tôi gần như bỏ lỡ nó trong các chủ đề khác.


Bạn cần phải tự lập trình mà trong đó. Lý tưởng nhất là nó sẽ được tự động xác định.
JackHasaPal

11

Giả sử tôi đang ở trong một thùng chứa có đệm 15px, đây là thứ tôi luôn sử dụng cho phần bên trong:

width:auto;
right:15px;
left:15px;

Điều đó sẽ kéo dài phần bên trong thành bất kỳ chiều rộng nào, nó phải nhỏ hơn 15px ở hai bên.


Bạn có thể gửi một ví dụ đầy đủ về width:autoáp dụng cho một inputlĩnh vực?
jakubiszon

đó chỉ là một nửa câu trả lời. vị trí mặc định của các phần tử là tĩnh, vì vậy trái & phải sẽ không làm gì chính xác ở đây. và chiều rộng tự động cũng là giá trị ban đầu, vì vậy .. tất cả câu trả lời này không là gì cả :)
honk31

5

Bạn có thể thử một số thủ thuật định vị. Bạn có thể đặt đầu vào trong một div với position: relativevà chiều cao cố định, sau đó trên đầu vào cóposition: absolute; left: 0; right: 0; và bất kỳ phần đệm nào bạn muốn.

Ví dụ sống


Những trình duyệt nào bạn đã kiểm tra điều này trong? :(
ba mươi

Hmm, chỉ hoạt động trong Chrome. Nhưng tôi biết tôi cũng có một cái gì đó rất giống với công việc trong FF & IE.
Felix

Có vẻ như nó không hoạt động với <input>các phần tử trong Firefox (idk about IE). Nó hoạt động với <div>s, mặc dù. Và không, display: blocktrên cả hai <input>cũng không hoạt động: - /
Felix

5

Đây là khuyến nghị từ codeontrack.com , trong đó có các ví dụ về giải pháp tốt:

Thay vì đặt chiều rộng của div thành 100%, hãy đặt nó thành tự động và chắc chắn rằng phần đó <div>được đặt thành display: block (mặc định cho <div>).


3
Bạn không nên đăng liên kết trực tiếp. Bạn có thể bao gồm thông tin từ liên kết đó. Lý do là, có thể ngày mai liên kết sẽ không có sẵn và câu trả lời của bạn sẽ không còn hiệu lực nữa ..
Amnesh Goel

4

Di chuyển phần đệm của hộp đầu vào thành phần tử bao bọc.

<style>
div.outer{ background: red; padding: 10px; }
div.inner { border: 1px solid #888; padding: 5px 10px; background: white; }
input { width: 100%; border: none }
</style>

<div class="outer">
    <div class="inner">
       <input/>
    </div>
</div>

Xem ví dụ tại đây: http://jsfiddle.net/L7wYD/1/


2

Chỉ cần hiểu sự khác biệt giữa chiều rộng: tự động; và chiều rộng: 100%; Chiều rộng: tự động; sẽ (AUTO) MATICALLY tính toán chiều rộng để phù hợp với chính xác được đưa ra với div gói bao gồm cả phần đệm. Chiều rộng 100% mở rộng chiều rộng và thêm phần đệm.


Bạn có thể bao gồm một ví dụ nơi điều này hoạt động với <input> không? Nếu không, bạn chỉ đang gửi người trên một con ngỗng hoang dã đuổi theo.
Ông Lister

0

Những gì về gói nó trong một container. Container shoud có kiểu như:

{
    width:100%;
    border: 10px solid transparent;
}


-1

Đối với tôi, sử dụng margin:15px;padding:10px 0 15px 23px;width:100%, kết quả là thế này:

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

Giải pháp cho tôi là sử dụng width:autothay vìwidth:100% . Mã mới của tôi là:

margin:15px;padding:10px 0 15px 23px;width:auto. Sau đó, phần tử được căn chỉnh chính xác:

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


-1

Tôi gặp vấn đề tương tự. Sửa nó như vậy:

width: 100%;
box-sizing: border-box;

-9

Bạn có thể làm được việc này:

width: auto;
padding: 20px;

Đây không phải là cùng 100% - ký quỹ.
James
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.