我创建使用HTML列表和CSS水平菜单。一切正常,当你将鼠标悬停在链接应该除外。你看,我创建了一个大胆的悬停状态的链接,现在的菜单链接,因为大胆的大小差异的转变。

我遇到同样的问题作为此SitePoint帖子。但是,文章没有妥善的解决办法。我到处去寻找一个解决方案,并不能找到一个。 当然,我不能是唯一一个试图做到这一点。

有没有人有什么想法?

P.S:我不知道在菜单项文本的宽度,所以我不能只设置里物品的宽度

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

有帮助吗?

解决方案

li {
    display: inline-block;
    font-size: 0;
}
li a {
    display:inline-block;
    text-align:center;
    font: normal 16px Arial;
    text-transform: uppercase;
}
a:hover {
    font-weight:bold;
}
a::after {
    display: block;
    content: attr(title);
    font-weight: bold;
    height: 0;
    overflow: hidden;
    visibility: hidden;
}
<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>

检查的jsfiddle 中的工作示例。 这样做是为了保留空间为加粗(或任何:hover状态样式)中:after伪元素的内容和使用的标题标记作为内容的源。

其他提示

一个折衷的解决方案是假的粗体文字阴影,e.g:

  

文字阴影: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>

传递到text-shadow真低值blur-radius会使模糊效应不那么明显。

在一般的越多,你重复text-shadow胆子文本将获得,但在同一时间丢失的信件原来的形状。

我要提醒你的是,blur-radius设置分数是不会呈现在所有浏览器一样的!的Safari例如需要更大的值,以使其以相同的方式将铬做。

如果您不能设置宽度,那么这意味着宽度会随着文字变得大胆。没有办法避免这种情况,除了通过妥协如修改填充/利润率对于每个状态。

另一个想法是使用letter-spacing

a {
  letter-spacing: 0.05px
}

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

在jquery的行:

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

编辑: 虽然这能够带来解决方案,应该提到的是它不结合在原岗位的代码工作。 “显示:内联”必须与浮动参数的宽度设定替换是有效的,作为旨在水平菜单工作

您可以使用像服用点

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

,然后在你的CSS刚才设置的跨度内容大胆,能见度隐藏:隐藏的,所以,它保持它的尺寸。然后可以调整以下元素中的边缘,以使其适合正常。

我不知道,如果这种做法是搜索引擎友好,虽然。

我只解决了这个问题与“阴影”的解决方案。 它似乎是最简单和有效的。

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

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

CSS3解决方案 - 实验

(假魄力)

以为共享不同的解决方案,没有人建议在这里。有一个叫text-stroke属性,它就会得心应手了这一点。

p span:hover {
  -webkit-text-stroke: 1px black;
}
<p>Some stuff, <span>hover this,</span> it's cool</p>

在这里,我与span将模拟black风格为特定的文本针对bold标签,我们中风它的内文由像素。

请注意,这家酒店没有得到广泛的支持,截至目前(在写这个答案),只有Chrome和Firefox似乎支持这一点。有关为text-stroke浏览器支持的更多信息,可以参考 CanIUse


只是分享一些额外的东西,你可以使用-webkit-text-stroke-width: 1px;如果你是不是设置color为您的行程。

我不得不类似你的问题。我希望我的链接获得大胆的,当你将鼠标悬停在他们,但不仅在菜单中,而且在文本中。正如你猜岑这将是一个真正的苦差事找出所有不同的宽度。该解决方案是很简单:

创建一个包含链接文本加粗,但有色喜欢你的背景,但它上面你真正的链接框。下面是我的第一个例子:

CSS:

.hypo { font-weight: bold; color: #FFFFE0; position: static; z-index: 0; }
.hyper { position: absolute; z-index: 1; }

当然,你需要通过你的网页的背景颜色更换#FFFFE0。在Z-指数似乎没有必要,但我把它们(就像在“低”元素在HTML的代码的“超”元素之后会出现)。现在,为了把一个链接页面上,包括以下内容:

HTML:

You can find foo <a href="http://bar.com" class="hyper">here</a><span class="hypo">here</span>

第二个“此处”将是无形的,下面隐藏着你的链接。由于这是一个静态的盒子 以粗体显示你的链接文本,文本的其余部分将不下去了Shift键将光标悬停在链接之前它已经移位。

希望我能帮助:)

只要

