Làm cách nào để tôi có thể nhấp vào toàn bộ khu vực của một mục danh sách trong thanh điều hướng dưới dạng một liên kết?


95

Tôi có một thanh điều hướng ngang được tạo từ một danh sách không có thứ tự và mỗi mục trong danh sách có rất nhiều phần đệm để làm cho nó trông đẹp mắt, nhưng khu vực duy nhất hoạt động như một liên kết là chính văn bản. Làm cách nào để cho phép người dùng nhấp vào bất kỳ đâu trong mục danh sách để kích hoạt liên kết?

#nav {
  background-color: #181818;
  margin: 0px;
  overflow: hidden;
}

#nav img {
  float: left;
  padding: 5px 10px;
  margin-top: auto;
  margin-bottom: auto;
  vertical-align: bottom;
}

#nav ul {
  list-style-type: none;
  margin: 0px;
  background-color: #181818;
  float: left;
}

#nav li {
  display: block;
  float: left;
  padding: 25px 10px;
}

#nav li:hover {
  background-color: #785442;
}

#nav a {
  color: white;
  font-family: Helvetica, Arial, sans-serif;
  text-decoration: none;
}
<div id="nav">
  <img src="/images/renderedicon.png" alt="Icon" height="57" width="57" />
  <ul>
    <li><a href="#">One1</a></li>
    <li><a href="#">Two</a></li>
    <li><a href="#">Three</a></li>
    <li><a href="#">Four</a></li>
  </ul>
</div>
<div>
  <h2>Heading</h2>
</div>

Câu trả lời:


109

Không đặt đệm vào mục 'li'. Thay vào đó, hãy đặt thẻ liên kết thành display:inline-block;và áp dụng đệm cho nó.


display: inline; zoom: 1;trong một nhận xét có điều kiện cho IE6 và IE7 sẽ thay thế display: inline-block;mặc dù có, nếu các mục danh sách đã được thả nổi, display: block;cũng sẽ ổn
FelipeAls

Điều đó hoạt động tốt chỉ có một khiếu nại, nó dường như không hoạt động với bộ chọn: sau. Tôi muốn một >biểu tượng xuất hiện sau văn bản liên kết của mình, nhưng không đặt nó trong nội dung ... Cuối cùng tôi chỉ đưa nó vào nội dung. Sẽ rất tò mò nếu có cách tốt hơn để thực hiện điều đó.
counterbeing

46

Xác định thuộc tính css thẻ liên kết của bạn là:

{display:block}

Sau đó, neo sẽ chiếm toàn bộ khu vực danh sách, vì vậy nhấp chuột của bạn sẽ hoạt động trong không gian trống bên cạnh danh sách của bạn.


1
Tôi ước gì, tôi có thể kéo câu trả lời này lên đầu danh sách câu trả lời ... Đây là giải pháp tốt nhất cho vấn đề này !!!!
Rishabh

1
Sẽ ngắt dòng nếu có bất kỳ thứ gì khác trong li, chẳng hạn như biểu tượng.
Gringo Suave

13

Làm cho thẻ liên kết chứa phần đệm hơn là chứa li. Như vậy sẽ chiếm hết diện tích.


3
Tôi cũng khuyên bạn nên chuyển trạng thái di chuột sang neo cũng như tắt li để hỗ trợ trình duyệt tốt hơn.
NinjaBomb

10

Siêu, siêu trễ cho bữa tiệc này, nhưng dù sao đi nữa: bạn cũng có thể tạo kiểu mỏ neo như một món đồ linh hoạt. Điều này đặc biệt hữu ích cho các mục danh sách có kích thước / sắp xếp động.

a {
  /* This flexbox code stretches the link's clickable 
   * area to fit its parent block. */
  display:        flex;
  flex-grow:      1;
  flex-shrink:    1;
  justify-content: center;
}

(Lưu ý: flexboxes vẫn chưa được hỗ trợ tốt. Tự động sửa lỗi để giải cứu!)


Nhưng bây giờ (một vài năm sau), flex đang hoạt động tốt nên tôi nghĩ đó là câu trả lời tốt nhất khi xây dựng menu với ulvà flexbox.
Ludovic Kuty

