2010-03-04 78 views
1

我試圖創建一個兩級水平導航菜單(或菜單欄),當您將鼠標懸停在父菜單項上時,顯示子菜單項。如果選擇了其中一個子項目,則父項目具有可視指示符,即當前頁面對應於其子項目之一,並且其子項目保持顯示。CSS如何隱藏當父母的兄弟項目沒有javascript懸停當前的子菜單項

CHILD2是當前頁面:

parent1 *parent2* parent3 
      | 
    child1 *child2* child3 

當我將鼠標懸停在parent1或parent3,按需要顯示自己的孩子。我的挑戰是,當其他父母的孩子被展示時,我無法弄清楚如何隱藏父母2的孩子。有沒有一種CSS方式來實現這一點?我知道我可以使用jquery隱藏parent2的孩子,當將鼠標移出parent2和parent2的孩子時,但我寧願不必爲了最大的可用性而使用javascript。

這裏一住就是example

CSS:

ul.AspNet-Menu 
{ 
    position: relative; 
} 

ul.AspNet-Menu, 
ul.AspNet-Menu ul 
{ 
    margin: 0; 
    padding: 0; 
    display: block; 
} 

ul.AspNet-Menu li 
{ 
    position: static; 
    list-style: none; 
    float: left; 
} 

ul.AspNet-Menu li a, 
ul.AspNet-Menu li span 
{ 
    display: block; 
    text-decoration: none; 
} 
ul.AspNet-Menu ul 
{ 
    visibility: hidden; 
    position: absolute; 
} 

ul.AspNet-Menu li:hover ul ul, 
ul.AspNet-Menu li.AspNet-Menu-Hover ul ul 
{ 
    visibility: hidden; 
} 

ul.AspNet-Menu li:hover ul, 
ul.AspNet-Menu li li:hover ul, 
ul.AspNet-Menu li li li:hover ul, 
ul.AspNet-Menu li.AspNet-Menu-Hover ul, 
ul.AspNet-Menu li li.AspNet-Menu-Hover ul, 
ul.AspNet-Menu li li li.AspNet-Menu-Hover ul 
{ 
    visibility: visible; 
} 

.main-nav2 .AspNet-Menu-Horizontal{ 
    margin: 0; 
    padding: 0; 
    font: bold 13px/16px Arial, sans-serif; 
    position: absolute; 
    top: 21px; 
    left: 290px; 
} 

.main-nav2 ul.AspNet-Menu li { 
    display: inline; 
} 

.main-nav2 ul.AspNet-Menu li a, 
.main-nav2 ul.AspNet-Menu li span.AspNet-Menu-NonLink { 
    color: #fff; 
    background: url(../../nav-bg.gif) no-repeat 0 -24px; 
    height: 24px; 
    text-decoration: none; 
    margin: 0 1px 0 0; 
} 

.main-nav2 ul.AspNet-Menu li a span, 
.main-nav2 ul.AspNet-Menu li span.AspNet-Menu-NonLink span { 
    background: url(../../nav-bg-right.gif) no-repeat 100% -24px; 
    padding: 4px 12px 4px 12px; 
    cursor: pointer; 
} 

.main-nav2 ul.AspNet-Menu li a:hover, 
.main-nav2 ul.AspNet-Menu li a.active { 
    background-position: 0 0; 
    color: #1b8db3; 
} 

.main-nav2 ul.AspNet-Menu li a:hover span, 
.main-nav2 ul.AspNet-Menu li a.active span { 
    background-position: 100% 0; 
} 

.main-nav2 ul.AspNet-Menu li.AspNet-Menu-Selected a, 
.main-nav2 ul.AspNet-Menu li.AspNet-Menu-ChildSelected a 
{ 
    background-position: 0 0; 
    color: #1b8db3; 
} 

.main-nav2 ul.AspNet-Menu li.AspNet-Menu-Selected a span, 
.main-nav2 ul.AspNet-Menu li.AspNet-Menu-ChildSelected a span 
{ 
    background-position: 100% 0; 
} 

.main-nav2 ul.AspNet-Menu li.AspNet-Menu-ChildSelected ul 
{ 
    visibility: visible; 
} 

.main-nav2 ul.AspNet-Menu ul{ 
    width:500px; 
} 

