Comment rendre toute la zone d'un élément de liste dans ma barre de navigation, cliquable sous forme de lien?


95

J'ai une barre de navigation horizontale faite à partir d'une liste non ordonnée, et chaque élément de la liste a beaucoup de remplissage pour le rendre joli, mais la seule zone qui fonctionne comme lien est le texte lui-même. Comment puis-je permettre à l'utilisateur de cliquer n'importe où dans l'élément de liste pour activer le lien?

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

Réponses:


109

Ne mettez pas de remplissage dans l'élément «li». Au lieu de cela, définissez la balise d'ancrage sur display:inline-block;et appliquez-lui un remplissage.


display: inline; zoom: 1;dans un commentaire conditionnel pour IE6 et IE7 remplacera display: inline-block;bien que oui, si les éléments de la liste sont déjà flottants, ce display: block;sera OK aussi
FelipeAls

Cela a bien fonctionné, une seule plainte, cela ne semblait pas fonctionner avec le sélecteur: après. Je voulais qu'un >symbole apparaisse après le texte de mon lien, mais je ne l'ai pas mis dans le contenu ... J'ai fini par le mettre simplement dans le contenu. Je serais curieux de savoir s'il existe une meilleure façon d'accomplir cela.
contre-être

46

Définissez votre propriété css de balise d'ancrage comme suit:

{display:block}

Ensuite, l'ancre occupera toute la zone de liste, de sorte que votre clic fonctionnera dans l'espace vide à côté de votre liste.


1
Je souhaite, je pourrais faire glisser cette réponse en haut de la liste de réponses ... C'est la meilleure solution à ce problème !!!!
Rishabh le

1
Coupera les lignes si quelque chose se trouve dans le li, comme une icône.
Gringo Suave

13

Faites en sorte que la balise d'ancrage contienne le remplissage plutôt que le li. De cette façon, il occupera toute la zone.


3
Je suggérerais également de déplacer l'état de survol vers l'ancre ainsi que hors du li pour une meilleure prise en charge du navigateur.
NinjaBomb

10

Super, très tard à cette fête, mais de toute façon: vous pouvez également coiffer l'ancre comme un élément flexible. Ceci est particulièrement utile pour les éléments de liste dimensionnés / organisés dynamiquement.

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

(Attention: les flexbox sont obvs toujours pas bien supportés. Autoprefixer à la rescousse!)


Mais maintenant (quelques années plus tard), flex fonctionne bien, donc je pense que c'est la meilleure réponse lors de la construction du menu avec ulet flexbox.
Ludovic Kuty le

10

Utilisez ce qui suit:

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

6

Ou vous pouvez utiliser jQuery:

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

3
On peut dire que cette solution est «une solution jquery sale qui n'est pas nécessaire car vous pouvez le faire facilement avec css». Mais pour être honnête, vous vous trouvez parfois dans une situation de travail avec not-your-code et vous n'avez tout simplement pas le temps de connaître toutes les structures DOM et les feuilles de style css (et d'essayer de comprendre `` ce que le codeur pensait ''). Donc +1.
lemoid

D'accord avec @lemoid, il faut se rappeler que les "jolies" solutions ne sont pas toujours pratiques dans la vraie vie.
UncaAlby

Je t'aime vraiment!!
Castiblanco le

1

Vous devez utiliser cette propriété et cette valeur CSS dans votre li:

pointer-events:all;

Ainsi, vous pouvez gérer le lien avec jQuery ou JavaScript, ou utiliser une abalise, mais tous les autres éléments de balise à l'intérieur du lidevraient avoir la propriété CSS:

pointer-events:none;

0

Appliquez simplement le CSS ci-dessous:

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

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

0

voici comment je l'ai fait

Créez le <a>bloc en ligne et supprimez le rembourrage de votre<li>

Ensuite, vous pouvez jouer avec le widthet le heightdu <a>dans le<li>

Mettez le widthà 100%un départ et voir comment cela fonctionne

PS: - Obtenez l'aide des outils de développement Chrome lors du changement de heightetwidth


-1

Vous pouvez toujours envelopper la balise entière li avec la balise hiperlink Voici ma solution:

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


Pour voler un commentaire à une autre réponse contre-votée: "Cela fonctionne, mais n'est pas syntaxiquement incorrect."
topskip

-2

Placez l'élément de liste dans le lien hypertexte au lieu de l'inverse.

Par exemple avec votre code:

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

@DannyBeckett C'est valide en HTML5.
Tek


Vous avez raison, je pensais aux éléments de bloc autorisés à l'intérieur des ancres mais je ne savais pas que les enfants ul étaient l'une des exceptions à la règle. w3.org/html/wg/drafts/html/master/ Merci pour la correction rapide.
Tek

Oh non non non ... votre syntaxe et votre balisage sémantique sont sortis de la fenêtre. Ne faites plus jamais ça mon ami, ça fait juste du web un endroit horrible.
Teodor Sandu
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.