jQuery 悬停下拉菜单全宽大小

Posted

技术标签:

【中文标题】jQuery 悬停下拉菜单全宽大小【英文标题】:jQuery Hover Drop-Down-Menu Full Width Size 【发布时间】:2014-04-03 02:20:42 【问题描述】:

我的网站中有一个垂直菜单。现在我在一些链接中需要一个下拉系统。 我在网上看到过这个例子:http://jsfiddle.net/4jxph/3018/ 但我想要一个全宽的子菜单。索尼的下拉系统是我想要的。 索尼下拉系统:Sony 我总是创建一个全宽大小的下拉菜单。 我的代码:http://www.jsfiddle.net/3aK9k/4。 所以我想要什么,当我将 content 悬停时,子菜单并再次指向菜单链接,该链接向下滑动子菜单,而不是子菜单应该在那里没有一些动作。

我希望我已经解释了我想要做什么。我认为这是可能的,但这使我对 JS 和 jQuery 的了解不堪重负。

谁能告诉我怎么做?

【问题讨论】:

你说的没有一些动作是什么意思? 还有一个问题 - 你想要精确的输出作为sony.de 给出的链接吗? @Zword with "without some move" 我想说内容没有动画。 我想要这个与索尼下拉菜单的精确比例,它不必是相同的代码。 @Zword 所以你不想滑动动画? 【参考方案1】:

html

    <ul id="nav_menu">
    <li><a class="nav_menu_link nav">Home</a></li>
    <li class="nav_menu_link_drop nav">
        <a class="nav_menu_link">DropDown 1</a>
    </li>
        <div id="content1" class="content" style="display: none;">
            <ul style="padding: 20px; height: auto;">
                <li><a href="#">Item1</a></li><br />
                      <li><a href="#">Item2</a></li><br />
                      <li><a href="#">Item3</a></li><br />
                      <li><a href="#">Item4</a></li>
            </ul>
    </div>
    <li class="nav_menu_link_drop nav">
        <a class="nav_menu_link">DropDown 2 <i class="arrow down"></i></a></li>
    <div id="content2" class="content" style="display: none;">
        <ul style="padding: 20px; height: auto;">
            <li><a href="#">Other</a></li><br />
                      <li><a href="#">Other Test</a></li>
        </ul>
    </div>
</ul>

jQuery

var stop = true;
var hovered;
var timeout;

$('.nav').hover(
    function()
        clearTimeout(timeout);
        stop = true;
        hovered = this;
        timeout = setTimeout(function()
        if($(hovered).hasClass('nav_menu_link_drop'))
            $('.content').css('z-index',0);
            $(hovered).next('.content').css('z-index',5);        
            $(hovered).next('.content').slideDown(350);
            timeout = setTimeout(function()
                $('.content').not($(hovered).next('.content')).slideUp(350);  
            ,200);
        
        else
            $('.content').slideUp(350);    
        ,400);
    ,
    function(e)
        stop = false;
        clearTimeout(timeout);
        setTimeout(function()
            if(!stop)
                $('.content').slideUp(350);
        ,500);
    
);

$('.content').hover(
    function()
        stop = true;    
    ,
    function()    
    
);

$('#nav_menu').hover(
    function()
    ,
    function()
        timeout = setTimeout(function()
            $('.content').slideUp(350);
        ,200);
    
);

FIDDLE

【讨论】:

@Selfproblemmade 我只是在使用第一把小提琴,但明天我可以试试第二把小提琴。也就是说,如果您的问题仍然需要答案。 耶,那太好了:) 这看起来和我想象的一模一样【参考方案2】:

我在小提琴中制作了 slidedown,其工作原理与 sony.de:

Updated Fiddle(新)

HTML

<div id="menu">
<ul>
    <div id="mainMenu">
    <li class="menu1">Home</li>
    <li class="menu2">DropDown1</li>
    <li class="menu3">DropDown2</li>
    </div>
</ul>
    <div class="submenu menu2">
        <!--menu items-->
    </div>
    <div class="submenu menu3">
        <!--menu items-->
    </div>
</div>

CSS

html,body
    width:100%;
    height:100%;
    margin:0px;
    padding:0px;

#menu
    position:relative;
    width:100%;
    height:80px;
    font-family:sans-serif;

#menu,#menu ul,#menu>ul>#mainMenu>li,#menu div
    display:inline-block;
    margin-top:0px;

#menu >ul 
    position:absolute;
    top:0px;
    z-index:100;
    list-style:none;
    padding:0px;
    font-size:18px;
    height: 80px;
    width: 100%;
    background: none repeat scroll 0% 0% #FFA500;

#menu ul>#mainMenu>li
    padding: 29px;

