2014-09-26 70 views
0

我試圖使用CSS將第二級添加到下拉菜單。它是一個不可變的 要求,當懸停在菜單複雜 顯示的觸發文本上,並且第一級別(選項>>>,菜單X)看起來不錯,但無論我做什麼 ,我都無法阻止選項級別(選項X等),從頂層顯示 。我需要這些選項來將鼠標懸停在選項>>>上。我沒有包含第二級CSS代碼,因爲我沒有嘗試過所有的東西都已經接近工作,所以我不確定什麼 甚至包括在內。無法獲得CSS/html下拉菜單的第二級工作

<!DOCTYPE html> 
<html lang="en"> 
<head> 

<style type="text/css"> 

.menu { 
    width: 150px; 
    position: relative; 
} 

.menu * { 
    display:block; 
    padding:0; margin:0; 
} 

.menu ul { 
    display:none; 
} 

.menu:hover ul { 
    display:block; 
    position:absolute; 
    width:100%; 
    top:100%; 
    border:solid 1px black; 
    background: white; 
    } 

    .menu li a { 
     font-size: 14px; 
     font-family: arial, sans-serif; 
     font-weight: bold; 
     padding:15px 0px 15px 15px; 
    color: white; 
    background-color: black; 
    text-decoration: none; 
} 

.menu a:hover { 
    background-color: white; 
    color: black; 
} 


</style> 

</head> 

<body> 
<div class='menu'> 
     <span class='triggerclass' style='width:150px'>Trigger</span> 
     <ul> 
      <li><a href="#">Home</a></li> 
      <li><a href='#'>Options &nbsp;&nbsp;&gt;&gt;&gt;</a> 
       <ul> 
        <li><a href="#">Option 1</a></li> 
        <li><a href="#">Option 2</a></li> 
        <li><a href="#">Option 3</a></li> 
       </ul> 
      </li> 
      <li><a href="#">Menu 1</a></li> 
      <li><a href="#">Menu 2</a></li> 
      <li><a href="#">Menu 3</a></li> 
      <li><a href="#">Menu 4</a></li> 
     </ul> 
    </div> 
</body> 
</html> 
+0

我不確定我是否理解你想要的安排或外觀。主頁|選項|菜單1 | 2 | 3 | 4應該是一個水平導航?然後,當懸停在選項>>>上時,子菜單出現在主導航欄下方,並且選項1-3垂直堆疊? – Michael 2014-09-26 19:13:23

+0

這是你要找的嗎? http://jsfiddle.net/bd1eftst/ – hungerstar 2014-09-26 19:23:58

+0

這似乎是正確的從我的解釋@ hungerstar - 你應該讓它成爲一個答案。 – Michael 2014-09-26 20:06:39

回答

1

我相信你正在尋找的是一個彈出菜單。網上有很多教程只用CSS就可以做到這一點。

下面是我在你的問題下面的評論中鏈接到的jsFiddle中添加到你的代碼中的CSS。

CSS

.menu li { 
    position: relative; 
} 
.menu:hover li:hover ul { 
    display: block; 
    position: absolute; 
    left: 150px; 
    top: 0; 
} 

原因您發佈不起作用的代碼是幾個關鍵的原因,而這些都是什麼使一個CSS彈出菜單的工作。

首先,包含子菜單的li應設置爲position: relative,因爲該子菜單將使用position: absolute。這使您可以在使用絕對定位時根據文檔中的li的位置來定位子菜單。

完成此操作後,根據父項li定位子菜單。使用top: 0; left: 0;作爲子菜單時,將其左上角放在父li左上角的左下角。雖然這使子菜單的頂部與父項頂部對齊li它隱藏子菜單。要解決此問題,請將子菜單左移爲父項lileft: 150px的寬度。

其次,當包含菜單的lili:hover ul徘徊在一起時,您需要顯示子菜單。

就是這樣。

如果您不習慣使用CSS position property,這可能有點令人困惑。

希望這會有所幫助!

**編輯**

OP詢問如何包含在子菜單顯示爲僅一個單個子菜單,使得一個子菜單的子菜單(一個或多個)(等)不顯示。很簡單,使用Child Selector

CSS

.menu:hover li:hover > ul 

查看更新jsFiddle

+0

我試圖添加第三層到這個,但它總是顯示,當你把鼠標懸停在其父母的父母,雖然在正確的位置。你將如何修改該CSS的工作? – 2014-09-27 06:54:44

+0

這與我添加的第二個規則是如何構建的,'.menu:hover li:hover ul'。該規則說:「如果你在懸停'.menu'的同時盤旋一個'li',然後顯示任何'ul',這是當前懸停的'li'的兒童/後代。」我們需要使規則更具體,因此它只會顯示「li'懸停的立即後代'ul'。您可以使用大於符號的子選擇器'>'來完成此操作。更新了jsFiddle:http://jsfiddle.net/bd1eftst/1/。 – hungerstar 2014-09-29 13:22:05

0

看到你的代碼或知道什麼是不工作將是非常有益的。預警:這段代碼看起來相當複雜,並且有一些移動部件,但是一旦你有了它,添加新的菜單,子菜單和「超級」子菜單就很簡單了 - 你所要做的就是添加一個無序列表並分配適當的類。真的很容易。複雜的部分是supersubmenu當前正在展示的jQuery記憶功能,並管理人們將鼠標移動到所有位置時發生的情況。

