Đệm trong phạm vi đầu vào phá vỡ chiều rộng 100%


130

Ok, vì vậy chúng tôi biết rằng việc thiết lập phần đệm cho một đối tượng sẽ khiến chiều rộng của nó thay đổi ngay cả khi nó được đặt rõ ràng. Trong khi người ta có thể tranh luận logic đằng sau điều này, nó gây ra một số vấn đề với một số yếu tố.

Trong hầu hết các trường hợp, bạn chỉ cần thêm một phần tử con và thêm phần đệm vào phần tử đó thay vì phần tử được đặt thành 100%, nhưng đối với đầu vào biểu mẫu, đó không phải là một bước có thể.

Hãy xem cái này: http://sandman.net/test/formcss.html

Đầu vào thứ hai có phần đệm được đặt thành 5px mà tôi rất thích cài đặt mặc định. Nhưng thật không may, điều đó làm cho đầu vào tăng 10px theo mọi hướng, bao gồm thêm 10px vào chiều rộng 100%.

Vấn đề ở đây là tôi không thể thêm một phần tử con bên trong đầu vào để tôi không thể sửa nó. Vì vậy, câu hỏi là:

Có cách nào để thêm phần đệm bên trong đầu vào mà vẫn giữ nguyên chiều rộng 100% không? Nó cần phải là 100% vì các biểu mẫu sẽ hiển thị theo các chiều rộng khác nhau của cha mẹ vì vậy tôi không biết trước chiều rộng của bố mẹ.


3
Xem stackoverflow.com/questions/628500/ trên để biết cách sử dụng box-sizingthuộc tính CSS3
Daniel LeCheminant

15
Chỉ cần nói, cảm ơn vì đã giữ trang ví dụ của bạn trong suốt thời gian này. Làm tôi khó chịu khi ai đó đăng một url trong câu hỏi và nó không hoạt động sau khi câu trả lời được trả lời hoặc họ không sử dụng cái gì đó như jsfiddle.
Jonathan Dumaine

Về việc sử dụng thuộc tính kích thước hộp; vấn đề của tôi là cùng một vấn đề nhưng với chiều cao - thiết lập chiều cao thành 100% một mình có nghĩa là chiều cao + đường viền + đệm = chiều cao của container. Để có được đầu vào để có chiều cao thực tế của container, tôi chỉ cần sử dụng box-sizing: content-box.
Skychan

Ngoại trừ những gì tôi vừa nói không hoạt động trong IE. IE11 với kích thước hộp: hộp nội dung hoàn toàn không điều chỉnh chiều cao với chiều cao: 100%. Nó tôn trọng nó với chiều cao px cụ thể. Vì vậy, height: 31px w / o box-sizing nhỏ hơn 6px so với height: 31px + box-sizing: content-box. Nhưng ý tưởng là sử dụng chiều cao: 100% vì vậy tôi không lo lắng về kích thước pixel cụ thể!
Skychan

Câu trả lời:


288

Sử dụng CSS3, bạn có thể sử dụng kích thước hộp thuộc tính để thay đổi cách trình duyệt tính toán độ rộng của đầu vào .

  input.input {
    width: 100%;
    -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
    -moz-box-sizing: border-box;    /* Firefox, other Gecko */
    box-sizing: border-box;         /* Opera/IE 8+ */
  }

Bạn có thể đọc thêm về nó ở đây: http://css-tricks.com/box-sizing/


@ Víctor Dieppa Garriga Cảm ơn bạn, Đó là một giải pháp tuyệt vời.
sinanakyazici

1
Hỗ trợ như sau: Chrome (bất kỳ): kích thước hộp Opera 8.5+: kích thước hộp Firefox (bất kỳ): -moz-box-sizing Safari 3: -webkit-box-sizing (không được chỉnh sửa trong phiên bản 5.1+) IE8 +: hộp kích thước. Ngoài ra tôi đề nghị điều này cho câu trả lời được chấp nhận, đó là một giải pháp thanh lịch hơn.
Baconbeastnz

1
Để 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". Hy vọng điều này sẽ giúp
Sanjeev

Thành thật mà nói, box-sizing: border-box;là điều đầu tiên tôi nghĩ đến, nhưng nó hoàn toàn không làm việc cho tôi. Có lẽ ông cố display: flex;đang gây rối với điều này?
Cody

Có vẻ như nó được hỗ trợ trên tất cả các trình duyệt chính mà không có tiền tố và đã được sử dụng cho một số phiên bản: caniuse.com/#feat=css3-boxsizing
Jason

7

Tôi không biết nó tương thích trình duyệt chéo như thế nào (nó hoạt động trong firefox và safari), nhưng bạn có thể thử giải pháp này:

DIV.formvalue {
padding: 15px;
}
input.input {
margin: -5px;
}

(Chỉ đăng các giá trị mà tôi đã thay đổi)


1
Nó gây ra vấn đề trong IE.
Tarik

