問題描述

我使用 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