2009-09-04 41 views
93

Ok, vì vậy chúng tôi biết rằng việc đặt đệm vào một đối tượng làm cho chiều rộng của nó thay đổi ngay cả khi đượ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ố. Đối với hầu hết các trường hợp, bạn chỉ cần thêm phần tử con và thêm phần đệm vào phần tử con thay vì phần tử con được đặt thành 100%, nhưng đối với đầu vào biểu mẫu, đó không phải là bước có thể.Đệm trong đầu vào phá vỡ chiều rộng 100%

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

Các đầu vào thứ hai đã đệm của nó thiết lập để 5px mà tôi rất thích các thiết lập mặc định. Nhưng tiếc là 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 phần tử con bên trong đầu vào để tôi không thể sửa lỗi đó. Vì vậy, câu hỏi là:

Có cách nào để thêm đệm bên trong đầu vào trong khi vẫn giữ 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ị trong các bố cục có chiều rộng khác nhau nên tôi không biết trước chiều rộng của bố mẹ.

+3

Xem http://stackoverflow.com/questions/628500/can-i-stop-100-width-text-boxes-from-extending-beyond-their-containers/628912#628912 để biết cách sử dụng CSS3 ' box-sizing' thuộc tính –

+11

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

+0

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

Trả lời

7

Tôi không biết làm thế nào qua trình duyệt tương thích đó là (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

+1

Tôi thà sử dụng mã tiêu chuẩn cho một điều "đơn giản" như vậy ... – Sandman

+0

Vâng, điều đó không làm tôi ngạc nhiên :) Đừ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

-1

Đ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ư vậy 100% -10. Nhưng nó có một số vấn đề tương thích tho.

1

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

+0

Đó là loại hack tôi 'hiện đang sử dụng cho vấn đề này, nhưng tôi thà sử dụng biên giới trên đầu vào cho "lý do phong cách" hoặc whatnot. Nhưng có, đây là cách tôi hiện đang làm như vậy nó là một giải pháp khả thi – Sandman

7

Một tùy chọn là quấn INPUT trong một số DIV có phần đệ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

Đệm một div container tạo ra kết quả không giống hệt nhau để thêm đệm vào một lĩnh vực đầu vào. –

+0

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 vùng đệm và để nó tập trung vào trường nhập - trong số các vấn đề đáng chú ý khác. Chỉ muốn chỉ ra điều này ít được nhận thấy/vấn đề được biết đến - Nó làm phiền tôi không có kết thúc khi sử dụng các trang web có sử dụng hack này. – eselk

4

Tôi đã gặp một số vấn đề với một cái gì đó tương tự như sau. Tôi có tds với đầu vào 100% và một padding 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%; 
} 

đệm 8px để bao gồm đường viền và đệm của đầu vào/văn bản. Hy vọng điều này sẽ hữu ích!

+0

Kỹ thuật này hoạt động tốt để xếp hàng chiều rộng của ô có chứa đầu vào đệm với các ô không .. Chỉ cần áp dụng padding-right selectively cho bất kỳ TD nào chứa đầu vào chiều rộng 100%. –

1

Một giải pháp mà tôi đã tìm được công trình 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> 

Các áp dụng các 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 phải nhận thức được là thẻ đoạn cần có một chiều cao thiết lập như những đứa trẻ hoàn toàn vị trí 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 thiết lập width: 100% bằng cách khóa nó vào bên trái và bên phải của phần tử gốc.

+1

đã kiểm tra .. nó không hoạt động ... bạn có thể đăng một bản demo không? – mrdaliri

211

Sử dụng CSS3 bạn có thể sử dụng thuộc tính kích thước hộp để thay đổi cách trình duyệt tính toán với đầ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/

+3

+1 và nếu ông chủ của tôi cuối cùng quyết định chúng tôi có thể thả hỗ trợ cho IE7, nó không phải được sử dụng nhiều ở tất cả .. anh ấy siêu trường học cũ. – eselk

+0

@ 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 sửa lỗi trong phiên bản 5.1+) IE8 +: kích thước hộp. 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

0

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

2

Các oft-quên calc có thể đến để giải cứu ở đây:

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

Vì chúng ta biết padding sẽ thêm vào chiều rộng của nguyên tố này, chúng tôi chỉ đơn giản là trừ đi đệm 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, và không yêu cầu divs wrapper lộn xộn.

Các vấn đề liên quan