這就是說,嘗試這個想法:顯示每個菜單「部分」中的第一個列表元素,並設置其下的所有其他顯示:無。給他們特定的類,並設置頂部元素的懸停來顯示其他列表元素。如果您需要「第三個」圖層,請創建一個完全隱藏的SEPARATE列表。將一個SEPARATE類添加到將觸發第三層顯示的「子菜單」項中,然後爲第二層的懸停添加一個事件處理程序,以顯示第三層。很難解釋,但這裏有一個例子:

HTML:

<div style="display:table-cell; margin:auto; border:none;" runat="server" id="divMenu"> 
    <ul class="MainMenu"> 
     <li class="MainMenu NoSuperSub">ES</li> 
     <li class="MainMenu SubMenu Link NoSuperSub" data-url="WebPage.aspx" style="display:none;">Go To A Page</li> 
     <li class="MainMenu SubMenu SubWithSub" data-menu="AnotherMenu" style="display:none;">Open Another Menu</li> 
    </ul> 
</div> 


<ul class="MainMenu SuperSubMenu" id="AnotherMenu" style="display:none; margin:auto; border:none;"> 
    <li class="MainMenu SubMenu Link SuperSubMenu" data-url="WebPage.aspx" style="display:none;">Another WebPage</li> 
</ul> 

的Javascript:

//Global Variables 

     var SuperSubMenuName; 
     var CurrentMenu; 
     var TopPosition; 
     var LeftPosition; 
     var ViewingSuperSubMenu = false; 
     var SetTimeOutFunction; 

     //Event Handlers 

     $("li.MainMenu").mouseover(function (e) { 
      $(this).css("display", "inline-block"); 
      $(this).siblings().css("display", "inline-block"); 
     }); 

     $("ul.MainMenu").mouseout(function (e) { 
      $(this).children("li").each(function() { 
       if ($(this).prop("class").toString().indexOf("SubMenu") >= 0) 
        $(this).css("display", "none"); 
      }); 
     }); 

     $(".Link").click(function (e) { 
      $("#PostBackURL").val($(this).data("url")); 
      $("#PostBackValue").val("MenuSelection"); 
      $("#aspnetForm").submit(); 
     }); 

     $("li.SubWithSub").mouseover(function (e) { 
      HideSuperSubMenu(); 
      CurrentMenu = $(this).parent("ul").parent("div"); 
      position = getPosition(this); 
      TopPosition = position.y - 108 ; 
      LeftPosition = position.x + 117; 
      SuperSubMenuName = "#" + $(this).data("menu"); 
      ShowSuperSubMenu(); 
      ViewingSuperSubMenu = false; 
      clearTimeout(SetTimeOutFunction); 
      SetTimeOutFunction = setTimeout(HideSuperSubMenuIfNotViewing, 1000); 
     }); 

     $("ul.SuperSubMenu").mouseover(function (e) { 
      CurrentMenu.children("ul").children("li").each(function() { 
       $(this).css("display", "inline-block"); 
      }); 
      ViewingSuperSubMenu = true; 
     }); 

     $("ul.SuperSubMenu").mouseout(function (e) { 
      CurrentMenu.children("ul").children("li").each(function() { 
       if ($(this).prop("class").toString().indexOf("SubMenu") >= 0) 
        $(this).css("display", "none"); 
      }); 
      ViewingSuperSubMenu = false; 
     }); 

     $("li.NoSuperSub").mouseover(function (e) { 
      HideSuperSubMenu(); 
     }); 

     //Functions 

     function ShowSuperSubMenu(){ 
      $(SuperSubMenuName).css({top: TopPosition, left: LeftPosition, position: "absolute"}); 
      $(SuperSubMenuName).css("display", "table-cell"); 
      $(SuperSubMenuName).children("li").each(function() { 
       $(this).css("display", "inline-block"); 
      }); 
     } 

     function HideSuperSubMenu() { 
      $(SuperSubMenuName).css("display", "none"); 
      $(SuperSubMenuName).children("li").each(function() { 
       $(this).css("display", "none"); 
      }); 
     } 

     function HideSuperSubMenuIfNotViewing() { 
      if (ViewingSuperSubMenu == false) 
       HideSuperSubMenu(); 
     } 

     function getPosition(element) { 
      var xPosition = 0; 
      var yPosition = 0; 

      while (element) { 
       xPosition += (element.offsetLeft - element.scrollLeft + element.clientLeft); 
       yPosition += (element.offsetTop - element.scrollTop + element.clientTop); 
       element = element.offsetParent; 
      } 
      return { x: xPosition, y: yPosition }; 
     } 
+0

雖然很難確定OP究竟是什麼,但這看起來有點極端。 – hungerstar 2014-09-26 19:31:03

+0

這是極端的方法,雖然很難看到OP想要什麼。除此之外,我認爲這也不是最好的做法。絕對沒有理由使用Javascript來處理像下拉菜單一樣簡單的操作。這正是:懸停創建和使用。 – Michael 2014-09-26 20:05:30

+0

如果您只能使用CSS重現此功能,請發佈代碼。 – 2014-09-26 20:50:20