Como posso tornar toda a área de um item da lista na minha barra de navegação clicável como um link?

95

Eu tenho uma barra de navegação horizontal feita a partir de uma lista não ordenada, e cada item da lista tem muito preenchimento para torná-lo bonito, mas a única área que funciona como um link é o próprio texto. Como posso permitir que o usuário clique em qualquer lugar no item da lista para ativar o link?

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

Respostas:

109

Não coloque preenchimento no item 'li'. Em vez disso, defina a tag âncora como display:inline-block;e aplique preenchimento a ela.

Stussa
fonte
display: inline; zoom: 1;em um comentário condicional para o IE6 e o ​​IE7 substituirá, display: inline-block;embora sim, se os itens da lista já estiverem flutuando, display: block;também estará OK
FelipeAls
Isso funcionou bem apenas uma reclamação, não parecia funcionar com o seletor: after. Queria que um >símbolo aparecesse depois do texto do meu link, mas não colocasse no conteúdo ... acabei colocando apenas no conteúdo. Ficaria curioso se existe uma maneira melhor de fazer isso.
contraparte de
46

Defina sua propriedade css da tag âncora como:

{display:block}

Em seguida, a âncora ocupará toda a área da lista, então seu clique funcionará no espaço vazio ao lado de sua lista.

suren
fonte
1
Quem me dera poder arrastar esta resposta para o topo da lista de respostas ... Esta é a melhor solução para este problema !!!!
Rishabh
1
Irá quebrar as linhas se houver algo mais no li, como um ícone.
Gringo Suave
13

Faça com que a tag âncora contenha o preenchimento em vez de li. Assim, ocupará toda a área.

Aaron Harun
fonte
3
Eu também sugeriria mover o estado de foco para a âncora e também para fora do li para melhor suporte do navegador.
NinjaBomb
10

Muito, muito tarde para essa festa, mas enfim: você também pode estilizar a âncora como um item flexível. Isso é particularmente útil para itens de lista dimensionados / organizados dinamicamente.

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

(Advertência: os flexboxes obviamente ainda não são bem suportados. Autoprefixer para o resgate!)

crise. ovelha
fonte
Mas agora (alguns anos depois), o flex está funcionando bem, então acho que é a melhor resposta ao construir o menu com o ule flexbox.
Ludovic Kuty
10

Use o seguinte:

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

Ou você pode usar jQuery:

$("li").click(function(){
   window.location=$(this).find("a").attr("href"); 
   return false;
});
Kieran
fonte
3
Pode-se dizer que esta solução é 'solução jquery suja que não é necessária porque você pode fazer isso facilmente com css'. Mas para ser honesto - às vezes você se encontra em uma situação de trabalho com não-seu-código e simplesmente não tem tempo para conhecer toda a estrutura DOM e folhas de estilo CSS (e tentar entender 'o que o codificador estava pensando'). Então, +1.
lemoid
Concordo com @lemoid, temos que lembrar que soluções "bonitas" nem sempre são práticas na vida real.
UncaAlby
Eu te amo !!
Castiblanco
1

Você deve usar esta propriedade e valor CSS em li:

pointer-events:all;

Portanto, você pode manipular o link com jQuery ou JavaScript, ou usar uma atag, mas todos os outros elementos da tag dentro do lidevem ter a propriedade CSS:

pointer-events:none;
dnvtrn
fonte
0

Basta aplicar o css abaixo:

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

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

aqui é como eu fiz isso

Faça o <a>bloco embutido e remova o preenchimento de seu<li>

Então você pode jogar com o widthe o heightdo <a>no<li>

Comece o widthto 100%e veja como funciona

PS: - Obtenha a ajuda das Ferramentas de desenvolvedor do Chrome ao alterar o heightewidth

hs18
fonte
-1

Você sempre pode envolver toda a tag li com a tag de hiperlink. Aqui está a minha solução:

#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
fonte
Para roubar um comentário de outra resposta
votada abaixo
-2

Coloque o item da lista dentro do hiperlink, em vez do contrário.

Por exemplo, com seu código:

<a href="#"><li>One</li></a>
Spudious
fonte
@DannyBeckett É válido em HTML5.
Tek
@Tek Não, não é .
Danny Beckett
Você está certo, eu estava pensando em elementos de bloqueio permitidos nas âncoras, mas não sabia que crianças ululantes eram uma das exceções à regra. w3.org/html/wg/drafts/html/master/… Obrigado pela correção rápida.
Tek
Oh não, não, não ... sua sintaxe e marcação semântica acabaram de sair da janela. Nunca mais faça isso, meu amigo, isso só torna a web um lugar horrível.
Teodor Sandu