2017-10-18 53 views
2

我正在爲我的網站設置菜單。它已經完成了,只有一個細節讓我煩惱。看看下面的代碼片段。當我將鼠標懸停在父元素上時,該子元素隨着轉換而滑落。但是一旦鼠標離開父/子元素,子元素就會消失。當鼠標離開元素時,CSS轉換過早結束

我已經確定,當鼠標離開父/子元素時,子元素快速移出視圖(left: -9999px;),在向上滑動轉換開始之前。

我該如何做到這一點,當鼠標離開菜單時,項目以相同的過渡類型向後滑動?有沒有CSS的解決方案,或者我也必須使用jQuery?

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

 
li { 
 
    width: 180px; 
 
} 
 

 
#menu ul ul { 
 
    left: -9999px; 
 
    position: absolute; 
 
    background: red none repeat scroll 0 0; 
 
} 
 

 
#menu li:hover>ul { 
 
    left: auto; 
 
} 
 

 
#menu ul ul li { 
 
    height: 0; 
 
    transition: height 0.2s ease 0s; 
 
} 
 

 
#menu ul ul ul { 
 
    margin-left: 100%; 
 
    top: 0; 
 
} 
 

 
#menu ul li:hover>ul>li { 
 
    height: 32px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<nav id="menu"> 
 
    <ul> 
 
    <li>Parent Item 
 
     <ul> 
 
     <li>Child Item 
 
      <ul> 
 
      <li>Child Child Item</li> 
 
      </ul> 
 
     </li> 
 
     </ul> 
 
    </li> 
 
    </ul> 
 
</nav>

+0

這是可能的純CSS,但你需要使用關鍵幀動畫,而不是轉型 - 關鍵幀,讓您一起根據時間表鏈中的多個動畫,這樣你就可以有菜單首先向上滑動,然後在向上滑動動畫完成後將其左移。 – delinear

+0

(我會幫助一個例子,除了我要去學校跑步,道歉!) – delinear

回答

0

脫下左屬性,並使用溢出:隱藏 另外,我不認爲使用「自動」過渡工作。它會自動彈出使用此屬性。

#menu ul ul { 
 
    position: absolute; 
 
    overflow: hidden; 
 
    background: red none repeat scroll 0 0; 
 
} 
 

 
#menu li:hover>ul { 
 
    
 
} 
 

 
#menu ul ul li { 
 
    height: 0; 
 
    transition: height 0.2s ease 0s; 
 
} 
 

 
#menu ul li:hover>ul>li { 
 
    height: 32px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<nav id="menu"> 
 
    <ul> 
 
    <li>Parent Item 
 
     <ul> 
 
     <li>Child Item</li> 
 
     </ul> 
 
    </li> 
 
    </ul> 
 
</nav>

+0

雖然這隻適用於一個下拉菜單,但它打破了我的其他下拉菜單(查看問題中更新的代碼段)。任何想法如何解決它?這可能是因爲「overflow:hidden;'。 –

0

您可以在常規狀態下增加transition-delay

例子與1s延遲。

position:relative被添加到父li,所以可以left:auto;爲了應用transition變成left:0;

#menu ul ul { 
 
    left: -9999px; 
 
    position: absolute; 
 
    background: red none repeat scroll 0 0; 
 
    transition:0s 1s;/* set a delay */ 
 
} 
 
#menu ul li{ 
 
position:relative; 
 
} 
 
#menu li:hover>ul { 
 
    left: 0; 
 
    transition:0s 0s;/* reset delay */ 
 
} 
 

 
#menu ul ul li { 
 
    height: 0; 
 
    transition: height 0.2s ease 1s;/* set a delay */ 
 
} 
 

 
#menu ul li:hover>ul>li { 
 
    height: 32px; 
 
    transition: height 0.2s ease 0s;/* reset delay */ 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<nav id="menu"> 
 
    <ul> 
 
    <li>Parent Item 
 
     <ul> 
 
     <li>Child Item</li> 
 
     </ul> 
 
    </li> 
 
    </ul> 
 
</nav>

0

我會刪除left財產,只有過渡height。如果您也使用overflow屬性,這將起作用。

#menu li ul { 
 
    height: 0px; 
 
    overflow: hidden; 
 
    background: red none repeat scroll 0 0; 
 
    transition: height 0.2s ease 0s; 
 
    position: absolute; 
 
} 
 

 
#menu ul li:hover>ul { 
 
    height: 32px; 
 
    overflow: auto; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<nav id="menu"> 
 
    <ul> 
 
    <li>Parent Item 
 
     <ul> 
 
     <li>Child Item</li> 
 
     </ul> 
 
    </li> 
 
    </ul> 
 
</nav>

+0

雖然這隻適用於一個下拉菜單,但它打破了我的其他下拉菜單(查看問題中的更新片段) 。任何想法如何解決它?這可能是因爲「overflow:hidden;'。 –