我使用HTML列表和CSS创建了一个水平菜单。一切工作,它应该除了当你悬停在链接。您可以看到,我为链接创建了一个粗体悬浮状态,现在菜单链接因为粗体大小的差异而移动。
我遇到了和这篇SitePoint文章一样的问题。然而,这篇文章并没有合适的解决方案。我到处寻找解决办法,但没有找到。
我肯定不是唯一一个想这么做的人。
有人有什么想法吗?
附注:我不知道菜单项中文本的宽度,所以我不能只设置li项的宽度。
.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: #000;
margin-left: 8px;
margin-right: 5px;
}
.nav li a:hover{
text-decoration: none;
font-weight: bold;
}
.nav li.first { border: none; }
<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>
我可以给你两种建议
第一个选项:是将每个列表项的宽度设置为%
这里有一个简单的例子
<ul>
<li><a href="#">First Item</a></li>
<li><a href="#">Second Item</a></li>
<li><a href="#">Third Item</a></li>
<li><a href="#">Fourth Item</a></li>
</ul>
li {
list-style-type: none;
display: inline-block;
width: 24%;
}
a {
text-decoration: none;
color: #333;
font-size: 1.4em;
background: #A5C77F;
display: block;
padding: 10px 15px;
margin: 10px 0;
border-right: 1px solid whitesmoke;
transition: font-weight .3s;
}
a:hover {
font-weight: bold;
}
第二种选择:在活动元素上使用文本阴影
text-shadow: 0 0 .65px #333, 0 0 .65px #333;
但我建议使用第一个选项,即为每个元素指定一个百分比的宽度,因为文本阴影并不总是在移动浏览器中工作
CSS3解决方案-实验性(假大胆)
想分享一个不同的解决方案,没有人在这里建议。有一个属性叫text-stroke,它会很方便。
P跨度:悬停{
-webkit-text-stroke: 1px黑色;
}
<p>一些东西,< span>hover this,</span> it's cool</p>
在这里,我针对span标签内的文本,我们用黑色像素描边它,这将模拟该特定文本的粗体样式。
注意,这个属性还没有得到广泛的支持,到目前为止(在写这个答案的时候),似乎只有Chrome和Firefox支持这个属性。有关浏览器支持文本笔画的更多信息,可以参考CanIUse。
只是为了分享一些额外的东西,你可以使用-webkit-text-stroke-width: 1px;如果你不打算为你的笔画设置颜色。
这是我喜欢的解决办法。它需要一些JS,但你不需要你的标题属性完全相同,你的CSS可以保持非常简单。
$('ul a').each(function() {
$(this).css({
'padding-left': 0,
'padding-right': 0,
'width': $(this).outerWidth()
});
});
li, a { display: inline-block; }
a {
padding-left: 10px;
padding-right: 10px;
text-align: center; /* optional, smoother */
}
a:hover { font-weight: bold; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul>
<li><a href="#">item 1</a></li>
<li><a href="#">item 2</a></li>
<li><a href="#">item 3</a></li>
</ul>
折衷的解决方案是使用文本阴影来伪装粗体,例如:
文字阴影:0 0 0.01px黑色;
为了更好地进行比较,我创建了以下示例:
a, li {
color: black;
text-decoration: none;
font: 18px sans-serif;
letter-spacing: 0.03em;
}
li {
display: inline-block;
margin-right: 20px;
color: gray;
font-size: 0.7em;
}
.bold-x1 a.hover:hover,
.bold-x1 a:not(.hover) {
text-shadow: 0 0 .01px black;
}
.bold-x2 a.hover:hover,
.bold-x2 a:not(.hover){
text-shadow: 0 0 .01px black, 0 0 .01px black;
}
.bold-x3 a.hover:hover,
.bold-x3 a:not(.hover){
text-shadow: 0 0 .01px black, 0 0 .01px black, 0 0 .01px black;
}
.bold-native a.hover:hover,
.bold-native a:not(.hover){
font-weight: bold;
}
.bold-native li:nth-child(4),
.bold-native li:nth-child(5){
margin-left: -6px;
letter-spacing: 0.01em;
}
<ul class="bold-x1">
<li><a class="hover" href="#">Home</a></li>
<li><a class="hover" href="#">Products</a></li>
<li><a href="#">Contact</a></li>
<li><a href="#">About</a></li>
<li>Bold (text-shadow x1)</li>
</ul>
<ul class="bold-x2">
<li><a class="hover" href="#">Home</a></li>
<li><a class="hover" href="#">Products</a></li>
<li><a href="#">Contact</a></li>
<li><a href="#">About</a></li>
<li>Extra Bold (text-shadow x2)</li>
</ul>
<ul class="bold-native">
<li><a class="hover" href="#">Home</a></li>
<li><a class="hover" href="#">Products</a></li>
<li><a href="#">Contact</a></li>
<li><a href="#">About</a></li>
<li>Bold (native)</li>
</ul>
<ul class="bold-x3">
<li><a class="hover" href="#">Home</a></li>
<li><a class="hover" href="#">Products</a></li>
<li><a href="#">Contact</a></li>
<li><a href="#">About</a></li>
<li>Black (text-shadow x3)</li>
</ul>
传递给文本阴影非常低的模糊半径值将使模糊效果不那么明显。
一般来说,你重复的文字阴影越多,你的文字就会变得越粗壮,但同时也会失去字母的原始形状。
我应该警告你,将模糊半径设置为分数并不会在所有浏览器中呈现相同的效果!例如,Safari需要更大的值来呈现它,就像Chrome一样。
我遇到过和你类似的问题。我想让我的链接变得粗体时,你悬停在他们,但不仅在菜单,而且在文本。正如你可以猜到的,这将是一个真正的苦差事,找出所有不同的宽度。解决方法很简单:
创建一个框,其中包含粗体的链接文本,但颜色像你的背景,但你的真实链接在上面。下面是我个人主页上的一个例子:
CSS:
.hypo { font-weight: bold; color: #FFFFE0; position: static; z-index: 0; }
.hyper { position: absolute; z-index: 1; }
当然,你需要将#FFFFE0替换为页面的背景色。z索引似乎没有必要,但我还是放了它们(因为“hypo”元素将出现在HTML-Code中的“hyper”元素之后)。现在,在你的页面上放一个链接,包括以下内容:
HTML:
You can find foo <a href="http://bar.com" class="hyper">here</a><span class="hypo">here</span>
第二个“这里”将是不可见的,隐藏在你的链接下面。因为这是一个静态的盒子
你的粗体链接文本,你的其余文本不会再移动,因为它已经移动之前,你悬停在链接。
如果不反对使用Javascript,可以在页面显示后设置适当的宽度。以下是我的做法(使用Prototype):
$$('ul.nav li').each(this.setProperWidth);
setProperWidth: function(li)
{
// Prototype's getWidth() includes padding, so we
// have to subtract that when we set the width.
var paddingLeft = li.getStyle('padding-left'),
paddingRight = li.getStyle('padding-right');
// Cut out the 'px' at the end of each padding
paddingLeft = paddingLeft.substring(0,paddingLeft.length-2);
paddingRight = paddingRight.substring(0,paddingRight.length-2);
// Make the li bold, set the width, then unbold it
li.setStyle({ fontWeight: 'bold' });
li.setStyle({ width: (li.getWidth() - paddingLeft - paddingRight) + 'px'});
li.setStyle({ fontWeight: 'normal', textAlign: 'center' });
}