2012-09-06 19 views
5

Tôi đang cố gắng để thực hiện một menu với các tính năng sau:Để tìm kiếm một menu thả xuống hoàn hảo: kéo dài đến chiều rộng đầy đủ, các mục có chiều rộng bằng nhau, CSS thuần túy. Xin vui lòng giúp giải quyết một trục trặc

  • ngang;
  • các mục menu có chiều rộng bằng nhau;
  • các mục menu trải rộng trên toàn bộ chiều rộng trang (không chỉ là đám đông ở phía bên trái);
  • động (quy tắc css không nên dựa vào số lượng mục được xác định trước);
  • thả xuống cấp thứ hai với các mục được căn chỉnh theo chiều dọc;
  • CSS nguyên bản (không có JS!).

Điều này dường như mô tả một menu hoàn hảo như tôi thấy.

Tôi đã gần như succeded làm cho nó bằng cách sử dụng kỹ thuật đẹp display: table-cell; (tags bị bỏ qua vì đơn giản):

<ul> 
    <li>Menu item</li> 
    <li> 
     Expandable ↓ 
     <ul> 
      <li>Menu</li> 
      <li>Menu item</li> 
      <li>Menu item long</li> 
     </ul> 
    </li> 
    <li>Menu item</li> 
    <li>Menu item</li> 
</ul> 
ul { 
    display: table; 
    table-layout: fixed; 
    width: 100%; 
} 

li { 
    display: table-cell; 
    text-align: center;  
} 

li:nth-child(even){ 
    background-color: lightblue;  
} 

li:nth-child(odd){ 
    background-color: lightskyblue;  
} 

li ul { display: none; } 

li:hover ul { 
    display: block; 
    position: absolute; 
} 

li:hover ul li { 
    display: block; 
} 

Vấn đề duy nhất là mục menu con xuất hiện toàn bộ chiều rộng trang và một phần bên ngoài trình duyệt cửa sổ, buộc thanh cuộn ngang xuất hiện:

Gah! StackOverflow sẽ không cho phép tôi đăng hình ảnh. Hãy thử nghiệm trực tiếp trên JSFiddle: http://jsfiddle.net/6PTpd/9/

Tôi có thể khắc phục điều này bằng cách thêm float: left; clear: both; vào li:hover ul li. Nhưng khi tôi làm, các mục menu con có độ rộng khác nhau:

Fiddle: http://jsfiddle.net/6PTpd/10/

... hoặc chiều rộng width: 15%;: http://jsfiddle.net/6PTpd/12/

Cả sửa là xấu xí và giải quyết vấn đề không phải chiều rộng bình đẳng cũng không phải vấn đề thanh cuộn ngang .

UPD Trong khi đánh răng lên bài này tôi đã tìm thấy một số giải pháp của vấn đề thanh cuộn: set li:hover ul chiều rộng để 0. Nhưng lực lượng này để spectify chiều rộng của mục menu con trong một giá trị tuyệt đối. :(Xem http://jsfiddle.net/6PTpd/13/

Ngoài ra, giải pháp này có thể hút khó khi mục trình đơn cuối cùng được mở rộng Tùy thuộc vào độ rộng màn hình, nó vẫn có thể thổi trang rộng hơn so với cửa sổ:. http://jsfiddle.net/6PTpd/15/

Câu hỏi:

  1. làm thế nào để tôi làm cho các mục menu con xuất hiện cùng độ rộng như cha mẹ của họ và không cho phép các thanh cuộn ngang?
  2. có một kỹ thuật CSS cho phép tạo ra một menu với TẤT CẢ các điều kiện tiên quyết s được mô tả ở đầu bài viết?

Tôi đã tìm thấy rất nhiều ví dụ, nhưng chúng không kéo dài (nổi các mục bên trái) hoặc không động (sử dụng các kích thước được lấy từ số mục được xác định trước, e. G.width: 20% cho mỗi mục trong năm mục đầu tiên hoặc thậm chí tệ hơn, sử dụng kích thước tuyệt đối!).

Trả lời

1

Đây không phải là cách tốt nhất để làm điều này, nhưng đây là giải pháp của bạn: http://jsfiddle.net/6PTpd/17/

Điều buồn cười về CSS là ngay cả các bậc thầy luôn tìm kiếm những điều mới mẻ mà bạn có thể làm gì với nó. Đó là một ngôn ngữ tuyệt vời theo cách đó. Đó là lý do tại sao tôi đã cho bạn rằng fiddle, để bạn có thể tìm hiểu những gì bạn đã làm sai (Đó là chủ yếu là vị trí tuyệt đối, BTW). NHƯNG cũng có một số sơ hở mà bạn nên biết.

Vì vậy, hãy để tôi giải thích lý do bạn có thể không nên sử dụng mã trong JSFiddle đó. Vấn đề đầu tiên là nó sử dụng display: none. Đó là vấn đề vì trình đọc màn hình không đọc văn bản không hiển thị. (thông tin thêm ở đây: http://css-tricks.com/places-its-tempting-to-use-display-none-but-dont/)

Vấn đề thứ hai là nó hiển thị khi di chuột. Trong một thế giới mà màn hình cảm ứng ngày càng trở nên phổ biến, di chuột không còn là lựa chọn tốt nhất.

Bạn vẫn có thể sử dụng nó nếu bạn muốn, chỉ cần nghĩ rằng bạn nên biết về những hạn chế.

TL; DR: Nếu trình đọc màn hình và hỗ trợ màn hình cảm ứng là một vấn đề thì tôi khuyên bạn nên tìm kiếm một tùy chọn khác.

+1

Xin cảm ơn Timothy! Giải pháp này là hoàn hảo. –

+0

Giải pháp được đề xuất bởi bạn ALREADY hoạt động trên máy tính bảng! Bạn chỉ cần tạo mục có thể mở rộng ở cấp cao nhất không thể nhấp được. : D –

+0

Ah, tốt. Tôi rất vui. Thiết kế đẹp, bằng cách này, những màu xanh trông khá đẹp với nhau. –

0

Có rất nhiều cách để tạo menu hoàn hảo bằng mã HTML và CSS, đặc biệt nếu bạn đang sử dụng HTML5 & CSS3 và bạn có thể tìm thấy rất nhiều ví dụ bằng cách tìm kiếm trên internet. Cách dễ dàng thứ hai là sử dụng các chương trình giúp mã hóa dễ dàng hơn cho bạn như Trình đơn Sothink DHTML hoặc http://css3menu.com

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