2010-06-19 2 views
70

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 agréable, 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?Comment faire pour que toute la zone d'un élément de liste dans ma barre de navigation soit cliquable en tant que 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épondre

86

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

+11

Toutes les versions de IE prennent en charge entièrement 'inline-block' (voir http://www.quirksmode.org/css /display.html). Comme 'li' est déjà flottant,' a {display: block} 'est probablement le meilleur choix. – dhabersack

+0

'affichage: en ligne; 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 OK aussi – FelipeAls

+0

Cela a bien fonctionné une seule plainte , il ne semble pas fonctionner avec le sélecteur: après. Je voulais un symbole '>' apparaissant après le texte de mon lien, mais pas le mettre dans le contenu ... J'ai fini par le mettre dans le contenu. Serait curieux s'il y a une meilleure façon d'accomplir cela. – counterbeing

12

Faites que l'étiquette d'ancrage contienne le remplissage plutôt que le li. De cette façon, il va prendre toute la zone.

+3

Je suggère également de déplacer l'état hover à l'ancre ainsi de la li pour un meilleur support du navigateur. – NinjaBomb

37

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

{display:block} 

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

+0

Cela a fonctionné pour moi. –

+0

Je souhaite, je pourrais glisser cette réponse au-dessus de la liste de réponses ...C'est la meilleure solution pour ce problème !!!! – Rishabh

+0

Interrompre les lignes si quelque chose d'autre se trouve dans le fichier 'li', tel qu'une icône. –

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

Cela fonctionne, mais est syntaxiquement invalide. –

+0

@DannyBeckett C'est valide en HTML5. – Tek

+0

@Tek [Non ce n'est pas] (https://validator.w3.org/nu/?showsource=yes&useragent=Validator.nu%2FLV+http%3A%2F%2Fvalidator.w3.org%2Fservices&doc=data% 3Atext% 2Fhtml% 3Bcharset% 3Dutf-8% 3Bbase64% 2CPCFET0NUWVBFIGh0bWw% 2BPGh0bWw% 2BCjxoZWFkPjx0aXRsZT5UZXN0PC90aXRsZT48L2hlYWQ% 2BCjxib2R5Pgo8YSBocmVmPSIjIj48bGk% 2BT25lPC9saT48L2E% 2BCjwvYm9keT4KPC9odG1sPg% 3D 3D%). –

5

Ou vous pouvez utiliser jQuery:

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

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

5

super, super tard pour ce parti, mais de toute façon: vous pouvez aussi le style de l'ancre comme flex article. Ceci est particulièrement utile pour les éléments de liste de taille/agencement dynamiques.

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

(Caveat:. Flexboxes sont obvs toujours pas bien pris en charge Autoprefixer à la rescousse!)

3

Utilisation suivant:

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

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

pointer-events:all; 

Donc, vous pouvez gérer le lien avec jQuery ou JavaScript, ou nous e une étiquette a, mais tous les autres éléments d'étiquette à l'intérieur du li devraient avoir la propriété CSS:

pointer-events:none; 
Questions connexes