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>

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.


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.


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.


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!)


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

6

Oder Sie könnten jQuery verwenden:

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

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;

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>

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


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


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>

@DannyBeckett Es ist gültig in HTML5.
Tek


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.