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>

Wredny
źródło

Odpowiedzi:

110

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

Stussa
źródło
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.

jasne
źródło
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.

Aaron Harun
źródło
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!)

kryzys. owca
źródło
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;
}
Sabby62
źródło
7

Lub możesz użyć jQuery:

$("li").click(function(){
   window.location=$(this).find("a").attr("href"); 
   return false;
});
Kieran
źródło
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;
dnvtrn
źródło
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>
vabi
źródło
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

hs18
źródło
-2

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

Na przykład z Twoim kodem:

<a href="#"><li>One</li></a>
Ostrożny
źródło
@DannyBeckett Działa w HTML5.
Tek
@Tek Nie, nie jest .
Danny Beckett
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