如何在导航栏中使列表项的整个区域都可单击(作为链接)?


95

我有一个由无序列表制成的水平导航栏,每个列表项都有很多填充,使其看起来很漂亮,但是唯一可以用作链接的区域是文本本身。如何使用户能够单击列表项中的任意位置以激活链接?

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

Answers:


109

不要在'li'项目中添加填充。而是将锚标记设置为display:inline-block;并对其应用填充。


display: inline; zoom: 1;IE6和IE7的条件注释中的内容将替换为display: inline-block;是,但如果列表项已经浮动,display: block;也将没问题
FelipeAls 2010年

这仅能很好地解决一个投诉,但似乎不适用于:after选择器。我希望>在链接文本后出现一个符号,但不要将其放在内容中……我最终只是将其放在内容中。如果有更好的方法可以做到这一点,会感到好奇。
counterbeing

46

将锚标记css属性定义为:

{display:block}

然后锚点将占据整个列表区域,因此单击将在列表旁边的空白区域中进行。


1
希望我可以将此答案拖到答案列表的顶部...这是解决此问题的最佳方法!!!
利沙伯

1
如果li图标中有其他内容,则将折行。
Gringo Suave

13

使锚标签包含填充而不是li。这样,它将占据所有区域。


3
我还建议将悬停状态从li移到锚点,以更好地支持浏览器。
NinjaBomb

10

超级,超级晚了,但是无论如何:您还可以将锚定为弹性项目。这对于动态调整大小/排列的列表项特别有用。

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

(注意:仍无法很好地支持flexboxs。自动前缀修复即可!)


但是现在(几年后),flex运行良好,因此,我认为在使用uland flexbox 构建菜单时,这是最佳答案。
Ludovic Kuty

10

使用以下内容:

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

6

或者您可以使用jQuery:

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

3
可以说这种解决方案是“不需要脏的jquery解决方案,因为您可以使用CSS轻松地做到这一点”。但老实说-有时您会遇到无法使用您的代码的情况,并且根本没有时间了解所有DOM结构和CSS样式表(并试图理解“编码人员的想法”)。所以+1。
lemoid

同意@lemoid,我们必须记住“漂亮”的解决方案在现实生活中并不总是可行的。
UncaAlby

我真的爱你!!
Castiblanco

1

您应该在您的中使用此CSS属性和值li

pointer-events:all;

因此,您可以使用jQuery或JavaScript处理链接,也可以使用a标签,但是内的所有其他标签元素li都应具有CSS属性:

pointer-events:none;

0

只需简单地应用以下css:

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

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

0

这是我做的

制作<a>内联块并从其中删除填充<li>

然后,你可以用玩widthheight<a><li>

width100%作为开始,看看它是如何工作的

PS:-更改height和时,请获取Chrome开发者工具的帮助width


-1

您始终可以将整个标签li与hiperlink标签包装在一起,这是我的解决方案:

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


要从另一个不满意的答案中窃取评论:“这
可行

-2

将列表项放在超链接中,而不是反过来。

例如,您的代码:

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

@DannyBeckett在HTML5中有效。
Tek


没错,我在考虑锚点中允许使用的块元素,但我不知道ul子项是该规则的例外之一。w3.org/html/wg/drafts/html/master / ... 感谢您的迅速纠正。
Tek

哦,不,不,不。。。您的语法和语义标记刚刚出局。我的朋友,再也不要这样做,这只会使网络成为一个可怕的地方。
Teodor Sandu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.