虽然为我的网站创建了导航栏,但我决定将活动页面选项卡以粗体显示以用于可用性目的,但是当我更改元素上的font-weight
时,它只会略微使元素更宽,例如我使用悬停效果代替演示我的问题,我从来都不知道解决它的方法..
HTML
<ul id="mainNav">
<li class="navItem">
<a class="navLink" id="activeLink">Link 1</a>
</li>
<li class="navItem">
<a class="navLink">Link 2</a>
</li>
<li class="navItem">
<a class="navLink">Link 3</a>
</li>
</ul>
CSS
* {
font-family: Arial;
font-size: 14px;
list-style: none;
margin: 0;
padding: 0;
text-decoration: none;
}
#mainNav {
background: RGB(200, 230, 240);
border-bottom: 1px solid RGB(0, 0, 0);
height: 30px;
margin: 0 auto;
position: relative;
width: 100%;
}
.navItem {
display: block;
float: left;
position: relative;
}
.navItem:last-child .navLink {
border-right: 1px solid RGB(0, 0, 0);
}
.navLink {
border-bottom: 1px solid RGB(0, 0, 0);
border-left: 1px solid RGB(0, 0, 0);
display: inline-block;
height: 30px;
line-height: 30px;
padding: 0 15px;
white-space: nowrap;
}
.navItem:hover .navLink {
background: RGB(120, 200, 250);
color: RGB(255, 255, 255);
cursor: pointer;
font-weight: bold;
}
#activeLink {
background: RGB(90, 170, 220);
color: RGB(255, 255, 255);
font-weight: bold;
}
#activeLink:hover {
background: RGB(110, 190, 240);
}
.navItem:hover .subNav {
display: block;
}
答案 0 :(得分:15)
除了width
路线之外,还有其他两种可能性,这取决于您是否认为它们是否合适。这两个想法都在同一个原理上工作,你使用一个单独的元素来显示粗体状态,而这个元素要么不是(想法一),要么(想法二)会影响带有维度的UI。
使用伪选择器。这种方法依赖于支持最新进展的浏览器,即:before
和content: attr()
,所以可能还不可靠。
<强>的CSS:强>
ul {
list-style: none;
}
ul li {
float: left;
}
ul li:hover a {
visibility: hidden;
}
ul li:hover:before {
position: absolute;
font-weight: bold;
content: attr('data-text');
}
<强>标记强>:
<ul>
<li data-text="one"><a href="#">one</a></li>
<li data-text="two"><a href="#">two</a></li>
<li data-text="three"><a href="#">three</a></li>
</ul>
另一个更直接,虽然它依赖于首先预先设置你的标记 - 而那些使用屏幕阅读器的人可能会不喜欢你的网站;除非你能找到一种很好的方法来隐藏它们的重复文本。
<强>标记:强>
<ul>
<li><a href="#">
<span class="a">one</span>
<span class="b">one</span>
</a></li>
<li><a href="#">
<span class="a">two</span>
<span class="b">two</span>
</a></li>
<li><a href="#">
<span class="a">three</span>
<span class="b">three</span>
</a></li>
</ul>
<强>的CSS:强>
ul {
margin: 0; padding: 0;
list-style: none;
}
ul li {
float: left;
}
ul li a span.b {
visibility: hidden;
font-weight: bold;
}
ul li a span.a {
position: absolute;
}
ul li:hover a span.b {
visibility: visible;
}
ul li:hover a span.a {
visibility: hidden;
}
在一天结束时,更好的解决方案是:
答案 1 :(得分:7)
我处理这个问题的方法是使用JQuery来“修复”宽度,这样即使粗体确实改变,它也不会在悬停时发生变化。这基本上采用了css宽度答案,并使过程自动化。
(function($) {
$(function() {
$('#menu > li').each(function(){
wid = $(this).width();
$(this).css('width', wid+'px');
});
});
})(jQuery);
答案 2 :(得分:3)
由于您没有为元素指定任何宽度,因此会根据其内容调整大小。因此,当font-weight
为normal
时,元素占用的空间少于bold
时的空间。随着内容更改大小,框的大小也会发生变化。
您可以指定元素的宽度,使其略大于其内容,或者使用其他方法识别当前活动的标签。
答案 3 :(得分:3)
有趣的是没有人提到letter-spacing
。
可以在普通字体中添加字母间距,并将其删除为粗体版本。
正确行事并非总是可行,并且很大程度上取决于字体和font-size
。但随着越来越多的浏览器开始接受字母间距的子像素值,它开始变得更加实用。
示例:
.nav-link.active {
font-weight: bold;
/* Adjust for font-weight bold so that the text will still align */
letter-spacing: -1px;
}
答案 4 :(得分:2)
font-weight
用于加粗文字的替代方法是使用text-shadow
将水平阴影设置为与文本相同的颜色。此代码设置左右相等的阴影。只有一个阴影,文本看起来会在阴影方向上移动。
<强> CSS:强>
a:hover {
text-shadow: .25px 0px .1px,
-.25px 0px .1px;
}
请注意,Web浏览器不会以相同的方式呈现文本,更不用说text-shadow
效果了。在决定值之前,您需要检查它们在多个浏览器中的外观。
答案 5 :(得分:0)
如果将width属性放在.navItem类中,则在悬停时不会更改宽度。
.navItem {
display: block;
float: left;
position: relative;
**width:70px;** // this
}
我已经把小提琴弄得一团糟了。请检查。
答案 6 :(得分:0)
我认为没有基于CSS的解决方案,除非您可以为每个li项添加宽度,可能是不同的宽度。 您已经在悬停和选定状态下更改了bg颜色,我建议您删除字体粗细更改。在视觉上它不是一个很大的改变,就可用性而言,你已经有了我认为足够的bg颜色变化。
答案 7 :(得分:0)
答案 8 :(得分:0)
我在这里是如何做到的:
<ul id="header_menu">
<?php
$menu_items = array(array("Home", "/"),
array("About", "/about.html"),
array("Consumer Info", "consumer-info.html"),
array("News & Events", "news-events.html"),
array("Contact", "contact.html")
);
foreach($menu_items as $value)
{
// Find box width of text and add padding
$padding = 10;
$font-size = 12; // pt
list($left,, $right) = imageftbbox($font-size, 0, "fonts/OpenSans-Bold.ttf", $value[0]);
$width = ($right - $left) + ($padding * 2);
echo "<li><a style=\"width:" . ($width) . "px;\" href=\"" . $value[1] . "\">" . $value[0] . "</a></li>";
}
?>
</ul>