2009-10-27 40 views
25

Tôi có phần tử html nằm trong div. Chiều cao được dictated bởi div bên ngoài và chiều cao và chiều rộng của điều khiển đầu vào là 100%. Ở cấp độ cơ bản nhất, tôi gặp sự cố khi hộp văn bản mở rộng qua bên phải của div chứa.Phần tử đầu vào HTML rộng hơn Chứa Div

dụ cơ bản mã:

<div style="height:25px; width: 150px;"> 
    <input type="text" style="height:100%; width:100%" /> 
</div> 

Hình dựng tầm kiểm soát này là phức tạp hơn này, nhưng vẫn còn khi điều khiển được rút gọn đến mức này, tôi có một vấn đề mà các hộp nhô ra quá khứ chứa div.

+0

Và vấn đề hoặc câu hỏi là gì? –

+0

Trình duyệt/phiên bản nào? –

+0

Ok, vậy câu hỏi được đặt ra tại sao phần tử hộp văn bản của tôi mở rộng ra ngoài div div của cha mẹ? Tôi thấy rằng nó có vẻ liên quan đến DOCTYPE của tôi. Chúng tôi bắt buộc phải sử dụng Với mã từ bài viết của tôi, nếu tôi cắm nó vào một trang html mà không cho nó một DOCTYPE, nó hoạt động tốt. Vì vậy, để tái tạo vấn đề của tôi, bạn phải sử dụng DOCTYPE 4.01 nghiêm ngặt và sau đó kiểm tra kích thước của DIV và TextBox bằng công cụ nhà phát triển hoặc đặt đường viền trên DIV. – BrandonS

Trả lời

0

Thay vì áp dụng phong cách trực tiếp trên các yếu tố đầu vào, có thể tóm tắt CSS vào một tập tin và sử dụng các lớp:

div.field_container 
{ 
    height: 25px; 
    width: 150px; 
} 

div.field_container input 
{ 
    height: 100%; 
    width: 100%; 
} 

<div class="field_container"> 
    <input type="text" name="" value="" /> 
</div> 

Tôi đang chạy ra khỏi cửa trước khi tôi có thể kiểm tra nếu điều này giúp chút nào, nhưng ít nhất, bạn có thể chơi với các thiết lập max-height/width trên DIV css để làm cho nó không bị hỏng nếu giải pháp của tôi không hoạt động. Và việc CSS được trừu tượng hóa như thế này sẽ giúp bạn giải quyết vấn đề dễ dàng hơn bằng cách sử dụng một plugin như Firebug trong Firefox.

Câu hỏi là có cần phải kèm theo thẻ đầu vào trong DIV riêng của nó không? Tôi sẽ không ngạc nhiên nếu chỉ có bố cục tốt hơn bạn có thể xây dựng để tránh nhu cầu thực hiện việc này ...

+0

Tôi nghĩ rằng html đã được đơn giản hóa để thể hiện, tôi không * nghĩ * nhưng tôi có thể sai - đây là trường hợp sử dụng thực tế của anh ấy. –

+0

Tôi vừa thử apporach này và nó dường như hoạt động trong IE 8 và FF 3.5 –

+0

Ah ok, tôi luôn nhận yêu cầu như thế này, bộ não máy cyborg ngu ngốc của tôi không có công tắc giải thích mờ: P –

0

Tôi giả định rằng bạn muốn phần tử có chứa (<input>) nhỏ hơn hoặc chứa hoàn toàn bên trong, <div>?

Bạn có thể:

input {width: 50%; /* or whatever */ } 

rộng Một html phần tử được tính toán (tôi nghĩ) là chiều rộng định nghĩa + giáp + biên độ + đệm

Nếu bạn đã xác định đầu vào là có 100% chiều rộng của phụ huynh, và sau đó các thuộc tính khác được thêm vào nó chắc chắn sẽ tràn div cha mẹ.

Bạn có thể đặt lề/đệm/đường viền thành 0, nhưng điều đó có thể sẽ không ổn. Vì vậy, nó là dễ dàng hơn, mặc dù không nhất thiết phải hoàn hảo, chỉ để sử dụng một chiều rộng phù hợp nhỏ hơn.

Bạn có thể, tất nhiên, sử dụng

#parent_div {overflow: hidden; /* or 'auto' or whatever */} 

để ẩn một phần của yếu tố đầu vào mà thông thường sẽ tràn div container.

+0

