Jak sprawić, aby cały obszar elementu listy na moim pasku nawigacji był klikalny jako łącze?


97

Mam poziomy pasek nawigacyjny utworzony z nieuporządkowanej listy, a każdy element listy ma dużo wypełnienia, aby ładnie wyglądał, ale jedynym obszarem, który działa jako łącze, jest sam tekst. Jak mogę umożliwić użytkownikowi kliknięcie w dowolnym miejscu elementu listy, aby aktywować łącze?

#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>

Odpowiedzi:


110

Nie umieszczaj dopełnienia w pozycji „li”. Zamiast tego ustaw znacznik kotwicy na display:inline-block;i zastosuj do niego wypełnienie.


display: inline; zoom: 1;w komentarzu warunkowym dla IE6 i IE7 zostaną zastąpione, display: inline-block;chociaż tak, jeśli elementy listy są już pływające, również display: block;będzie OK
— FelipeAls

To działało ładnie tylko z jedną skargą, wydawało się, że nie działa z selektorem: after. Chciałem, >aby symbol pojawił się po tekście mojego linku, ale nie umieszczałem go w treści ... Skończyło się na tym, że umieściłem go w treści. Byłbym ciekawy, czy istnieje lepszy sposób na osiągnięcie tego.
— przeciwstawianie się

47

Zdefiniuj właściwość css tagu kotwicy jako:

{display:block}

Następnie kotwica zajmie cały obszar listy, więc kliknięcie będzie działać w pustym miejscu obok listy.


1
Chciałbym móc przeciągnąć tę odpowiedź na górę listy odpowiedzi ... To najlepsze rozwiązanie tego problemu !!!!
— Rishabh

1
Przerywa linie, jeśli cokolwiek innego znajduje się w li, na przykład ikona.
— Gringo Suave

13

Spraw, aby tag kotwicy zawierał dopełnienie, a nie li. W ten sposób zajmie cały obszar.


3
Sugerowałbym również przeniesienie stanu aktywowania do kotwicy, a także poza li, aby zapewnić lepszą obsługę przeglądarki.
— NinjaBomb

12

Super, bardzo późno na tę imprezę, ale w każdym razie: kotwicę można również stylizować jako element elastyczny. Jest to szczególnie przydatne w przypadku dynamicznie dopasowanych / uporządkowanych elementów listy.

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;
}

(Uwaga: flexboxy nadal nie są dobrze obsługiwane. Autoprefixer na ratunek!)


1
Ale teraz (kilka lat później) flex działa dobrze, więc myślę, że jest najlepszą odpowiedzią podczas budowania menu za pomocą uli flexbox.
— Ludovic Kuty

Myślę, że ta odpowiedź powinna być na górze, teraz, gdy flexbox jest zaimplementowany we wszystkich przeglądarkach
— Mohammad Faisal

11

Użyj następujących:

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

7

Lub możesz użyć jQuery:

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

3
Można powiedzieć, że jest to „brudne rozwiązanie jquery, które nie jest potrzebne, ponieważ można to łatwo zrobić za pomocą css”. Ale szczerze mówiąc - czasami znajdujesz się w sytuacji, gdy pracujesz z nie-twoim-kodem i po prostu nie masz czasu, aby poznać całą strukturę DOM i arkusze stylów CSS (i próbować zrozumieć, o czym myślał koder). Więc +1.
— lemoid

Zgadzam się z @lemoid, musimy pamiętać, że „ładne” rozwiązania nie zawsze są praktyczne w prawdziwym życiu.
— UncaAlby

1

Powinieneś użyć tej właściwości i wartości CSS w swoim li:

pointer-events:all;

Możesz więc obsłużyć link za pomocą jQuery lub JavaScript albo użyć atagu, ale wszystkie inne elementy tagu wewnątrz lipowinny mieć właściwość CSS:

pointer-events:none;

0

Po prostu zastosuj poniższy CSS:

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

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

0

oto jak to zrobiłem

Zrób <a>blok inline i usuń wyściółkę z<li>

Następnie można grać z widthoraz heightz<a> w<li>

Włóż widthdo 100%jako początek i zobaczyć, jak to działa

PS: - Skorzystaj z pomocy Chrome Developer Tools przy zmianie height iwidth


-2

Umieść element listy w hiperłączu, a nie na odwrót.

Na przykład z Twoim kodem:

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

@DannyBeckett Działa w HTML5.
— Tek


Masz rację, myślałem o elementach blokowych dozwolonych w kotwicach, ale nie wiedziałem, że dzieci ul były jednym z wyjątków od reguły. w3.org/html/wg/drafts/html/master/… Dzięki za szybką korektę.
— Tek

O nie, nie, nie ... Twoja składnia i znaczniki semantyczne właśnie wyszły przez okno. Nigdy więcej tego nie rób, przyjacielu, po prostu sieć staje się okropnym miejscem.
— Teodor Sandu
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.