Chà, điều đó không làm tôi ngạc nhiên lắm :) Đừng nghĩ rằng có một giải pháp trình duyệt chéo dễ dàng mà không thay đổi đánh dấu.
michaelk

Ok, tôi đang bỏ phiếu giải pháp này ngay bây giờ kể từ khi thêm lề: -5px rõ ràng không phải là vi phạm. Tôi đã thêm một đầu vào thứ tư vào trang sử dụng cái này và nó dường như thực sự hoạt động. j Jigsaw.w3.org/css-validator/ từ
Sandman

7

Một lựa chọn là bọc INPUTtrong một DIVcái có đệm.

CSS:

div.formvalue {
    background-color: #eee;
    border: 1px solid red;
    padding: 10px;
    margin: 0px;
}

div.paddedInput {
    padding: 5px;
    border: 1px solid black;
    background-color: white;
}

div.paddedInput input {
    border: 0px;
    width: 100%;
}

HTML:

<div class="formvalue">
    <div class="paddedInput"><input type="text" value="Padded!" /></div>
</div>

8
Việc đệm một div container tạo ra kết quả không giống nhau để thêm phần đệm vào trường đầu vào.
Felix Fung

Thêm vào những gì Felix Fung đã nói - Bạn mất khả năng nhấp bằng chuột trong khu vực đệm và để nó tập trung vào trường đầu vào - trong số các vấn đề đáng chú ý khác. Chỉ muốn chỉ ra vấn đề ít được chú ý / biết đến này - Nó làm tôi khó chịu khi không sử dụng các trang web sử dụng bản hack này.
eselk

5

Việc quên lãng calccó thể đến giải cứu ở đây:

input {
  width: calc(100% - 1em);
  padding: 0.5em;
}

Vì chúng ta biết phần đệm sẽ thêm vào chiều rộng của phần tử, chúng ta chỉ cần trừ phần đệm ra khỏi chiều rộng tổng thể. Nó được hỗ trợ bởi tất cả các trình duyệt chính, đáp ứng nhanh và không yêu cầu div trình bao bọc lộn xộn.


4

Tôi đã có một số vấn đề với một cái gì đó tương tự như thế này. Tôi có tds với đầu vào 100% và một phần đệm nhỏ. Những gì tôi đã làm là bù đắp cho phần đệm trên td như sau:

.form td {
    padding-right:8px;
}

.form input, .form textarea {
    border: 1px solid black;
    padding:3px;
    width:100%;
}

phần đệm 8px để bao gồm viền và phần đệm của đầu vào / textarea. Hi vọng điêu nay co ich!


Kỹ thuật NÀY hoạt động tuyệt vời để sắp xếp chiều rộng của các ô có chứa các đầu vào được đệm với các ô không .. Chỉ cần áp dụng chọn lọc đệm bên phải cho bất kỳ TD nào có đầu vào chiều rộng 100%.
Seb Barre

1

Có lẽ lấy đường viền + nền ra khỏi input, và thay vào đó đặt nó trong một divđường viền + nền và chiều rộng: 100%, và đặt lề trên input?


Đó là loại hack tôi hiện đang sử dụng cho vấn đề này, nhưng tôi muốn sử dụng đường viền trên đầu vào vì "lý do kiểu" hoặc không có gì. Nhưng vâng, đây là cách tôi đang làm vì vậy đây là một giải pháp khả thi
Sandman

1

Một giải pháp tôi đã tìm thấy công việc là định vị hoàn toàn đầu vào với thẻ cha tương đối được định vị.

<p class="full-width-input">
    <input type="text" class="text />
</p>

Áp dụng phong cách:

p.full-width-input {
    position: relative;
    height: 35px;
}

p.full-width-input input.text {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    padding: 5px;
}

Điều duy nhất cần lưu ý là thẻ đoạn cần cài đặt chiều cao vì trẻ em được định vị tuyệt đối của nó sẽ không mở rộng chiều cao của nó. Điều này tránh sự cần thiết phải đặt width: 100%bằng cách khóa nó ở bên trái và bên phải của phần tử cha.


0

Hãy thử sử dụng tỷ lệ phần trăm cho phần đệm của bạn:

.input { 

  // remove border completely
  border: none;

  // don't forget to use the browser prefixes
  box-shadow: 0 0 0 1px silver;

  // Use PERCENTAGES for at least the horizontal padding
  padding: 5%; 

  // 100% - (2 * 5%)
  width: 90%; 

}

Nếu bạn lo lắng về người dùng trên các trình duyệt cũ không thể nhìn thấy bóng hộp, chỉ cần cung cấp cho đầu vào một màu nền tinh tế làm bản sao lưu. Nếu bạn đang sử dụng pixel cho loại điều này, thì khả năng là bạn đang sử dụng chúng ở nơi khác, điều này có thể đưa ra một vài thách thức bổ sung, hãy cho tôi biết nếu bạn gặp phải chúng.


-3

Điều duy nhất tôi biết để ngăn chặn điều này là gán các giá trị như thế 100% -10. Nhưng nó có một số vấn đề tương thích tho.

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.