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.