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.