Wie mache ich den gesamten Bereich eines Listenelements in meiner Navigationsleiste als Link anklickbar?

95

Ich habe eine horizontale Navigationsleiste, die aus einer ungeordneten Liste besteht, und jedes Listenelement hat viele Auffüllungen, damit es schön aussieht, aber der einzige Bereich, der als Link fungiert, ist der Text selbst. Wie kann ich dem Benutzer ermöglichen, auf eine beliebige Stelle im Listenelement zu klicken, um den Link zu aktivieren?

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

Curyous
quelle

Antworten:

109

Legen Sie keine Polsterung in das Element 'li'. Setzen Sie stattdessen das Ankertag auf display:inline-block;und wenden Sie eine Auffüllung an.

Stussa
quelle
display: inline; zoom: 1;in einem bedingten Kommentar für IE6 und IE7 wird ersetzt, display: inline-block;obwohl ja, wenn Listenelemente bereits schwebend sind, display: block;wird auch OK sein
FelipeAls
Das hat gut funktioniert, nur eine Beschwerde, es schien nicht mit dem: after-Selektor zu funktionieren. Ich wollte, dass ein >Symbol nach meinem Linktext angezeigt wird, aber nicht in den Inhalt eingefügt wird. Am Ende habe ich es nur in den Inhalt eingefügt. Wäre neugierig, ob es einen besseren Weg gibt, dies zu erreichen.
counterbeing
46

Definieren Sie Ihre CSS-Eigenschaft für das Ankertag wie folgt:

{display:block}

Dann nimmt der Anker den gesamten Listenbereich ein, sodass Ihr Klick in dem leeren Bereich neben Ihrer Liste funktioniert.

suren
quelle
1
Ich wünschte, ich könnte diese Antwort oben auf die Antwortliste ziehen ... Dies ist die beste Lösung für dieses Problem !!!!
Rishabh
1
Bricht Linien, wenn sich etwas anderes in der befindet li, z. B. ein Symbol.
Gringo Suave
13

Stellen Sie sicher, dass das Ankertag eher die Polsterung als die enthält li. Auf diese Weise nimmt es den gesamten Bereich ein.

Aaron Harun
quelle
3
Ich würde auch vorschlagen, den Schwebezustand auf den Anker zu verschieben, um eine bessere Browserunterstützung zu erzielen.
NinjaBomb
10

Super, super spät zu dieser Party, aber trotzdem: Sie können den Anker auch als Flex-Gegenstand stylen. Dies ist besonders nützlich für Listenelemente mit dynamischer Größe / Anordnung.

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

(Vorsichtsmaßnahme: Flexboxen werden obvs immer noch nicht gut unterstützt. Autoprefixer zur Rettung!)

Krise. Schaf
quelle
Aber jetzt (ein paar Jahre später) funktioniert flex gut, daher denke ich, dass es die beste Antwort ist, wenn Sie das Menü mit ulund flexbox erstellen.
Ludovic Kuty
10

Verwenden Sie Folgendes:

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

Oder Sie könnten jQuery verwenden:

$("li").click(function(){
   window.location=$(this).find("a").attr("href"); 
   return false;
});
Kieran
quelle
3
Man kann sagen, dass diese Lösung 'Dirty JQuery-Lösung ist, die nicht benötigt wird, weil Sie es einfach mit CSS tun können'. Aber um ehrlich zu sein - manchmal befinden Sie sich in einer Situation, in der Sie nicht mit Ihrem Code arbeiten, und Sie haben einfach keine Zeit, alle DOM-Struktur- und CSS-Stylesheets kennenzulernen (und zu verstehen, was der Codierer gedacht hat). Also +1.
Lemoid
Stimmen Sie mit @lemoid überein, wir müssen uns daran erinnern, dass "hübsche" Lösungen im wirklichen Leben nicht immer praktisch sind.
UncaAlby
Ich liebe dich wirklich!!
Castiblanco
1

Sie sollten diese CSS-Eigenschaft und diesen Wert in Ihrem li:

pointer-events:all;

Sie können den Link also mit jQuery oder JavaScript verarbeiten oder ein aTag verwenden, aber alle anderen Tag-Elemente in lisollten die CSS-Eigenschaft haben:

pointer-events:none;
dnvtrn
quelle
0

Wenden Sie einfach das folgende CSS an:

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

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

Hier ist, wie ich es gemacht habe

Machen Sie den <a>Inline-Block und entfernen Sie die Polsterung von Ihrem<li>

Dann können Sie mit dem widthund dem heightder <a>in der spielen<li>

Setzen Sie das widthauf 100%und sehen Sie, wie es funktioniert

PS: - Holen Sie sich die Hilfe der Chrome Developer Tools, wenn Sie das heightund ändernwidth

hs18
quelle
-1

Sie können jederzeit das gesamte Tag li mit dem Hiperlink-Tag einwickeln. Hier ist meine Lösung:

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

Marcello Perri
quelle
Um einen Kommentar aus einer anderen herabgestimmten Antwort zu stehlen: "Dies funktioniert, ist aber syntaktisch ungültig."
topskip
-2

Fügen Sie das Listenelement in den Hyperlink ein und nicht umgekehrt.

Zum Beispiel mit Ihrem Code:

<a href="#"><li>One</li></a>
Spudious
quelle
@DannyBeckett Es ist gültig in HTML5.
Tek
@Tek Nein, ist es nicht .
Danny Beckett
Sie haben Recht, ich habe an Blockelemente gedacht, die in Ankern erlaubt sind, aber ich wusste nicht, dass Kinder eine der Ausnahmen von der Regel sind. w3.org/html/wg/drafts/html/master/… Danke für die schnelle Korrektur.
Tek
Oh nein nein nein ... Ihre Syntax und Ihr semantisches Markup sind gerade aus dem Fenster gegangen. Mach das nie wieder, mein Freund, es macht das Web einfach zu einem schrecklichen Ort.
Teodor Sandu