【问题标题】:How do I add fade effect between content on two pages using jQuery?如何使用 jQuery 在两个页面上的内容之间添加淡入淡出效果?
【发布时间】:2011-12-11 17:34:42
【问题描述】:

我设计了一个简单的网站,其中包含主页和关于页面以及滑动联系表单。您可以查看网站here

我想在索引和关于页面之间添加一个很好的过渡。我想最简单的解决方案是淡入淡出,但滑动内容也可能看起来不错。我试图实现dynamic page script on CSS tricks,但无法让它与我现有的导航系统一起工作,而且效果的顺序也不正确。我认为订单需要是:

  1. 淡出(或滑出)当前页面
  2. 更改页面高度以适应新内容
  3. 在新页面中淡入(或滑动)

我想知道是否有人可以推荐一种合适的方法来达到我正在寻找的效果。

谢谢,

尼克

添加

关闭按钮点击功能:

<script type="text/javascript">
$(document).ready(function(){
    $(".close").click(function(){
        $("#panel").slideUp("slow");
        $("#home").addClass("current");
        $("#contact").removeClass("current");
        return false;
    });
});
</script>

代表点击功能:

$("nav").delegate("a.fade", "click", function ()
    {
        window.location.hash = $(this).attr("href");
        $("#panel").slideUp("slow");
        $(this).addClass("current");
        $("#contact").removeClass("current");
        return false;
    });

FULL DYNAMICPAGE.JS

$(function ()
{

    var newHash = "",
        $mainContent = $("#main-content"),
        $pageWrap = $("#page-wrap"),
        baseHeight = 0,
        $el,
        $panel = $("#panel");

    $panel.visible = false;


    $(window).bind('hashchange', function ()
    {

        newHash = window.location.hash.substring(1);

        if (newHash)
        {
            if ($panel.visible)
            {
                $pageWrap.animate({ height: "-=" + $panel.height() + "px" }, function ()
                {
                    $pageWrap.height($pageWrap.height());
                    $panel.visible = false;
                });
                $panel.slideUp();
                baseHeight = $pageWrap.height() - $mainContent.height() - $panel.height();
            }
            else
            {
                $pageWrap.height($pageWrap.height());
                baseHeight = $pageWrap.height() - $mainContent.height();
            }

            $mainContent
                .find("#guts")
                .fadeOut(500, function ()
                {
                    $mainContent.hide().load(newHash + " #guts", function ()
                    {
                        $pageWrap.animate({ height: baseHeight + $mainContent.height() + "px" }, function ()
                        {
                            $mainContent.fadeIn(500);
                            $pageWrap.css("height", "auto");
                        });

                });
                });
        };
    });

    $("nav").delegate("a.fade", "click", function ()
    {
        window.location.hash = $(this).attr("href");
        $("#panel").slideUp("slow");
        $(this).addClass('clicked');
        $("a").not(this).removeClass('clicked');
        $(".current", this).stop().animate({
            opacity: 1
        }, {
            duration: 100,
            specialEasing: {
                opacity: 'linear',
            },

        });

        $(".current").not($(".current",this)).stop().animate({
                    opacity: 0
                }, {
                    duration: 2000,
                    specialEasing: {
                        opacity: 'linear',
                    },

                });

        return false;
    });

    $("#nav-bottom").delegate("a", "click", function ()
    {
        $("#panel").slideDown("slow");
        return false;
    });


    $("#contact").click(function ()
    {
        $("#panel").slideDown("slow");
//        $(this).addClass("current");
//        $("#home, #about").removeClass("current");
        $(this).addClass('clicked');
        $("a").not(this).removeClass('clicked');
        $(".current", this).stop().animate({
            opacity: 1
        }, {
            duration: 100,
            specialEasing: {
                opacity: 'linear',
            },

        });

        $(".current").not($(".current",this)).stop().animate({
                    opacity: 0
                }, {
                    duration: 2000,
                    specialEasing: {
                        opacity: 'linear',
                    },

                });

        $panel.visible = true;
        return false;
    });

    $(".close").click(function ()
    {
        $("#panel").slideUp("slow");
        $panel.visible = false;


        $(".current","#nav3").stop().animate({
            opacity: 0
        }, {
            duration: 2000,
            specialEasing: {
                opacity: 'linear',
            },

        });   

        return false;
    });

    $("nav a").hover(
        function() {
            if(!$(this).hasClass('clicked')){

            $(".current", this).stop().animate({
                opacity: 1
            }, {
                duration: 300,
                specialEasing: {
                    opacity: 'linear',
                },

            });
            }
        }, function() {
        if(!$(this).hasClass('clicked')){
            $(".current", this).stop().animate({
                opacity: 0
            }, {
                duration: 2000,
                specialEasing: {
                    opacity: 'linear',
                },

        });

        }
    });

    $(window).trigger('hashchange');

});