#menu ul>#mainMenu>li:hover
    background: none repeat scroll 0% 0% rgba(0, 0, 0, 0.4);
    color: #FFF;
    transition: all 0.2s ease 0s;

#menu .submenu
    position:absolute;
    bottom:0px;
    width:100%;
    background-color:white;
    border:1px solid black;

jQuery

var preClass="";
$('#menu>ul>#mainMenu>li').hover(function()
    var curClass = $(this).attr('class');
    if(preClass!=curClass)
        $('.submenu[class*='+preClass+']').stop()
    .animate('bottom':'0px');
        $('.submenu[class*='+curClass+']').stop()
    .animate('bottom':''+(-$('div[class*='+curClass+']').height())+'px');
    preClass=curClass;
);

$('#mainMenu').mouseleave(function()
    preClass="";
    setTimeout(function()
    if(preClass=="")
    $('.submenu').stop().animate('bottom':'0px');
    ,350);
);

$('#menu').mouseleave(function()
    preClass=""
    $('.submenu').stop().animate('bottom':'0px');
);

$('.submenu').hover(function()
    preClass = $(this).attr('class').replace("submenu ","");
    $(this).css('bottom':''+(-$(this).height())+'px');
,
function()
    if(preClass!=curClass)
    $(this).stop().animate('bottom':'0px');
    
);

Fiddle with delay added like sony.de

【讨论】:

这就是我的意思,将内容悬停并悬停在内容中向下滑动的链接。容器又滑下来了,不应该这样 @Selfproblemmade 检查我的答案中的 New fiddle。告诉它是否适合您。如果有效,我将根据新的 fiddle 代码更新我的答案 告诉我On switch links do you want slide down? - @Selfproblemmade 好的,我会根据我的理解再尝试一把小提琴。猜猜这将是你想要的小提琴 @Selfproblemmade 检查我的新答案并添加了新的小提琴【参考方案3】:

检查您需要的代码jSFiddle

从Box下载代码文件

HTML 代码

<ul id="nav_menu">
    <li><a class="nav_menu_link">Home</a></li>
    <li class="nav_menu_link_drop_1">
        <a class="nav_menu_link">DropDown 1</a>
    </li>
        <div id="content1" style="display: none;">  
            <ul id="file_menu">
                <li><a href="#file">File</a></li>
                <li><a href="#edit">Edit</a></li>
                <li><a href="#view">View</a></li>
                <li><a href="#insert">Insert</a></li>
                <li><a href="#modify">Modify</a></li>
                <li><a href="#control">Control</a></li>
                <li><a href="#debug">Debug</a></li>
                <li><a href="#window">Window</a></li>
                <li><a href="#help">Help</a></li>
            </ul>
        </div>
    <li class="nav_menu_link_drop_2">
        <a class="nav_menu_link">DropDown 2 <i class="arrow down"></i></a></li>
    <div id="content2" style="display: none;">
            <ul id="file_menu">
                <li><a href="#file">2 File</a></li>
                <li><a href="#edit">2 Edit</a></li>
                <li><a href="#view">2 View</a></li>
                <li><a href="#insert">2 Insert</a></li>
                <li><a href="#modify">2 Modify</a></li>
                <li><a href="#control">2 Control</a></li>
                <li><a href="#debug">2 Debug</a></li>
                <li><a href="#window">2 Window</a></li>
                <li><a href="#help">2 Help</a></li>
            </ul>
    </div>
</ul>
<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>

CSS 代码

*    
margin: 0;
padding: 0;

#nav_menu 
    position: absolute;
    display: block;
    height: 80px;
    width: 100%;
    background: orange;

#nav_menu li 
    list-style-type: none;
    text-decoration: none;
    vertical-align: middle;
    height: 80px;
    display: inline-block;
    position: relative;

.nav_menu_link 
    color: black;
    font-size: 18px;
    height: 0;
    font-family: Arial;
    vertical-align: baseline;
    position: relative;
    display: inline-block;
    height: auto;
    padding: 29px;

.nav_menu_link:hover 
    background: rgba(0, 0, 0, 0.4);
    color: #FFF;
    transition: all .2s;

.nav_menu_link:hover .arrow.down 
    border-top-color: #FFF;


#content1:hover 
    display: block !important;
    width: 100%;
    height: auto !important;
    position: absolute;

#content2:hover 
    display: block !important;
    width: 100%;
    height: auto !important;
    position: absolute;

#content1, #content2 
    width: 100%;
    height: auto;
    background: gray;
    display: none;
    position: absolute;


#file_menu 
    border: 1px solid #1c1c1c;


#file_menu li 
    width: 100%;
    height: 30px;
    background-color: #302f2f;


#file_menu li a 
    font-family: Arial;
    font-size: 14px;
    color:#FFFFFF; 
    font-weight: bold;
    text-decoration:none; 
    padding:5px 10px; 
    display:block;


