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>

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.


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.


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.


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!)


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

6

Ou você pode usar jQuery:

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

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;

0

Basta aplicar o css abaixo:

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

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

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


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


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>

@DannyBeckett É válido em HTML5.
Tek


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.