2008-09-20 19 views
8

Tôi muốn bố trí sau đây để xuất hiện trên màn hình:Bạn sẽ đạt được bố cục dựa trên bảng này bằng cách sử dụng CSS thay vì các bảng HTML như thế nào?

FieldName 1    [Field input 1] 
FieldName 2 is longer [Field input 2] 
    .       . 
    .       . 
FieldName N    [Field input N] 

Yêu cầu:

  • tên Field và đầu vào trường phải sắp xếp trên các cạnh trái
  • Cả hai cột động phải kích thước bản thân để họ content
  • Phải làm việc trên các trình duyệt chéo

Tôi thấy bố cục này cực kỳ đơn giản khi sử dụng các bảng HTML, nhưng vì tôi thấy rất nhiều người thuần túy CSS khẳng định rằng các bảng chỉ được sử dụng cho dữ liệu dạng bảng, tôi đã tìm ra cách có thể sử dụng CSS.

+0

Hãy thử giải pháp của tôi cho người bạn đời. – roosteronacid

+2

Umh, tại sao mọi người ghét bàn, bạn đời? Có vẻ như cái búa thích hợp cho móng tay này? –

+0

có thể trùng lặp của [Có thể chấp nhận sử dụng các bảng biểu mẫu không? Hoặc là nó vẫn còn chính xác hơn để sử dụng divs?] (Http://stackoverflow.com/questions/1395514/is-it-acceptable-to-use-tables-for-forms-or-is-it-still-more- đúng-to-use-divs) – Eric

Trả lời

5

Tôi nghĩ hầu hết các câu trả lời thiếu điểm mà người hỏi ban đầu muốn chiều rộng cột phụ thuộc vào độ rộng của nội dung. Tôi tin rằng cách duy nhất để làm điều này với CSS thuần túy là sử dụng 'display: table', 'display: table-row' và 'display: table-cell', nhưng không được hỗ trợ bởi IE. Nhưng tôi không chắc chắn rằng tài sản này là mong muốn, tôi thấy rằng việc tạo ra một cột rộng vì có một tên trường dài duy nhất làm cho bố cục kém thẩm mỹ hơn và khó sử dụng hơn. Dòng bọc là tốt trong quan điểm của tôi, vì vậy tôi nghĩ rằng câu trả lời mà tôi chỉ đề nghị là không chính xác có lẽ là con đường để đi.

Robertc's example là lý tưởng, nhưng nếu bạn thực sự phải sử dụng bảng, tôi nghĩ bạn có thể làm cho nó thêm một chút 'ngữ nghĩa' bằng cách sử dụng <th> cho tên trường. Tôi không chắc chắn về điều này vì vậy xin vui lòng ai đó sửa tôi nếu tôi sai.

<table> 
    <tr><th scope="row"><label for="field1">FieldName 1</label></th> 
     <td><input id="field1" name="field1"></td></tr> 
    <tr><th scope="row"><label for="field2">FieldName 2 is longer</label></th> 
     <td><input id="field2" name="field2"></td></tr> 
    <!-- ....... --> 
</table> 

Cập nhật: Tôi chưa theo dõi kỹ, nhưng một số người cho rằng chúng tôi nên bắt đầu sử dụng chúng. Có một số article on 24 ways có chứa ví dụ có liên quan ở cuối.

+0

Tôi đồng ý, nếu bạn có một tên trường dài hơn _lot_, nó sẽ trở nên xấu xí. Bí quyết là sử dụng tên trường ngắn hơn và sau đó bao gồm chú giải công cụ nếu tên ngắn không mô tả trường đủ tốt. –

+0

Nhưng sau đó bạn có thể chắc chắn rằng cột đủ rộng bằng cách cho nó một chiều rộng đủ lớn trong ems, và vẫn có nó trông hợp lý. Căn phải nhãn nếu chúng quá xa hộp nhập. –

+0

Đánh dấu bạn cung cấp có vẻ lý tưởng đối với tôi. Đây là một bố cục dạng bảng và ví dụ của bạn thêm vào các nhãn có liên quan, v.v. –

-1

Đối tượng FieldName phải được chứa trong SPAN với thuộc tính kiểu nổi: trái và chiều rộng đủ rộng cho nhãn của bạn.

Đầu vào phải được chứa trong một khoảng được tạo kiểu để nổi: trái. Đặt một số <div style="clear: both"/> hoặc <br/> sau mỗi lần nhập trường để phá vỡ dấu phẩy động.

Bạn có thể bao gồm các đối tượng nói trên vào một div với tập hợp thuộc tính kiểu chiều rộng đủ rộng cho cả nhãn và đầu vào, sao cho "bảng" vẫn nhỏ và chứa.

Ví dụ:

<span style="float: left; width: 200px">FieldName1</span><span style="float: left"><input/><br/> 

<span style="float: left; width: 200px">FieldName2</span><span style="float: left"><input/><br/> 

<span style="float: left">FieldName3</span><span style="float: left"><input/><br/> 
+0

Tôi tin rằng anh ấy muốn một "div" xuất hiện sau mỗi trường nhập với 'clear: both' làm kiểu. –

-1

Mỗi hàng sẽ được thực hiện như là một 'div' có chứa hai một 'nhịp' cho fieldname và một cho đầu vào. Đặt 'float: left' trên cả hai nhịp. Tuy nhiên, bạn cần đặt độ rộng cho khoảng 'fieldname'.

Ngoài ra, hãy tạo kiểu div để bao gồm thuộc tính 'clear: both' để đề phòng.

3

tốt hơn vẫn sử dụng một danh sách

 <fieldset class="classname"> 
     <ul> 
      <li> 
       <label>Title:</label> 
       <input type="text" name="title" value="" /> 
      </li> 
     </ul> 
    </fieldset> 

tập các thẻ li rộng đủ rộng cho cả nhãn và đầu vào và thả nổi nhãn bên trái.

cũng để đạt được bảng đó giống như khối với các bảng, bạn có thể đặt chiều rộng nhãn là lớn như tên trường lớn nhất buộc tất cả các nhãn hoặc mở rộng rộng.

[sửa] đây là một số đọc sách tốt về a list apart

+0

Tôi đoán bộ chọn thẻ "nhãn ul li" sẽ phải có độ rộng rõ ràng được đặt để làm cho nó xuất hiện dưới dạng bảng. –

+0

chính xác, bạn có thể cần phải thông qua đầu vào vào hộp riêng của nó như một p để bố trí nổi ngay trong tất cả các trình duyệt – ethyreal

+0

Một Danh sách Ngoài là một trang web tuyệt vời, tôi khuyên bạn nên nó rất nhiều! Tôi cũng đã sử dụng bài viết này trong quá khứ: http://www.websiteoptimization.com/speed/tweak/forms/ –

11

tôi sẽ không, tôi sẽ sử dụng một bảng. Đây là một ví dụ điển hình về cách bố trí bảng - chính xác loại bảng điều là được cho là để sử dụng cho.

+2

Tôi không đồng ý, trong bảng ý kiến ​​của tôi chỉ nên được sử dụng cho dữ liệu bảng, không bố trí bảng; có khá nhiều sự khác biệt. – conmulligan

+2

Nếu đó là TABular, nó phù hợp cho TABLE. Sự khác biệt duy nhất giữa điều này và "dữ liệu bảng" là cột bên phải bao gồm các hộp nhập liệu. Cố gắng để đánh thức một cái gì đó khác ở đây chỉ là ngớ ngẩn. –

2

Không rõ rằng đó là dữ liệu dạng bảng như một số dữ liệu khác đã nhận xét, mặc dù có thể. Một bảng sẽ ngụ ý một mối quan hệ ngữ nghĩa giữa tất cả các mục trong các cột tương ứng (không chỉ là "chúng đều là tên của các cột cơ sở dữ liệu"). Dù sao, đây là cách tôi đã thực hiện nó trước:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <title>Form layout</title> 
    <style type="text/css"> 
     fieldset {width: 60%; margin: 0 auto;} 
     div.row {clear: both;} 
     div.row label {float: left; width: 60%;} 
     div.row span {float: right; width: 35%;} 
    </style> 
</head> 
<body> 
    <form action="#" method="post"> 
     <fieldset> 
      <legend>Section one</legend> 
      <div class="row"> 
       <label for="first-field">The first field</label> 
       <span><input type="text" id="first-field" size="15" /></span> 
      </div> 
      <div class="row"> 
       <label for="second-field">The second field with a longer label</label> 
       <span><input type="text" id="second-field" size="10" /></span> 
      </div> 
      <div class="row"> 
       <label for="third-field">The third field</label> 
       <span><input type="text" id="third-field" size="5" /></span> 
      </div> 
      <div class="row"> 
       <input type="submit" value="Go" /> 
      </div> 
     </fieldset> 
    </form> 
</body> 
</html> 

Chỉnh sửa: Có vẻ như tôi không thể trả lời nhận xét về câu trả lời của tôi, rõ ràng điều này ít gây nhầm lẫn hơn.Vì vậy, để trả lời bình luận 17 của 26 - chiều rộng 60% là hoàn toàn tùy chọn, theo mặc định, fieldset sẽ kế thừa chiều rộng của phần tử chứa. Bạn cũng có thể, tất nhiên, tận dụng tối đa chiều rộng và chiều rộng tối đa hoặc bất kỳ quy tắc bố cục bảng nào, nếu chỉ có IE hỗ trợ chúng, nhưng đó không phải là CSS thất bại;)