#file_menu li a:hover 
    color: #F00880;

jQuery

var link1 = $(".nav_menu_link_drop_1");
var link2 = $(".nav_menu_link_drop_2");
var content1 = $('#content1');
var content2 = $('#content2');

$(link1).hover(
    function() 
        $(content1).slideDown(350);
    ,
    function()
        $(content1).slideUp(350);
    
);

$(link2).hover(
    function() 
        $(content2).slideDown(350);
    ,
    function()
        $(content2).slideUp(350);
    
);

【讨论】:

这看起来不错,但是当您将鼠标悬停在子菜单上并悬停从子菜单滑下的链接时,容器应该保持不变 假设您将 .nav_menu_link_drop_1 和 2 更改为 .nav_menu_link_drop,您可以简单地执行 $('.nav_menu_link_drop').next().slideToggle();你不需要写两次相同的代码。【参考方案4】:

您可以通过仅使用 CSS 来实现。更干净,更简单。

现场演示:http://jsfiddle.net/4jxph/3031/

这是修改后的 CSS:

body 
font-family:Arial, Helvetica, sans-serif;
font-size:12px;
background-color: #333333;


#container 
    margin: auto;


#header 
    background-image: url(images/header.png);
    background-repeat: no-repeat;
    height: 42px;
    width: 490px;
    margin-bottom: 20px;


#button 
    height: 32px;
    width: 184px;
    margin: auto;

#button:hover .file_menu 
    max-height: 100000px; 
    opacity: 1;

ul, li 
    margin:0; 
    padding:0; 
    list-style:none;


.menu_class 
    border:1px solid #1c1c1c;


.file_menu 
    max-height: 0;
    overflow: hidden;
    opacity: 0;
    width:100%;
    border: 1px solid #1c1c1c;
    transition: all .2s;


.file_menu li 
    background-color: #302f2f;


.file_menu li a 
    color:#FFFFFF; 
    text-decoration:none; 
    padding:10px; 
    display:block;


.file_menu li a:hover 
    padding:10px;
    font-weight:bold;
    color: #F00880;

因为你想要它,这里是 JS 解决方案(比其他答案更干净):

var link = $("li[class^=nav_menu_link_drop]");

$(link).hover(

    function() 
        var content = $(this).next('div[id^="content"]');
        $(content).stop(true).slideDown(350);
    ,
    function()
         var content = $(this).next('div[id^="content"]');
         $(content).delay(350).slideUp(350);


    
);

这是在做这项工作吗? http://jsfiddle.net/3aK9k/27/

【讨论】:

我想要 100% 宽度的子菜单 那里是窗口宽度的 100%。嗯,不,你是对的,我想我忘了保存:在那里看>jsfiddle.net/4jxph/3031 是的,对不起,我以为我给了你最后一个版本:jsfiddle.net/4jxph/3031 但我想要通过显示子菜单来制作 slideDown(350) 和 slideUp(350) 动画!!当您添加此内容时,您将获得赏金 使用 CSS 过渡很容易。我在上面。【参考方案5】:

如果我说得对,您不需要动画,只需将动画时间设置为 0。您不需要 .stop(),您应该考虑使用 .hover() 而不是 mouseentermouseleave。这是一个链接:http://api.jquery.com/hover/

例子:

$(link1).hover(
    function() 
        $(content1).slideDown(0);
    ,
    function()
        $(content1).slideUp(0);
    
);

这是你的更新代码:http://jsfiddle.net/3aK9k/2/

编辑:我刚刚注意到,但是您的 html 无效,您的 div-tag 位于 ul-tag 内我注意到了...

编辑:嗯...好吧...也许你应该重新考虑你的方法,只是因为它有效,你不应该使用无效的 html

【讨论】:

看起来不错。但是当我第一次悬停链接时,内容是否应该出现持续时间(350)。当我将内容悬停并再次悬停链接时,应该没有 slideDown 的持续时间甚至没有动画。我添加了动画持续时间,但这仅适用于您第一次悬停链接时:jsfiddle.net/3aK9k/4 http://jsfiddle.net/3aK9k/8/ 你是这个意思吗?但就像我说的,你应该检查你的标记并采取不同的方法! 您的小提琴代码与您在回答中的名称相同,没有区别。请阅读我的问题的要求,以及我对您的回答的评论。

以上是关于jQuery 悬停下拉菜单全宽大小的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 下拉问题(无法保持子菜单可见)

悬停或单击时的 Jquery 下拉菜单

下拉菜单:使用 jQuery 悬停时无限滑动

jQuery 菜单下拉气泡

Bootstrap 下拉菜单在悬停时关闭

jQuery 如何实现 “鼠标悬浮下拉菜单” 效果?