2012-08-07 179 views
0

我正在爲學校Intranet網站編寫一個下拉菜單,並且我創建了一個相當奇怪的問題。子菜單從所選菜單y位置偏移36px。 enter image description here下拉菜單問題

下面的代碼的摘錄(請原諒質量:d)

<html> 
<head> 
    <style> 
    #navagationBar { 
     margin: 0; 
     padding: 0; 
     z-index: 30; 
    } 

    #navagationBar li {  
     list-style: none; 
     float: left; 
     font: bold 12px 'Arial'; 
     margin-left: 10px; 
     width: 96px; 
    } 

    #navagationBar li a { 
     display: block; 
     margin: 0 1px 0 0; 
     padding: 4px 10px; 
     width: 136px; 
     color: #FFFFFF; 
     text-align: center; 
     text-decoration: none; 
    } 

    #navagationBar li a:hover {  
     background: #796952; 
    } 

    #navagationBar div { 
     position: absolute; 
     visibility: hidden; 
     background: transparent; 
    } 

    #navagationBar div a { 
     position: relative; 
     display: block; 
     padding: 5px 10px; 
     width: 136px; 
     white-space: nowrap; 
     text-align: left; 
     text-decoration: none; 
     background: #796952; 
     color: #FFF; 
     font: 9px "Arial"; 
    } 

    #navagationBar div a:hover { 
     background: #969696; 
     color: #FFF; 
    } 

    #navagationBar a { 
     color: #FFF; 
    } 

    div.navagation { 
     background: #2d221c; 

     height: 28px; 
    } 

    div.sub { 
     left: 156px; 
    } 
    </style> 
    <!-- BG COLOR: #2d221c 
     FORERGROUND: #3c3429 
     HOVER: #796952 
     --> 
    <script>  
      var menuItem = 0; 
      var subItem = 0; 

      var timeLimit = 250; 
      var closeTimer = 0; 
      var closeSubTimer = 0; 


      // open menu 
      function openMenu(id) { 
       stopTimer(); 

       // If a layer is already open close it 
       if (menuItem) { 
        menuItem.style.visibility = 'hidden'; 
       } 

       // Then set the one clicked on by the user to be shown 
       menuItem = document.getElementById(id); 
       menuItem.style.visibility = 'visible'; 
      } 

      function openSub(id) { 
       stopSubTimer(); 

       // If a layer is already open close it 
       if (subItem) { 
        subItem.style.visibility = 'hidden'; 
       } 

       subItem = document.getElementById(id); 
       subItem.style.visibility = 'visible'; 
      } 

      function close() { 
       if (menuItem) { 
        menuItem.style.visibility = 'hidden'; 
       } 
      } 

      function closeSub() { 
       if (subItem) { 
        subItem.style.visibility = 'hidden'; 
       } 
      } 

      function startTimer() { 
       closeTimer = window.setTimeout(close, timeLimit); 
      } 

      function startSubTimer() { 
       closeSubTimer = window.setTimeout(closeSub, timeLimit); 
      } 

      // Stop timing 
      function stopTimer() { 
       if (closeTimer) { 
        window.clearTimeout(closeTimer); 
        closeTimer = null; 
       } 
      } 

      // TODO: Make more modular   
      function stopSubTimer() { 
       if (closeSubTimer) { 
        window.clearTimeout(closeSubTimer); 
        closeSubTimer = null; 
       } 
      } 

      // If the user click out, close teh box 
      document.onclick = close(); 
      document.onclick = closeSub(); 
    </script> 
