98 votes

Comment faire en sorte que toute la zone d'un élément de liste dans ma barre de navigation soit cliquable en tant que lien ?

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 que ce soit joli, mais la seule zone qui fonctionne comme un lien est le texte lui-même. Comment puis-je permettre à l'utilisateur de cliquer n'importe où dans l'élément de la 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>

115voto

Stussa Points 991

Ne mettez pas de remplissage dans l'élément "li". Définissez plutôt la balise d'ancrage à display:inline-block; et y appliquer du rembourrage.

0 votes

display: inline; zoom: 1; dans un commentaire conditionnel pour IE6 et IE7 remplacera display: inline-block; mais oui, si les éléments de la liste sont déjà flottants, display: block; sera également acceptable

0 votes

Cela a bien fonctionné, à une seule exception près : cela ne semblait pas fonctionner avec le sélecteur :after. Je voulais un > pour qu'il apparaisse après le texte de mon lien, mais sans le mettre dans le contenu... J'ai fini par le mettre dans le contenu. Je serais curieux de savoir s'il existe un meilleur moyen d'y parvenir.

49voto

suren Points 81

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

{display:block}

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

1 votes

J'aimerais pouvoir faire glisser cette réponse en haut de la liste des réponses... C'est la meilleure solution pour ce problème !!!!

1 votes

Brisera les lignes si quelque chose d'autre se trouve dans le li comme une icône.

13voto

Aaron Harun Points 7222

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

3 votes

Je suggérerais également de déplacer l'état de survol vers l'ancre ainsi que hors du li pour un meilleur support du navigateur.

7voto

Kieran Points 1

Ou vous pouvez utiliser jQuery :

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

3 votes

On peut dire que cette solution est une "solution jquery sale qui n'est pas nécessaire parce que vous pouvez le faire facilement avec css". Mais pour être honnête, il arrive que l'on se retrouve dans une situation où l'on travaille avec un code qui n'est pas le sien et où l'on n'a tout simplement pas le temps de connaître la structure DOM et les feuilles de style css (et d'essayer de comprendre "ce que le codeur pensait"). Donc +1.

0 votes

Je suis d'accord avec @lemoid, nous devons nous rappeler que les "jolies" solutions ne sont pas toujours pratiques dans la vie réelle.

-2voto

Spudious Points 18

Placez l'élément de la liste dans l'hyperlien au lieu de l'inverse.

Par exemple avec votre code :

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

0 votes

@DannyBeckett C'est valide en HTML5.

0 votes

0 votes

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X