Как добавить эффект затухания между контентом на двух страницах, используя jQuery? - PullRequest
1 голос
/ 20 октября 2011

Я разработал простой веб-сайт с домашней страницей, страницей с информацией и скользящей контактной формой. Вы можете посмотреть сайт здесь .

Я хотел бы добавить хороший переход между индексом и страницами. Я полагаю, что самым простым решением было бы исчезновение, но скользящий контент тоже может выглядеть хорошо. Я пытался реализовать скрипт динамической страницы на уловках CSS , но не смог заставить его работать с имеющейся у меня системой навигации, а также эффекты не в правильном порядке. Я предполагаю, что заказ должен был бы быть:

  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>

ФУНКЦИЯ DELEGATE CLICK:

$("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;
}

Ответы [ 3 ]

2 голосов
/ 20 октября 2011

проверьте этот источник на португальском, но вы можете попробовать:

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;
    });
});

Демо

2 голосов
/ 20 октября 2011

Javascript на самом деле не предназначен для перехода между страницами, но я думаю, вы могли бы что-то взломать, когда кто-то нажимает на ссылку, вы переходите $('body').fadeout(slow); единственная проблема заключается в том, что страница может хорошо загрузиться до того, как эффект успеет завершиться, конечно, вы можете отменить поведение по умолчанию, выполнить эффект и затем перейти на нужную страницу.

1 голос
/ 20 октября 2011

Если вы хотите придерживаться кода CSS Tricks, я думаю, что можно настроить его для вас.

Порядок анимации

Я не заметил, когда попробовал сначала, но - вы правы - исчезновение, исчезновение нового контента, затем настройкаПорядок анимации высоты довольно глупый.Вы можете заставить его делать то, что вы хотите, изменив порядок анимации

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

Форма контакта

Вы можете исключить форму контакта из запуска хэш-обмена, так какв частности, о том, что включать в делегат, например (для идентификатора ссылки #contact)

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

Это может или не может делать то, что вы хотите, например, вы можете на самом деле хотите, чтобы форма контакта добавила хэшчтобы люди могли ссылаться на него.В этом случае вы можете добавить if в событие hashchange для проверки на #contact (или что-то еще).

Редактировать

Следуя приведенным ниже комментариям, этот код 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;
}
...