HTML

 <div class="nav-image"><img src="images/bodhi-leaf-brown.png"></div>

 <div class="current"><img src="images/bodhi-leaf-green.png"></div>
 <div class="text"><img src="images/home.png"></div>

 </a> </div>

 <div class="nav-image"><img src="images/bodhi-leaf-brown.png" class="flip"></div>

 <div class="current"><img src="images/bodhi-leaf-green.png" class="flip"></div>
 <div class="text"><img src="images/about.png"></div>

 </a> </div>

 <a href="index.html" class="" id="contact">

 <div class="nav-image"><img src="images/bodhi-leaf-brown.png"></div>

 <div class="current"><img src="images/bodhi-leaf-green.png"></div>
 <div class="text"><img src="images/contact.png"></div>

 </a> </div>

CSS

nav {
    width: 650px;
    height: 170px;
    position: absolute;
    top: 100;
    left: 200;
}

#nav1 {
    position: absolute;
    top: 0;
    left: 120px;
}

#nav2 {
    position: absolute;
    top: 0;
    left: 340px;
}

#nav3 {
    position: absolute;
    top: 0;
    left: 560px;
}


.nav-image  {
    position: absolute;
    top: 0px;
    left: 0px;
    z-index: 1;

}

.current {
    position: absolute;
    top: 0px;
    left: 0px;
    z-index: 2;
    opacity: 0;
}

【问题讨论】:

  • 您能否更具体地说明为什么 CSS Tricks 上的那个不起作用?我看过它和你的网站,看起来它应该做你想做的事。 (除了代表,我很想重写它以包含页面上的其他链接。)
  • 嗨。我让 CSS Tricks 脚本部分工作。两个主要问题如上所述,即我已经在每个页面上都有点击功能,用于打开和关闭联系表单以及更改链接上的类。所以我不确定如何将它与 CSS Tricks 脚本中的点击功能集成。然后,因为我的 index 和 about 页面的高度不同,在页面被调整为新内容的正确大小之前,内容已经淡入,因此我想知道改变效果的顺序。
  • 啊,我很抱歉 - 当我尝试它时,我没有注意到顺序错误,但你是对的。我使用 CSS Tricks 代码在下面发布了一些希望可以工作的内容。

标签: jquery transition fade slide


【解决方案1】:

Javascript 并不是真正打算在 页面之间转换,但我想你可以一起破解一些东西,当有人点击链接时,你会转到 $('body').fadeout(slow); 唯一的问题是页面可以在效果完成之前加载,当然您可以取消默认行为,执行效果然后转到所需的页面..

