1

我是 jQuery 新手,我正在尝试解决导航问题。我构建了一个包含许多嵌套列表的垂直菜单。它纯粹是 CSS,但我的客户要求当您不再将鼠标悬停在它上面时,当前打开的子菜单保持打开一秒钟左右。

这是我正在开发的网站:http: //dev.musgraveagencies.com/

这是他们目前拥有的网站,以及他们希望菜单如何延迟: http: //www.musgraveagencies.com/

我相信我可以使用 jQuery 来实现这一点,但我希望网站能够在未启用 Javascript 的情况下正常工作。

编辑:感谢大家的帮助!这是下面的最终代码。

我的 HTML:

<body class="nojs">
        <div id="nav">
        <ul>
            <li><a href="#">Home</a></li>
            <li><a href="#">Development Projects</a>
                <ul>
                    <li><a href="#">Design Build</a>
                        <ul>
                            <li><a href="#">Interior Design</a>
                                <ul>
                                    <li><a href="#">Project Example</a></li>
                                </ul>
                            </li>
                            <li><a href="#">Project Example 1</a></li>
                            <li><a href="#">Project Example 2</a></li>
                            <li><a href="#">Project Example 3</a></li>
                        </ul>
                    </li>
                    <li><a href="#">Industrial</a>
                        <ul>
                            <li><a href="#">Project Example 1</a></li>
                            <li><a href="#">Project Example 2</a></li>
                            <li><a href="#">Project Example 3</a></li>
                            <li><a href="#">Project Example 4</a></li>
                        </ul>
                    </li>
                    <li><a href="#">Residential</a></li>
                    <li><a href="#">Neighbourhood</a></li>
                </ul>
            </li>
            <li><a href="#">Contact</a></li>
        </ul>
        </div>
    </div>
</body>

我的 CSS:

#nav {
    width: 156px;
    font: 9pt 'TeXGyreScholaRegular', Arial, sans-serif;
    text-align: left;
}

#nav ul a {
    color: #fff;
    display: block;
    overflow: auto;
    line-height: 19pt;
    text-indent: 2px;
}

#nav ul a:hover {
    color: #fff;
    text-decoration: none;
}

#nav ul li:hover {
    background: #484848;
}

#nav ul {
    width: 156px;
}

#nav ul li {
    list-style: none;
    background: #000;
    position: relative;
    z-index: 100;
}

#nav ul li ul {
    position: absolute;
    width: 156px;
    top: 0;
    left: 156px;
}

body.nojs #nav ul li ul  {
    display: none;
}

body.nojs #nav ul li:hover > ul {
    display: block;
}

我的 jQuery:

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery.hoverIntent.minified.js"></script>
<script type="text/javascript">
    $(document).ready(function() {
        $('#nav ul li ul').hide();
        $('body').removeClass('nojs');

        var config = {    
            sensitivity: 2, 
            interval: 200,    
            timeout: 700, 
        };

        var animating = false;

        $('#nav ul li').hoverIntent(
        function () {
                animating = true;
                $('> ul', this).fadeIn(100, function() {
                    animating = false;
                });
        },

        function () {
            animating = true;
            $('> ul', this).delay(400).fadeOut(200, function() {
                animating = false;
            });
        });
    });
</script>
4

3 回答 3

1

使用jQuery HoverIntent 插件

您可以在@thecl.com 中看到它,它还有助于解决 ie8/7 中无法从父锚点转到子导航的问题。

于 2013-01-16T21:27:49.120 回答
1

试试这个小提琴:http: //jsfiddle.net/hamidlab/adadv/

我已经删除了所有顶级和子级类,并用于>定位直接子级。

对js也做了一点改动(不需要js,如果你不关心fadeIn效果)

$('#nav ul li').hover(function(){
    $(' > ul', this).stop(true, true).fadeIn();  
}, function(){
    $(' > ul', this).hide(0);
});

CSS 的一些变化:http: //jsfiddle.net/hamidlab/adadv/1/

注意:对于这个小东西,您不需要插件。我觉得最好不要使用插件,尽可能保持简单和干净。

于 2013-01-16T21:35:59.803 回答
1

代码的问题是,您正在使用 jQuery 触发转换(淡入淡出),但使用 CSS 立即隐藏元素。所以这会毫不拖延地发生。

您可以在 CSS3 中使用transition-delayoranimation-delay属性,但 IE 不支持这些属性。所有其他人都支持它们,但大多数版本都不支持。

transition-delay: 2s;
-moz-transition-delay: 2s; /* Firefox 4 */
-webkit-transition-delay: 2s; /* Safari and Chrome */
-o-transition-delay: 2s; /* Opera */ 

因此,我认为您应该将大部分 CSS(悬停伪类)迁移到 javascript/jQuery 并使用该setTimeout()方法或 jQuery 的delay()方法延迟隐藏/显示。

更新:

由于您担心用户浏览器中是否未启用 javascript;如果没有 javascript 和 CSS 延迟相关的属性,我认为不可能延迟 HTML 元素外观的更改。

所以你可以做的是;

  1. 创建仅 CSS 版本的菜单(如果需要延迟,请使用 transition-delay 和/或 animation-delay CSS3 属性)。如果浏览器不支持这些属性,唯一的缺点是你不会得到“延迟”,但你的菜单仍然可以工作。
  2. 创建一个 javascript 版本的菜单(使用 setTimeout 等延迟方法)。
  3. <noscript>标签用于非 JavaScript 内容和您的纯 CSS 菜单并将它们放在其中。

这样,您将使两个用户都满意。

于 2013-01-16T21:49:58.713 回答