</head> 
    <body> 
     <div class="navagation"> 
      <ul id="navagationBar"> 
       <li><a href="#" onMouseOver="openMenu('menu0')" onMouseOut="startTimer()">HSIE</a> 
        <div id="menu0" onMouseOver="stopTimer()" onMouseOut="startTimer()"> 
         <a href="#" onMouseOver="openSub('submenu0_0')" onMouseOut="startSubTimer()">Business Studies</a> 
         <div class='sub' id="submenu0_0" onMouseOver="openSub('submenu0_0')" onMouseOut="startSubTimer()"> 
          <a href='view.php?id=110'>Year 11</a> 
          <a href='view.php?id=109'>Year 12</a> 
         </div> 
         <a href="#" onMouseOver="openSub('submenu0_1')" onMouseOut="startSubTimer()">Commerce</a> 
         <div class='sub' id="submenu0_1" onMouseOver="openSub('submenu0_1')" onMouseOut="startSubTimer()"> 
          <a href='view.php?id=112'>Year 9</a> 
          <a href='view.php?id=111'>Year 10</a> 
         </div> 
         <a href="#" onMouseOver="openSub('submenu0_2')" onMouseOut="startSubTimer()">Geography</a> 
         <div class='sub' id="submenu0_2" onMouseOver="openSub('submenu0_2')" onMouseOut="startSubTimer()"> 
          <a href='view.php?id=48'>Year 7</a> 
          <a href='view.php?id=92'>Year 8</a> 
          <a href='view.php?id=105'>Year 9</a> 
          <a href='view.php?id=70'>Year 10</a> 
          <a href='view.php?id=69'>Year 11</a> 
          <a href='view.php?id=131'>Year 12</a> 
         </div> 
         <a href="#" onMouseOver="openSub('submenu0_3')" onMouseOut="startSubTimer()">History</a> 
         <div class='sub' id="submenu0_3" onMouseOver="openSub('submenu0_3')" onMouseOut="startSubTimer()"> 
          <a href='category.php?id=89'>Junior</a> 
          <a href='category.php?id=90'>Senior</a> 
         </div> 
        </div> 
       </li> 
      </ul> 
     </div> 
    </body> 
</html> 
+0

內嵌的JavaScript,哎呀!它燃燒! – Undefined 2012-08-07 10:23:59

+0

@Sam我很懶;) – Darestium 2012-08-07 10:24:51

回答

1

嘗試將子菜單div放在相應的a標籤之前(而不是將這些div放在它們後面)。

例如,試試這個:

<div class='sub' id="submenu0_0" onMouseOver="openSub('submenu0_0')" onMouseOut="startSubTimer()"> 
    <a href='view.php?id=110'>Year 11</a> 
    <a href='view.php?id=109'>Year 12</a> 
</div> 
<a href="#" onMouseOver="openSub('submenu0_0')" onMouseOut="startSubTimer()">Business Studies</a> 

取而代之的是:

<a href="#" onMouseOver="openSub('submenu0_0')" onMouseOut="startSubTimer()">Business Studies</a> 
<div class='sub' id="submenu0_0" onMouseOver="openSub('submenu0_0')" onMouseOut="startSubTimer()"> 
    <a href='view.php?id=110'>Year 11</a> 
    <a href='view.php?id=109'>Year 12</a> 
</div> 
+1

+1好的先生,我謝謝你!這樣簡單的解決方案! – Darestium 2012-08-07 10:41:06

1

DOM訪問

首先,你必須絕對確保不被getElementbyId();訪問DOM在整個頁面加載之前。

您必須在關閉主體標記之前調用腳本,或者將整個代碼包裝在一個函數中,並在結束時在關閉主體標記之前調用它。這是Yahoo!和Google前端開發最佳做法。

或者,您可以使用JQuery的$(document).ready() function或其他JavaScript庫的文檔加載功能。使用一個庫來解決這個問題,但是會是矯枉過正。

全局變量

通過聲明VAR menuItem = 0;功能範圍之外,您變量聲明爲一個全球性的,這是一個非常糟糕的事情!它會混亂你的整個網站的命名空間。在函數內聲明變量以創建閉包。

此外,你不想用一個整數初始化你的menuItem變量,因爲稍後你會引用一個對象(一個DOM對象)。儘管Javascript不需要類型來聲明,但這會起作用,它會與代碼的讀者產生混淆。在功能裏面只需使用var menuItem;

CSS塊格式化上下文

使用display: inlinedisplay: block與HTML元素嘗試。請務必閱讀並理解W3C CSS Visual formatting model

0

你必須爲每個子水位個人ID,這樣你可以爲每個添加樣式。

#submenu0_0 > a {top:0px;} 
#submenu0_1 > a {top:25px;} 
#submenu0_2 > a {top:50px;} 
#submenu0_3 > a {top:75px;} 
0

這是由於quirks mode

嘗試使用正確的doctype這樣的:

<!DOCTYPE HTML> 
<html> 
<head> 

</head> 
<body> 

</body> 
</html>