问题描述

我使用 HTML 列表和 CSS 创建了一个水平菜单。一切都可以正常工作,除非你将鼠标悬停在链接上。你看,我创建了一个大胆的悬停状态的链接,现在的菜单链接转移,因为大胆的大小差异。

我遇到与 this SitePoint post 相同的问题。但是,该帖子没有正确的解决方案。我搜索到任何地方的解决方案,找不到一个解决方案。当然我不会是唯一一个试图做到这一点的人。

有人有什么想法吗?

P.S:我不知道菜单项中文本的宽度,所以我不能只是设置 li 项的宽度。

这是我的代码:

HTML:

<ul class="nav">
    <li class="first"><a href="#">item 0</a></li>
    <li><a href="#">item 1</a></li>
    <li><a href="#">item 2</a></li>
    <li><a href="#">item 3</a></li>
    <li><a href="#">item 4</a></li>
</ul>

CSS:

.nav { margin: 0; padding: 0; }
.nav li { 
    list-style: none; 
    display: inline; 
    border-left: #ffffff 1px solid; 
}
.nav li a:link, .nav li a:visited { 
    text-decoration: none; 
    color: #ffffff; 
    margin-left: 8px; 
    margin-right: 5px; 
}
.nav li a:hover{ 
    text-decoration: none; 
    font-weight: bold; 
}
.nav li.first { border: none; }

最佳解决方案

检查 JSfiddle 上的工作示例。这个想法是在:after 伪元素中保留粗体 (或任何:hover 状态样式) 的空间,并使用标题标签作为内容的来源。

CSS:

li, a {
    display:inline-block;
    text-align:center;
}
a:hover {
    font-weight:bold;
}
a::after {
    display:block;
    content:attr(title);
    font-weight:bold;
    height:1px;
    color:transparent;
    overflow:hidden;
    visibility:hidden;
    margin-bottom:-1px;
}

HTML:

<ul>
    <li><a href="#" title="height">height</a></li>
    <li><a href="#" title="icon">icon</a></li>
    <li><a href="#" title="left">left</a></li>
    <li><a href="#" title="letter-spacing">letter-spacing</a></li>
    <li><a href="#" title="line-height">line-height</a></li>
</ul>

次佳解决方案

如果您无法设置宽度,那么这意味着宽度将随着文本的粗体而改变。没有办法避免这种情况,除了修改每个状态的填充/边距等折中。

第三种解决方案

一个妥协的解决方案是用 text-shadow 伪装,例如:

a:hover{
  text-shadow:0 0 1px black, 0 0 1px black, 0 0 1px black
}

重复 3 次阴影使它看起来没有那么多。

第四种方案

jquery 中的一行:

$('ul.nav li a').each(function(){
    $(this).parent().width($(this).width() + 4);
});

编辑:虽然这可以带来解决方案,但应该提到它不能与原始帖子中的代码一起使用。 “display:inline” 必须用浮动参数替换为宽度设置才能有效,并且水平菜单可以按预期工作。

第五种方案

你可以使用一些喜欢的东西

<ul>
   <li><a href="#">Some text<span><br />Some text</span></a></li>
</ul>

然后在您的 CSS 中,只需将 span 的内容设置为粗体,并将其隐藏,并显示为隐藏,以保持其维度。然后,您可以调整以下元素的边距,使其适合。

我不知道这个方法是否 SEO 友善。

第六种方案

另一个想法是使用 letter-spacing

a {
  letter-spacing: 0.05px
}

a:hover, a:focus {
  font-weight: bold;
  letter-spacing: 0
}

第七种方案

我刚刚解决了”shadow” 解决方案的问题。这似乎是最简单有效的。

nav.mainMenu ul li > a:hover, nav.mainMenu ul li.active > a {
    text-shadow:0 0 1px white;
}

没有必要重复三次阴影 (结果对我来说是一样的) 。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