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>

Curyous
la source

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.

Stussa
la source
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.

suren
la source
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.

Aaron Harun
la source
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!)

crise de mouton
la source
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;
}
Sabby62
la source
6

Ou vous pouvez utiliser jQuery:

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

hs18
la source
-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>

Marcello Perri
la source
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>
Spudieux
la source
@DannyBeckett C'est valide en HTML5.
Tek
@Tek Non, ce n'est pas le cas .
Danny Beckett
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