我会建议针对上悬停切换字体(°)。在这种情况下,只是动了一下菜单项,但我在哪里见过完整的段落被重新格式化,因为扩大会导致额外的自动换行的情况。你不希望看到当你做的唯一事情是移动光标这种情况发生;如果你没有做任何事情的页面布局不应该改变。

正常和斜体之间切换时的移位也可以发生。我会尝试改变颜色,或者如果你有下面的文字房间切换底线。 (下划线应避开从底部边界)

我想,如果我使用的字体切换为我的表单设计类中boo'd: - )

(°)字字体常常被误用。 “宋体” 是字体, “宋体正常” 和 “宋体粗体” 是不同的相同字体的字体

您可以通过 “保证金” 性质的工作:

li a {
  margin: 0px 5px 0px 5px;
}

li a:hover {
  margin: 0;
  font-weight: bold;
}

只要确保左,右页边距是足够大的,因此多余的空间可以包含粗体文字。对于长的话,你可以选择不同的利润率。 这只是另一种解决方法,但做的工作对我来说。

我喜欢用文字阴影来代替。尤其是因为您可以使用转换动画文字阴影。

您真正需要的是:

a {
  transition: text-shadow 1s;
}
a:hover {
  text-shadow: 1px 0 black;
}

有关完整的导航看看这个的jsfiddle: https://jsfiddle.net/831r3yrb/

浏览器的支持和对文字阴影的详细信息: http://www.w3schools.com/cssref/css3_pr_text-shadow.asp

这是我更喜欢的解决方案。这需要一点JS,但你不需要你的title属性是完全一样的,你的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>

这个是什么?一个JavaScript - CSS3自由溶液

http://jsfiddle.net/u1aks77x/1/

ul{}
li{float:left; list-style-type:none; }
a{position:relative; padding-right: 10px; text-decoration:none;}
a > .l1{}
a:hover > .l1{visibility:hidden;}
a:hover > .l2{display:inline;}
a > .l2{position: absolute; left:0; font-weight:bold; display:none;}

<ul>
  <li><a href="/" title="Home"><span class="l1">Home</span><span class="l2">Home</span></a></li>
  <li><a href="/" title="Contact"><span class="l1">Contact</span><span class="l2">Contact</span></a></li>
  <li><a href="/" title="Sitemap"><span class="l1">Sitemap</span><span class="l2">Sitemap</span></a></li>
</ul>

不是很完美的解决方案,但 “作品”:

a
{
    color: #fff;
}

a:hover
{
    text-shadow: -1px 0 #fff, 0 1px #fff, 1px 0 #fff, 0 -1px #fff;
}

我已经合并了一堆的技术之上,提供的东西,不完全吸用JS关闭,甚至更好一点的jQuery。现在,浏览器的子像素字母间距正在改善的支持,这是非常好的使用它。

jQuery(document).ready(function($) {
  $('.nav a').each(function(){
      $(this).clone().addClass('hoverclone').fadeTo(0,0).insertAfter($(this));
    var regular = $(this);
    var hoverclone = $(this).next('.hoverclone');
    regular.parent().not('.current_page_item').hover(function(){
      regular.filter(':not(:animated)').fadeTo(200,0);
      hoverclone.fadeTo(150,1);
    }, function(){
      regular.fadeTo(150,1);
      hoverclone.filter(':not(:animated)').fadeTo(250,0);
    });
  });
});
ul {
  font:normal 20px Arial;
  text-align: center;
}
li, a {
  display:inline-block;
  text-align:center;
}
a {
  padding:4px 8px;
  text-decoration:none;
  color: #555;
}