+0

Lỗ hổng với điều này là bố cục không tự kích thước dữ liệu, đó là một trong những yêu cầu của tôi. Đó là một tỷ lệ phần trăm của màn hình, có thể thực sự rộng trên độ phân giải màn hình rộng. Theo tôi, bố cục năng động là nơi CSS không thành công. –

+0

Ugh. Quá nhiều div và nhịp, quá nhiều đánh dấu với ý nghĩa ngữ nghĩa trống rỗng. –

+0

@ Jonathan: Chính xác. Điều này hy sinh sạch sẽ, có ý nghĩa đánh dấu cho đánh dấu tối nghĩa trong tên của không sử dụng bảng cho một cái gì đó rõ ràng là rất phù hợp với họ. –

2

này đánh dấu và CSS khoảng đạt được các mục tiêu đã nêu của bạn dưới sự hạn chế đối với câu hỏi này ...

The Proposal

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <title>My Form</title> 
    <style type="text/css"> 
     #frm1 div {float: left;} 
     #frm1 div.go {clear: both; } 
     #frm1 label, #frm1 input { float: left; clear: left; } 
    </style> 
</head> 
<body> 
    <form id="frm1" action="#" method="post"> 
     <fieldset> 
      <legend>Section One</legend> 
      <div> 
       <label for="field1">Name</label> 
       <label for="field2">Address, City, State, Zip</label> 
       <label for="field3">Country</label> 
      </div> 
      <div> 
       <input type="text" id="field1" size="15" /> 
       <input type="text" id="field2" size="20" /> 
       <input type="text" id="field3" size="10" /> 
      </div> 
      <div class="go"> 
       <input type="submit" value="Go" /> 
      </div> 
     </fieldset> 
    </form> 