10

Sử dụng sau:

a {
  display: list-item;
  list-style-type: none;
}

6

Hoặc bạn có thể sử dụng jQuery:

$("li").click(function(){
   window.location=$(this).find("a").attr("href"); 
   return false;
});

3
Người ta có thể nói rằng giải pháp này là 'giải pháp jquery bẩn không cần thiết vì bạn có thể làm điều đó dễ dàng với css'. Nhưng thành thật mà nói - đôi khi bạn thấy mình đang trong tình huống làm việc với mã không phải của bạn và đơn giản là bạn không có thời gian để hiểu tất cả cấu trúc DOM và bảng định kiểu css (và cố gắng hiểu 'người viết mã đang nghĩ gì'). Vì vậy, +1.
lemoid

Đồng ý với @lemoid, chúng ta phải nhớ các giải pháp "đẹp" không phải lúc nào cũng thực tế trong Đời sống thực.
UncaAlby

Tôi yêu bạn !!
Castiblanco

1

Bạn nên sử dụng thuộc tính CSS này và giá trị vào li:

pointer-events:all;

Vì vậy, bạn có thể xử lý liên kết bằng jQuery hoặc JavaScript hoặc sử dụng athẻ, nhưng tất cả các phần tử thẻ khác bên trong liphải có thuộc tính CSS:

pointer-events:none;

0

Chỉ cần áp dụng css dưới đây:

<style>
  #nav ul li {
    display: inline;
  }

  #nav ul li a {
    background: #fff;// custom background
    padding: 5px 10px;
  }
</style>

0

đây là cách tôi đã làm nó

Tạo khối <a>nội tuyến và xóa phần đệm khỏi<li>

Sau đó, bạn có thể chơi với widthheightcủa <a>trong<li>

Đặt widthđể 100%như một sự khởi đầu và xem làm thế nào nó hoạt động

Tái bút: - Nhận sự trợ giúp của Công cụ nhà phát triển Chrome khi thay đổi heightwidth


-1

Bạn luôn có thể bọc toàn bộ thẻ li bằng thẻ hiperlink Đây là giải pháp của tôi:

#nav {
  background-color: #181818;
  margin: 0px;
  overflow: hidden;
}

#nav img {
  float: left;
  padding: 5px 10px;
  margin-top: auto;
  margin-bottom: auto;
  vertical-align: bottom;
}

#nav ul {
  list-style-type: none;
  margin: 0px;
  background-color: #181818;
  float: left;
}

#nav li {
  display: block;
  text-align: center;
  float: left;
  width: 40px;
  padding: 25px 10px;
}

#nav li:hover {
  background-color: #785442;
}

#nav a {
  color: white;
  font-family: Helvetica, Arial, sans-serif;
  text-decoration: none;
}
<div id="nav">
  <img src="/images/renderedicon.png" alt="Icon" height="57" width="57" />
  <ul>
    <a href="#"><li>One1</li></a>
    <a href="#"><li>Two</li></a>
    <a href="#"><li>Three</li></a>
    <a href="#"><li>Four</li></a>
  </ul>
</div>
<div>
  <h2>Heading</h2>
</div>


Để ăn cắp một bình luận từ một câu trả lời downvoted: "tác phẩm này, nhưng là cú pháp hợp lệ"
topskip

-2

Đặt mục danh sách trong siêu liên kết thay vì theo cách khác.

Ví dụ với mã của bạn:

<a href="#"><li>One</li></a>

@DannyBeckett Nó hợp lệ trong HTML5.
Tek


Bạn nói đúng, tôi đã nghĩ đến các phần tử khối được phép bên trong neo nhưng tôi không biết ul con là một trong những ngoại lệ đối với quy tắc. w3.org/html/wg/drafts/html/master/… Cảm ơn bạn đã chỉnh sửa nhanh chóng.
Tek

Ồ không không không ... đánh dấu cú pháp và ngữ nghĩa của bạn vừa xuất hiện. Đừng bao giờ làm điều này nữa bạn của tôi, nó chỉ làm cho trang web trở thành một nơi tồi tệ.
Teodor Sandu,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.