.nav a {
  letter-spacing: 0.53px; /* adjust this value per font */
}
.nav .current_page_item a,
.nav a:hover {
  font-weight: bold;
  letter-spacing: 0px;
}
.nav li {
  position: relative;
}
.nav a.hoverclone {
  position: absolute;
  top:0;
  left: 0;
  white-space: nowrap;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul class="nav">
  <li><a href="#">Item 1</a></li>
  <li><a href="#">Item 2</a></li>
  <li class="current_page_item"><a  href="#">Item 3</a></li>
  <li><a href="#">Item 4</a></li>
  <li><a href="#">Item 5</a></li>
</ul>

ul {
  list-style-marker: none;
  padding: 0;
}

li {
  display: inline-block;
}

li + li {
  margin-left: 1em;
}

a {
  display: block;
  position: relative;
  text-align: center;
}

a:before, a:after {
  content: attr(aria-label);
  text-decoration: inherit;
}

a:before {
  font-weight: bold;
  visibility: hidden;
}

a:after {
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
}

a:hover:before {
  visibility: visible;
}

a:hover:after {
  display: none;
}
<ul>
  <li>
    <a href="" aria-label="Long-long-long"></a>
  </li><li>
    <a href="" aria-label="or"></a>
  </li><li>
    <a href="" aria-label="Short"></a>
  </li><li>
    <a href="" aria-label="Links"></a>
  </li><li>
    <a href="" aria-label="Here"></a>
  </li>
</ul>

我用文字阴影溶液与一些其他这里提到:

text-shadow: 0 0 0.01px;

不同的是,我不指定阴影颜色,所以该解决方案是普遍用于所有颜色的字体。

另一种方法将是“模拟”经由文字阴影粗体文本。这有奖金(/苹果,根据您的情况),也去努力字体图标。

   nav li a:hover {
      text-decoration: none;
      text-shadow: 0 0 1px; /* "bold" */
   }

有点儿哈克,但它可以节省你复制文本(如果它是很多,这是有用的,因为它是在我的情况)。

这是更好地使用 A ::之前代替 ::后是这样的:

.breadcrumb {
  margin: 0;
  padding: 0;
  list-style: none;
  overflow: hidden;
}

.breadcrumb li, 
.breadcrumb li a {
  display: inline-block;
}

.breadcrumb li:not(:last-child)::after {
  content: '>'; /* or anything else */
  display: inline-block;
}

.breadcrumb a:hover {
  font-weight: bold;
}

.breadcrumb a::before {
  display: block;
  content: attr(data-label);
  font-weight: bold;
  height: 0;
  overflow: hidden;
  visibility: hidden;
}
<ul class="breadcrumb">
  <li><a data-label="one" href="https://www.google.fr/" target="_blank">one</a></li>
  <li><a data-label="two" href="https://duckduckgo.com/" target="_blank">two</a></li>
  <li><a data-label="three" href="#">three</a></li>
</ul>

详情: https://jsfiddle.net/r25foavy/

如果你不反对使用Javascript,您可以设置适当的宽度一旦所示的页面。以下是我做了(使用原型):

$$('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' });
}

我真当有人告诉你不要做的那样,当有一个简单的解决问题的办法不能忍受。我不知道李的元素,但我只是固定了同样的问题。我有由div标签的菜单。

只需设置div标签为“显示:直列块”。内嵌让他们坐在旁边,彼此块,你可以设置宽度。只是设置宽度足够宽,以容纳用于粗体文本,并具有文本中心对齐。

(注意:这似乎是剥离出我的HTML [下面],但每个菜单项有一个div标签包裹着它与corrasponding ID和类名SearchBar_Cateogory即:<div id="ROS_SearchSermons" class="SearchBar_Category">

HTML (我已经锚标签缠每个菜单项,但我没能提交它们作为一个新的用户)

<div id="ROS_SearchSermons" class="SearchBar_Cateogry bold">Sermons</div>|
<div id="ROS_SearchIllustrations" class="SearchBar_Cateogry">Illustrations</div>|
<div id="ROS_SearchVideos" class="SearchBar_Cateogry">Videos</div>|
<div id="ROS_SearchPowerPoints" class="SearchBar_Cateogry">PowerPoints</div>|
<div id="ROS_SearchScripture" class="SearchBar_Cateogry">Scripture</div>|

CSS:

#ROS_SearchSermons { width: 75px; }
#ROS_SearchIllustrations { width: 90px; }
#ROS_SearchVideos { width: 55px; }
#ROS_SearchPowerPoints { width: 90px; }
#ROS_SearchScripture { width: 70px; }

.SearchBar_Cateogry
{
    display: inline-block;
    text-align:center;
}

尝试:

.nav {
  font-family: monospace;
}

您可以尝试切缘阴性太多,如果大胆的文字比普通宽。 (不总是) 这样的想法是使用类,而不是样式的:悬停状态

jQuery的:

 $(".nav-main .navbar-collapse > ul > li > a").hover(function() {
    var originalWidth = $(this).outerWidth();

    $(this).parent().addClass("hover");
    $(this).css({
       "margin-left": -(($(this).outerWidth() - originalWidth) / 2),
       "margin-right": -(($(this).outerWidth() - originalWidth) / 2)
    });
 },
 function() {
    $(this).removeAttr("style");
    $(this).parent().removeClass("hover");
 });

CSS:

ul > li > a {
    font-style: normal;
}

ul > li > a.hover {
    font-style: bold;
}

我希望我能帮助!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top