</body> 
</html> 

Công đức

... nhưng tôi sẽ không khuyên bạn nên sử dụng nó. Những vấn đề với giải pháp này là

  1. bọc toàn bộ cột rất khó chịu ở trình duyệt gầy độ rộng
  2. nó tách các nhãn từ lĩnh vực đầu vào liên quan trong đánh dấu

các giải pháp trên nên (Tôi chưa xác minh điều này) có thể truy cập thân thiện vì trình đọc màn hình, tôi đã đọc, thực hiện tốt công việc sử dụng thuộc tính for="" khi liên kết nhãn với các trường nhập. Vì vậy, trực quan và có thể truy cập-khôn ngoan này hoạt động, nhưng bạn có thể không thích liệt kê tất cả các nhãn của bạn một cách riêng biệt từ các lĩnh vực đầu vào của bạn.

Kết luận

Câu hỏi vì nó được soạn ra - đặc biệt là yêu cầu để tự động kích thước chiều rộng của toàn bộ cột của nhãn khác nhau có độ dài đến độ dài lớn nhất nhãn - những thành kiến ​​giải pháp đánh dấu về phía bảng. Không có yêu cầu đó, có một số giải pháp ngữ nghĩa tuyệt vời để trình bày các biểu mẫu, như đã được đề cập và đề xuất bởi những người khác trong chủ đề này.

Điểm của tôi là: Có một số cách để trình bày biểu mẫu và thu thập dữ liệu người dùng một cách dễ chịu, dễ tiếp cận và trực quan. Nếu bạn không thể tìm thấy bố cục CSS nào có thể đáp ứng các yêu cầu tối thiểu của bạn nhưng các bảng có thể, sau đó sử dụng các bảng.

+0

Hmmm, một cuộc bỏ phiếu gần ngay lập tức mà không bình luận. Folks, tôi gọi họ như tôi thấy 'em. –

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