Điều này thật thú vị. Tôi sẽ phải chơi xung quanh với ý tưởng này nhiều hơn. Chúng tôi tạo các điều khiển web khác theo cách này và tôi không có vấn đề này với phần tử "select" (có thể nó không có và được xây dựng trong phần đệm hoặc lề ngoài đường viền của nó nên không phải là vấn đề lớn nhất. – BrandonS

4

không may điều này sẽ phụ thuộc vào trình duyệt bạn đang làm việc nhưng thiết lập chiều rộng của đối tượng (hộp văn bản) không tính đến chiều rộng của đường viền trên đối tượng. hầu hết các trình duyệt chỉ xem xét bất kỳ đệm từ đối tượng bên ngoài và lề từ đối tượng chứa nhưng một vài (tôi đang nhìn bạn IE) không thêm vào biên giới khi tính toán tỷ lệ phần trăm;

đặt cược tốt nhất của bạn là thay đổi biên giới trên hộp hoặc để ném trong một div giữa teh textbox và container với một đệm của tiếng nói 2px với một margin-top: -2pxmargin-left:-2px (tôi đoán ở chiều rộng biên giới)

+0

+ 1: Nửa chừng câu trả lời của tôi, bạn cũng đánh bại tôi (và thực sự cần đại diện) – KyleFarris

+1

Bạn có thể sử dụng hộp định cỡ: hộp biên giới để xử lý điều này, có nghĩa là đường viền trên hộp nhập thực sự nằm trong chiều rộng của đầu vào thay vì được thêm vào bên ngoài Paul Irish làm một công việc tốt hơn để giải thích nó hơn tôi: http://paulirish.com/2012/box-sizing-border-box-ftw/ – heedfull

1

Tôi biết bài đăng này khá cũ, nhưng đó là vấn đề phổ biến và không ai đăng bất kỳ câu trả lời hay nào ...

Mã HTML sau có vẻ ổn. Nhưng khi tôi thêm các loại tài liệu, vấn đề xuất hiện

div.field_container 
{ 
    height: 25px; 
    width: 150px; 
    border: 1px solid red; 
} 
div.field_container input 
{ 
    height: 100%; 
    width: 100%; 
} 
<div class="field_container"> 
    <input type="text" name="" value="" /> 
</div> 

Để khắc phục vấn đề chiều rộng/chiều cao, bạn có thể thêm padding để field_container của bạn, nhưng điều đó sẽ làm cho các thùng chứa lớn hơn.

div.field_container 
{ 
    height: 25px; 
    width: 150px; 
    padding-bottom: 6px; 
    padding-right: 4px; 
    border: 1px solid red; 
} 
div.field_container input 
{ 
    height: 100%; 
    width: 100%; 
} 
<div class="field_container"> 
    <input type="text" name="" value="" /> 
</div> 

Nếu bạn không thể thay đổi chiều rộng container, bạn cũng có thể sử dụng các thủ thuật sau đây, nhưng điều đó vẫn sẽ làm tăng chiều cao

div.field_container 
{ 
    height: 25px; 
    width: 150px; 
    padding-bottom: 6px; 
    border: 1px solid red; 
} 
div.field_container input 
{ 
    height: 100%; 
    width: 100%; 
} 
<div class="field_container"> 
    <div style="height: 100%; margin-right:4px"><input type="text" name="" value="" /></div> 
</div> 
40

Bạn có thể sử dụng hộp-sizing: border-hộp chăm sóc điều này. Chỉ cần đặt những điều sau vào tệp css của bạn:

input{box-sizing:border-box} 

Điều này có nghĩa là đường viền trên hộp nhập thực sự nằm trong chiều rộng của đầu vào chứ không phải được thêm vào bên ngoài. Đây là những gì đang làm cho đầu vào lớn hơn container.

Paul Irish có bài thực sự tốt giải thích kỹ thuật này http://paulirish.com/2012/box-sizing-border-box-ftw

Những điểm ông làm khoảng đệm cũng được áp dụng cho biên giới.

Thậm chí còn có mixin la bàn để giúp việc hỗ trợ các trình duyệt cũ trở nên dễ dàng hơn. (http://compass-style.org/reference/compass/css3/box_sizing/)

+3

bài đăng tốt @heedfull, nhưng tôi Theo bài viết đầu tiên bạn đã liên kết, nó sẽ được nhập vào {box-sizing: border-box}, không phải là border-border. – Bill

+0

vị trí tốt @Bill. Đã chỉnh sửa lỗi đánh máy. – heedfull

7

Điều này làm công việc cho tôi:

input { 
    padding: 0.2em; 
    box-sizing: border-box; 
    width: 100% 
} 
Các vấn đề liên quan