【讨论】:

  • 这也是我的猜测。捕捉点击事件做一个淡出然后跳转页面。在下一页做一个淡入淡出。
  • CSS Tricks 示例使用了 Ajax,但我刚刚看了一下,整个页面都消失了 have been discussed before。虽然相当刺激的效果......
  • 是的,这不是我经常看到的,但绝对可行
  • 滑动内容会不会那么刺激?
  • @Nick 我对这类事情的主要不满基本上是在链接页面上表达的(在链接网站上的演示中确实很明显):他们可以不必要地减慢速度,然后进入方式 - 就像一个糟糕的 Flash 网站。但是,如果他们增加了繁荣并且不干扰我的浏览(甚至通过提供有用的反馈来增加体验),那么我对他们很满意。 :)
【解决方案2】:

检查这个来源,它是葡萄牙语,但你可以试试:

jquery-transitions-como-fazer-transicoes-de-paginas

html

<div id="container">
<h1>This is the index </h1>
Some text with <a class="transition" href="http://jsfiddle.net/ruanltbg/Ns97H/3/embedded/result/">link</a>.This link will do the effect

<div id="container">
<h1>Other page </h1>
Will appear with a <a class="transition" href="http://jsfiddle.net/ruanltbg/WvD7Q/1/embedded/result/">link</a> to the index.

js:

$("#container").fadeIn(2000);
$("a.transition").click(function(event){
    event.preventDefault();
    link = this.href;
    $("body").fadeOut(1000, function(){
        window.location = link;
    });
});

Demo

【讨论】:

  • ric 基本上就在这里,你应该测试它并接受它作为正确答案
【解决方案3】:

如果您确实想坚持使用 CSS Tricks 代码,我认为可以对其进行调整以适合您。

动画顺序

我刚开始尝试时并没有注意到,但是 - 你是对的 - 淡出,淡入新内容,然后调整高度动画顺序是相当愚蠢的。你可以通过反转动画顺序让它做你想做的事

$pageWrap.animate({ height: baseHeight + $mainContent.height() + "px" }, function () { $mainContent.fadeIn(200); });

联系表格