.main-nav2 ul.AspNet-Menu ul li { 
    font: 12px/20px Arial, sans-serif; 
    padding: 0 5px 0 0; 
    display: inline; 
} 

.main-nav2 ul.AspNet-Menu ul li a { 
    text-decoration: none; 
    color: #1b8db3; 
    padding: 0 0 0 12px; 
    background-image:none; 
} 

.main-nav2 ul.AspNet-Menu ul li a:hover { 
    text-decoration: underline; 
} 

HTML:

<div class="main-nav2" id="ctl00_MainMenu"> 
    <div class="AspNet-Menu-Horizontal"> 
     <ul class="AspNet-Menu"> 
     <li class="AspNet-Menu-Item"> 
      <a href="javascript:return false;#1"> 
      <span> A Menu Option</span></a> 
      <ul> 
      <li class="AspNet-Menu-Item"> 
       <a href="/CSSMenu/A1.aspx"> 
       A1 SubMenu Option</a> 
      </li> 
      <li class="AspNet-Menu-Item"> 
       <a href="/CSSMenu/A2.aspx"> 
       A2 SubMenu Option</a> 
      </li> 
      </ul> 
     </li> 
     <li class="AspNet-Menu-Item"> 
      <a href="javascript:return false;"> 
      <span> B Menu Option</span></a> 
      <ul> 
      <li class="AspNet-Menu-Item"> 
       <a href="/CSSMenu/B1.aspx"> 
       B1 SubMenu Option</a> 
      </li> 
      <li class="AspNet-Menu-Item"> 
       <a href="/CSSMenu/B2.aspx"> 
       B2 SubMenu Option</a> 
      </li> 
      </ul> 
     </li> 
     <li class=" AspNet-Menu-Selected"> 
      <a href="/CSSMenu/C.aspx"> 
      <span> C Menu Option</span></a> 
     </li> 
     </ul> 
    </div> 
</div> 

提前許多感謝任何提示或幫助!

特里

回答

2

簡單的解決方案是儘可能降低質量。在這種情況下,我會在子菜單上設置一個背景顏色,並且只懸停z-index,所以bg會覆蓋其他子菜單 - 它們仍然可見,但文本不會重疊。然後使用JavaScript來製作它,就像你真正想要的一樣。

更復雜的解決方案意味着您必須讓所有子菜單佔用相同的空間 - 一種方法是使用負邊距,然後使用填充來覆蓋該空間 - 並讓顯示的任何子菜單覆蓋打開一,再次通過更大的z-index(應用於懸停的父項)。

編輯我用所有的時間來處理這種情況的另一件事是做類似下面

ul:hover ul { display:none; } //or in your case, set to invisible 
ul li:hover ul { display:block; } //in your case, set to visible 

這意味着子菜單會消失,當UL是在徘徊,並且因爲li:懸停在級聯中較低,更具體(我通常必須處理很多本州名稱 - 不認爲你會這麼做),應該允許子菜單重新出現。它不像你想要的那麼細緻,但幾乎沒有。

+0

選項二和三這裏是我會用,他們工作很好。 – 2010-03-05 00:19:19

+0

DN,這些建議讓我非常接近,非常感謝! – tblank 2010-03-05 15:51:12

0

如果你想要的是,當用戶點擊的child2選擇的反應產生具有的child2頁面顯示,但是當用戶將鼠標懸停在parent1或parent3的child2應該消失,那麼你就需要使用JavaScript。原因在於它是以不同方式影響DOM中多個節點的事件。 CSS僅以相同的方式影響DOM中的1+個節點,並且通常僅在頁面加載時。僞類是個例外,例如:懸停,可能會在頁面加載後影響顯示。

如果您需要CSS多菜單解決方案,或者只是想看看一個可以幫助您找到答案的好方法,請查看this GRC CSS。我從中學到了很多東西,並且把它變成了我無數次使用的解決方案。

0

在css中沒有pseudo類觸發mouse out等效事件。你必須使用JavaScript來完成你正在做的事情。有很多菜單/插件可以完全做你正在做的事情(我的意思是沒有必要重新發明輪子)。

0

我很積極,你將無法完全通過CSS完成這種細粒度的控制。你需要用JS改變DOM元素的狀態。

0

它可能沒有JavaScript。在這個頁面查看答案。

Horizontal CSS subnav issues!

給予較高的z-index兄弟姐妹子項和更少的z-index到活動菜單的子項。