2010-06-19 18 views
70

Ho una barra di navigazione orizzontale creata da una lista non ordinata, e ogni elemento della lista ha un sacco di padding per renderlo bello, ma l'unica area che funziona come un collegamento è il testo stesso. Come posso consentire all'utente di fare clic in qualsiasi punto della voce di elenco per attivare il collegamento?Come faccio a rendere l'intera area di una voce di elenco nella mia barra di navigazione, selezionabile come collegamento?

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

risposta

86

Non mettere imbottitura nella voce 'li'. Piuttosto, imposta il tag di ancoraggio su display:inline-block; e applica il riempimento a esso.

+11

Non tutte le versioni di IE supportano completamente 'inline-blocco-(vedi http://www.quirksmode.org/css /display.html). Dato che 'li' sono già flottati, 'a {display: block}' è probabilmente la scelta migliore. – dhabersack

+0

'display: inline; zoom: 1; 'in un commento condizionale per IE6 e IE7 sostituirà' display: inline-block; 'anche se sì, se le voci di lista sono già flottate,' display: block; 'sarà OK anche – FelipeAls

+0

Che ha funzionato bene un solo reclamo , non sembrava funzionare con il selettore: after. Volevo che il simbolo '>' apparisse dopo il mio testo del link, ma non lo inserissi nel contenuto ... Alla fine ho inserito solo il contenuto. Sarebbe curioso se c'è un modo migliore per farlo. – counterbeing

12

Fare in modo che il tag di ancoraggio contenga il padding anziché lo li. In questo modo, occuperà tutta l'area.

+3

Vorrei anche suggerire di spostare lo stato di passaggio del mouse sull'ancora oltre il limite per un migliore supporto del browser. – NinjaBomb

37

definire la vostra proprietà css come tag di ancoraggio:

{display:block} 

Poi l'ancora occuperà l'intera area lista, in modo che il click lavorerà nello spazio vuoto accanto alla vostra lista.

+0

Questo ha funzionato per me. –

+0

Vorrei, potrei trascinare questa risposta in cima alla lista delle risposte ...Questa è la soluzione migliore per questo problema !!!! – Rishabh

+0

Interrompe le righe se qualcos'altro è nel 'li', ad esempio un'icona. –

-2

Inserire l'elemento di elenco all'interno del collegamento ipertestuale anziché viceversa.

Per esempio con il codice:

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

Questo funziona, ma è sintatticamente non valido. –

+0

@DannyBeckett È valido in HTML5. – Tek

+0

@Tek [No, non lo è] (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

Oppure si potrebbe usare jQuery:

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

Si può dire che questa soluzione è 'soluzione jquery sporca che non è necessaria perché si può fare facilmente con css'. Ma, ad essere onesti, a volte ti trovi in ​​una situazione di lavoro con non-tuo-codice e semplicemente non hai tempo per conoscere tutti i fogli di stile della struttura DOM e css (e cercare di capire "cosa stava pensando il programmatore"). Quindi +1. – lemoid

5

Super, super tardi per questo partito, ma in ogni caso: è possibile anche lo stile l'ancora come un flex articolo. Ciò è particolarmente utile per voci di elenco di dimensioni dinamiche/organizzate.

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

(avvertimento:. Flexboxes sono obvs ancora non ben supportato Autoprefixer per il salvataggio!)

3

Uso seguente:

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

si dovrebbe usare questa proprietà CSS e il valore nella vostra li:

pointer-events:all; 

Quindi, è possibile gestire il collegamento con jQuery o JavaScript o noi una e un tag a, ma tutti gli altri elementi di tag all'interno del li dovrebbero avere la proprietà CSS:

pointer-events:none; 
Problemi correlati