您可以通过更具体地说明要在委托中包含的内容来排除联系表单触发 hashchange,例如(对于链接 ID #contact

$("nav").delegate("a:not(#contact)", "click", function () { ... }

这可能会或可能不会做你想要的,例如您实际上可能希望联系表单添加一个哈希,以便人们可以链接到它。在这种情况下,您可以在 hashchange 事件中添加 if 以检查 #contact(或其他)。

编辑

在下面的 cmets 之后,此 dynamicpage.js 代码在动画后将 $pageWrap 高度设置为自动(因此联系人工作),并且当用于在联系人表单可见时允许页面更改时,还会重新计算高度。

编辑 2

当联系表单可见和淡化链接时处理平滑向上滚动。联系表单滚动不顺畅,因为您将其原始(扩展)高度存储在 hashChange 中并相对于该高度进行了调整。一旦动画完成并且通过 CSS 移除了固定高度,它就会跳到更小的当前高度。如果需要隐藏联系表单,我添加了一些调整高度的代码。

链接褪色是因为它们位于 #guts div 中(实际上是在 #main-content 部分中,它会实际褪色。如果将它们移到外面,事情会变得更好。不幸的是,它们确实开始跳过旧的 #guts 内容被删除和新内容被添加之间的差距,所以你可以使用一些像下面这样的 CSS 来解决这个问题。

不过,我认为这不是一个很好的解决方案。如果我是你,我会隐藏内容,将 #guts 动画到新高度,然后添加内容,所以 #guts 永远不会失去其 CSS 设置高度。使用animate 还可以让您对动画进行排队,如果您点击得太快,这有时会成为问题。

$(function ()
{

    var newHash = "",
        $mainContent = $("#main-content"),
        $pageWrap = $("#page-wrap"),
        baseHeight = 0,
        $el,
        $panel = $("#panel");

    $panel.visible = false;

    $("nav").delegate("a", "click", function ()
    {
        window.location.hash = $(this).attr("href");
        return false;
    });

    $(window).bind('hashchange', function ()
    {

        newHash = window.location.hash.substring(1);

        if (newHash)
        {
            if ($panel.visible)
            {
                $pageWrap.animate({ height: "-=" + $panel.height() + "px" }, function ()
                {
                    $pageWrap.height($pageWrap.height());
                    $panel.visible = false;
                });
                $panel.slideUp();
                baseHeight = $pageWrap.height() - $mainContent.height() - $panel.height();
            }
            else
            {
                $pageWrap.height($pageWrap.height());
                baseHeight = $pageWrap.height() - $mainContent.height();
            }

            $mainContent
                .find("#guts")
                .fadeOut(500, function ()
                {
                    $mainContent.hide().load(newHash + " #guts", function ()
                    {
                        $pageWrap.animate({ height: baseHeight + $mainContent.height() + "px" }, function ()
                        {
                            $mainContent.fadeIn(500);
                            $pageWrap.css("height", "auto");
                        });

                        $("nav a").removeClass("current");
                        $("nav a[href=\"" + newHash + "\"]").addClass("current");
                    });
                });
        };
    });

    $("#contact").click(function ()
    {
        $("#panel").slideDown("slow");
        $(this).addClass("current");
        $("#home, #about").removeClass("current");
        $panel.visible = true;
        return false;
    });

    $(".close").click(function ()
    {
        $("#panel").slideUp("slow");
        $(curTab).addClass("current");
        $("#contact").removeClass("current");
        $panel.visible = false;
        return false;
    });

    $(window).trigger('hashchange');

});

CSS

#nav-bottom {
    margin: -15px 0 15px -100px;
    position: absolute;
    bottom: 0;
    left: 50%;
    width: 200px;
}

【讨论】:

  • 谢谢。绝对是朝着正确方向迈出的一步。如果您查看current site,至少还有几个问题: (1) 打开联系表单时,页面的高度不会改变以适应联系表单的额外高度。这是因为 CSS Tricks 脚本设置了高度吗? (2) 我不知道如何处理页面底部的链接。我现在已将它们包含在#main-content(和#guts)div 中,以便它们淡入淡出,但页面上不允许它们留有空间。我希望这很清楚!
  • 我想我现在已经对底部的导航进行了排序,虽然希望它不必随着内容淡出,而是在过渡期间卡在页面底部。我注意到了另一个问题。我将每个导航链接的点击函数中的代码添加到 CSS 技巧脚本中的委托,除了$(this).addClass("current"); 之外,这都有效。大概脚本不知道“this”指的是什么。我将如何重写它,以便在导航栏中单击“当前”类时将其添加到页面中?谢谢,尼克
  • @Nick 你对联系表格高度的看法是对的;我添加了一些代码,在动画后将高度设置为自动,这样它就不会干扰联系表单。在我拥有的代码中(来自您的站点),该类被添加到$("nav a[href=" + newHash + "]"),而不是$(this)。还是我找错地方了?不过那里有一个错误(缺少引号),我也在上面添加了。
  • 谢谢。看起来好多了。我没有意识到的是,使用这种哈希方法,并没有加载完整的 about.html 页面,因此 about.html 页面上页面头部的脚本实际上是 index.html 的脚本。我在联系表单中的“关闭此窗口”链接上有一个点击功能,它将“当前”类添加到当前页面的导航链接。我在原始问题的末尾包含了这个脚本,以便您可以轻松查看它。有没有办法在这个脚本中引用当前页面,或者最好将它包含在 CSS Tricks 脚本中?
  • 它确实会加载整个页面,但是 jQuery 会丢弃所有不在 #guts 中的内容(因为您当然不再需要它)。如果我是你,我会在 Ajax 调用期间将当前选项卡存储在全局中,这样你就可以在隐藏联系表单时使用它。我在 hashChange 函数中添加了一些代码来存储选项卡(这假设选项卡 ID 将是最后没有 .html (或其他东西)的文件名),然后只是更改了关闭函数以使用它。
猜你喜欢
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
相关资源
最近更新 更多