2009-07-18 26 views
16

Sự cố của tôi liên quan đến HTML và CSS. Tôi có một cấu trúc kiểu phân cấp mà tôi muốn hiển thị bên trong một danh sách. Hệ thống phân cấp chứa Quốc gia, Tiểu bang và Thành phố (có ba cấp độ sâu).Hiển thị cấu trúc phân cấp của "TÙY CHỌN" trong thẻ "CHỌN"

Tôi muốn hiển thị danh sách bên trong danh sách chọn, mỗi loại mục (Quốc gia, Tiểu bang, Thành phố) phải được chọn. Các mục sẽ xuất hiện thụt vào dưới dạng:

United States 
- Hawaii 
-- Kauai 
- Washington 
-- Seattle 
-- Chelan 

Vấn đề là với sự thụt đầu dòng. Tôi đang cố gắng sử dụng hoặc lề trái hoặc padding-trái để thụt lề các thẻ, xuất hiện chính xác trong FireFox nhưng không phải trong IE7. Đây là ví dụ về danh sách được chọn đã tạo:

<select name="Something"> 
<option style="padding-left: 0">United States</option> 
<option style="padding-left: 20px">Hawaii</option> 
<option style="padding-left: 40px">Kauai</option> 
<option style="padding-left: 20px">Washington</option> 
<option style="padding-left: 40px">Seattle</option> 
<option style="padding-left: 40px">Chelan</option> 
</select> 

Tôi muốn đạt được sự thụt lề nhất quán trên các trình duyệt mà không cần sử dụng CSS hacks.

+0

xem thêm http://stackoverflow.com/questions/1037732/nesting-optgroups-in-a-dropdownlist-select –

Trả lời

18

cách lừa dối tốt hơn nhiều và là ý tưởng đầu tiên của tôi. Để thay thế nếu điều đó không hiệu quả là bạn có thể sử dụng các khoảng trống trong giá trị thẻ:

<select> 
    <option>select me</option> 
    <option>&nbsp;me indented</option> 
    <option>&nbsp;&nbsp;even more indentation</option> 
</select> 

Nó đẹp, nhưng nó có thể hiệu quả nếu bạn không chọn nhóm.

+0

ugh, tôi không thể yêu cầu thực thể hoạt động chính xác   – MacAnthony

+1

Tôi e rằng đây thực sự là giải pháp đáng tin cậy nhất. – Ms2ger

+0

Tôi cũng đồng ý. Các không gian không bị phá vỡ hoạt động và dấu gạch ngang. –

37

Việc hiển thị các phần tử SELECT phần lớn phụ thuộc vào trình duyệt, bạn có rất ít ảnh hưởng đến bản trình bày của chúng. Một số trình duyệt rõ ràng cho phép bạn tùy biến nhiều hơn các trình duyệt khác, IE xảy ra để cho phép rất ít (gasp, những người muốn có thunk;)). Nếu bạn cần các phần tử SELECT rất tùy chỉnh, bạn sẽ cần phải sử dụng JavaScript hoặc tạo lại thứ gì đó hoạt động như một số SELECT nhưng được tạo thành từ một loạt các hộp kiểm và các hộp kiểm hoặc một số thứ cần mở rộng.

Có nói rằng, tôi nghĩ rằng những gì bạn đang tìm kiếm là OPTGROUPs:

<select> 
    <optgroup label="xxx"> 
    <option value="xxxx">xxxx</option> 
    .... 
    </optgroup> 
    <optgroup label="yyy"> 
    ... 
    </optgroup> 
</select> 

Mỗi trình duyệt sẽ hiển thị chúng khác nhau, nhưng họ sẽ được hiển thị trong một thời trang độc đáo trong cách này hay cách khác. Lưu ý rằng mặc dù chính thức trong HTML4 bạn không thể làm tổ OPTGROUP s.

+1

Là dự phòng, bạn luôn có thể hiển thị chúng như bạn đã làm trong ví dụ, thụt lề chúng bằng dấu gạch ngang -. – deceze

+1

@deceze Được trích dẫn từ câu hỏi: "mỗi loại mục (Quốc gia, Tiểu bang, Thành phố) phải được chọn". Tôi nghi ngờ optgroup có thể lựa chọn. –

+0

Đúng vậy. Sau đó, anh ta cần phải nhóm chúng lại khác nhau và sử dụng nhãn nhóm như, tốt, nhãn, hoặc đơn giản là bỏ qua phần thứ hai của câu trả lời của tôi. – deceze

2

Phương pháp này không phải là nhóm tạo ra nhiều vấn đề hơn là giải quyết vấn đề? Là người dùng, tôi nên chọn người nào trong số đó? Có lợi ích gì khi lựa chọn một thứ gì đó cụ thể hơn quốc gia?

Nếu vấn đề là bạn chỉ có một trường cơ sở dữ liệu để lưu trữ chúng, tại sao không có ba hộp chọn riêng biệt (tạo 2 hoặc 3 tùy chọn) và chỉ lưu trữ cụ thể nhất?:

<select name="country"> 
    <option>Choose a country</option> 
    <option>United States</option> 
</select> 
<select name="state"> 
    <option>Choose a state</option> 
    <option>Hawaii</option> 
</select> 
<select name="city"> 
    <option>Choose a city</option> 
    <option>Kauai</option> 
</select> 
+0

Tôi sẽ phải thực hiện một "cas =" onchange = populate_next_select(); vì mục đích này. Bên cạnh đó, những gì tôi muốn là trình bày toàn bộ danh sách trong một galance. –

+0

@Salman A: Tại sao vậy? Bạn đang điền đầy đủ vào hộp chọn một lần, vậy tại sao không điền đầy đủ 3? Tuy nhiên, quan điểm của bạn về việc cung cấp toàn bộ danh sách cùng một lúc là một công bằng. –

+5

>> "Tại sao vậy?" Khách hàng đã nói như vậy: ( –

9

Chỉ vì lợi ích của khách, tôi cảm thấy tôi nên chia sẻ giải pháp này tôi nghĩ ra: http://jsfiddle.net/n9qpN/

Trang trí các tùy chọn với lớp mức

<select name="hierarchiacal"> 
<option class="level_1">United States</option> 
    <option class="level_2">Hawaii</option> 
     <option class="level_3">Kauai</option> 
    <option class="level_2">Washington</option> 
     <option class="level_3">Seattle</option> 
     <option class="level_3">Chelan</option> 
</select> 

Bây giờ chúng ta có thể sử dụng jQuery để định dạng lại nội dung của phần tử select

$(document).ready(
function(){ 
    $('.level_2').each(
     function(){ 
      $(this).text('----'+$(this).text()); 
     } 
    ); 

    $('.level_3').each(
     function(){ 
      $(this).text('---------'+$(this).text()); 
     } 
    ); 

} 
); 

Điều này có thể được mở rộng đến bất kỳ cấp độ nào

2

Hãy thử sử dụng & # 160;

<select name="Something"> 
 
    <option>United States</option> 
 
    <option>&#160;Hawaii</option> 
 
    <option>&#160;&#160;Kauai</option> 
 
    <option>&#160;Washington</option> 
 
    <option>&#160;&#160;Seattle</option> 
 
    <option>&#160;&#160;Chelan</option> 
 
</select>

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