0

我正在创建一个页面,顶部有一个图像,下面有一个菜单。当用户单击 3 个菜单按钮时,图像 slideUp 和页面向下滚动,因此菜单位于页面顶部,然后右侧 .content div 淡入。 slideUp 应该只在用户第一次发生点击按钮。

用 jQuery 做到这一点的绝对最佳方法是什么?(没有插件)

我还需要知道如果我单击同一个按钮两次,我如何无法阻止它淡入已经可见的页面?

我使用rel而不是href,因为 href 使页面跳转,即使使用return false

这是我到目前为止所拥有的:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
<script type="text/javascript">
$(function(){

    imgVisible = true;

    $('#mainmenu a').click(function(){
        var $activeTab = $(this).attr('rel');
        if(!imgVisible){
            $('html:not(:animated),body:not(:animated)').animate({scrollTop:$('#mainmenu').offset().top-20},500);
            $('.content').hide();
            $($activeTab).fadeIn();
        } else{
            $('#imgholder').slideUp(500,function(){
                imgVisible = false;
                $('#mainmenu a[rel="'+$activeTab+'"]').click();
            });
        }
        return false;
    });

});
</script>

<div id="imgholder"><img src="image.jpg" /></div>

<div id="mainmenu">
    <ul>
        <li><a rel="#tab1"></a></li>
        <li><a rel="#tab2"></a></li>
        <li><a rel="#tab3"></a></li>
    </ul>
</div>

<div id="container">

    <div class="content" id="tab1">
        content
    </div>


    <div class="content" id="tab2">
        content
    </div>


    <div class="content" id="tab3">
        content 
    </div>

</div>
4

3 回答 3

2

下面的代码完成了你所需要的:

$('#mainmenu a').click(function(){  
    var myrel=$(this).attr('rel');
    $('.content:not([id='+myrel+'])').hide();
    $('#imgholder').slideUp(500,function(){         
        $('#'+myrel).fadeIn();
    });         
});

....
    <li><a href='#' rel='tab0'></a></li>

我已从您的 rel='' 部分中删除了 '#' 符号 ;-)

我不确定您为什么要滚动页面。当用户单击菜单时,他/她已经将其聚焦(因此它在当前视口中可见)。但是你有一个非常大的顶部图像吗?如果是这种情况,请告诉我,我将修改代码段。(不过,这取决于页面首次加载时可见菜单下方的内容量。)

此外,出于SEO原因,您可能希望使用 href 而不是 rel 属性并创建单独的内容保存页面。以下代码段将删除导航操作。

$('#mainmenu a').each(function(){
    var myhref = $(this).attr('href');
    $(this).attr('href','#').attr('rel',myhref);
}).click(function(){
    var myrel=$(this).attr('rel');
    $('.content:not([id='+myrel+'])').hide();
    //....etc
于 2009-10-31T00:20:30.160 回答
2

我认为这是您正在寻找的一个很好的例子:有机标签

于 2009-10-28T17:01:48.907 回答
1
var imgVisible = true;
var $activeTab, $lastTab;
var $mainmenu = $('#mainmenu');
var offset = $mainmenu.offset().top - 20;

$mainmenu.find('a').click(function() {

    $activeTab = $($(this).attr('rel'));

    if (!imgVisible) {
        // dont fire any events if already open
        if ($lastTab.attr('id') == $activeTab.attr('id')) return false;
        $lastTab.fadeOut('normal', function() {
            $activeTab.fadeIn(500, function() {
                $lastTab = $activeTab;
            });
        });
    } else {
        $('#imgholder').slideUp(500, function() {
            imgVisible = false;
            window.scrollTo(0, offset);
            $activeTab.fadeIn(500, function() {
                $lastTab = $activeTab;
            });
        });
    }

    return false;

});

我强烈建议添加<a href="#">,因为如果正确完成,这不会使页面跳转,并且会确保对您的锚链接进行验证。有人让我知道如果我遗漏了什么,它可以很快解决(或者如果你有优化或改进,你可以为我做)。

于 2009-11-05T19:31:41.003 回答