Как добавить эффект затухания между содержимым на двух страницах с помощью jQuery?

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

Я хотел бы добавить красивый переход между страницами index и about. Я полагаю, что самым простым решением было бы затухание, но скользящий контент тоже может выглядеть хорошо. Я попытался реализовать сценарий динамической страницы на хитростях 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>

ФУНКЦИЯ ДЕЛЕГИРОВАНИЯ НАЖМИТЕ:

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

ПОЛНАЯ ДИНАМИЧЕСКАЯ СТРАНИЦА.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;
}

person Nick    schedule 20.10.2011    source источник
comment
Не могли бы вы уточнить, почему не работает та, что в CSS Tricks? Я взглянул на него и на ваш сайт, и похоже, что он должен делать то, что вы хотите. (За исключением, может быть, делегата, который я бы хотел переписать, чтобы включить другие ссылки на страницу.)   -  person meloncholy    schedule 20.10.2011
comment
Привет. У меня частично работает скрипт CSS Tricks. Две основные проблемы были такими же, как описано выше, т.е. у меня уже есть функции щелчка на каждой странице для открытия и закрытия контактной формы и изменения классов ссылок. Поэтому я не был уверен, как интегрировать это с функцией щелчка в скрипте CSS Tricks. Затем, поскольку высота моего индекса и страницы about разные, контент исчезал до того, как размер страницы был изменен до правильного размера для нового контента, поэтому я задавался вопросом об изменении порядка эффектов.   -  person Nick    schedule 20.10.2011
comment
Ах, мои извинения - я не заметил, что порядок был неправильным, когда я попробовал это, но вы правы. Я разместил кое-что ниже, используя код CSS Tricks, который, надеюсь, работает.   -  person meloncholy    schedule 20.10.2011


Ответы (3)


Если вы хотите придерживаться кода 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 высоту значение auto после анимации (чтобы контактная штука работала), а также пересчитывает высоту, когда используется, чтобы разрешить изменения страницы, когда видна контактная форма.

Изменить 2

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

Ссылки исчезают, потому что они находятся в div #guts (и действительно внутри раздела #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;
}
person meloncholy    schedule 20.10.2011
comment
Спасибо. Определенно шаг в правильном направлении. Если вы посмотрите на текущий сайт, то обнаружите как минимум пару проблем: (1) при открытии контактная форма, высота страницы не изменяется, чтобы вместить дополнительную высоту контактной формы. Это из-за того, что высота задается сценарием CSS Tricks? (2) Я не знаю, как обращаться со ссылками внизу страницы. Теперь я включил их в div #main-content (и #guts), чтобы они появлялись и исчезали, но для них не было места на странице. Надеюсь это понятно! - person Nick; 20.10.2011
comment
Я думаю, что теперь у меня отсортирована навигация внизу, хотя лучше бы она не исчезала вместе с содержимым, а скорее оставалась внизу страницы во время перехода. Однако я заметил еще одну проблему. Я добавил код из функций щелчка для каждой из навигационных ссылок в делегат в скрипте трюков CSS, и это работает, кроме $(this).addClass("current");. Предположительно, сценарий не знает, что означает «это». Как бы я переписал это так, чтобы текущий класс добавлялся на страницу при нажатии на панель навигации? Спасибо, Ник - person Nick; 20.10.2011
comment
@Nick Ты прав насчет высоты контактной формы; Я добавил некоторый код, который автоматически устанавливает высоту после анимации, чтобы она не мешала контактной форме. В коде, который у меня есть (с вашего сайта), класс добавляется к $("nav a[href=" + newHash + "]"), а не $(this). Или я не там ищу? Однако там есть ошибка (пропущенные кавычки), которую я также добавил выше. - person meloncholy; 20.10.2011
comment
Спасибо. это выглядит намного лучше. Чего я не понял, так это того, что при использовании этого хэш-метода полная страница about.html не загружается, поэтому сценарии в заголовке страницы about.html на самом деле являются сценариями для index.html. У меня есть функция щелчка по ссылке «закрыть это окно» в контактной форме, которая добавляет текущий класс к навигационной ссылке текущей страницы. Я включил этот скрипт в конец моего первоначального вопроса, чтобы вы могли легко его увидеть. Есть ли способ сослаться на текущую страницу в этом скрипте или, что еще лучше, включить ее в скрипт CSS Tricks? - person Nick; 20.10.2011
comment
На самом деле он загружает всю страницу, но jQuery отбрасывает все, что не находится в #guts (поскольку вам это больше не нужно, конечно). На вашем месте я бы сохранил текущую вкладку в глобальном масштабе во время вызова Ajax, чтобы вы могли использовать ее при скрытии контактной формы. Я добавил немного кода в функцию hashChange для хранения вкладки (это предполагает, что идентификатор вкладки будет именем файла без .html (или чего-то еще) в конце), а затем просто изменил функцию закрытия, чтобы использовать ее. - person meloncholy; 21.10.2011
comment
Еще раз спасибо. Это очень помогает. Я отметил вопрос как ответ. Однако есть пара нерешенных вопросов, если у вас есть время, один напрямую связанный со сценарием, а другой нет. (1) Я добавил несколько строк в функцию щелчка делегата (я добавил этот раздел сценария в конец моего исходного вопроса). Это необходимо для обработки закрытия контактной формы, когда нажимаются ссылки index или about nav. Прокрутка на странице, когда пользователь нажимает на страницу, отличную от той, на которой он был, когда открывал контактную форму, не плавная - она ​​просто подпрыгивает. - person Nick; 21.10.2011
comment
Другая проблема заключается в том, чтобы найти способ не скрывать ссылки в нижней части страницы таким образом, чтобы они оставались внизу страницы (#page-wrap). Я пробовал несколько вещей, в том числе абсолютное позиционирование в div обтекания страницы и относительное позиционирование в nav-bottom div, но ссылки по-прежнему переходят в верхнюю часть раздела основного контента. Можете ли вы придумать способ достижения этого? Спасибо, Ник - person Nick; 21.10.2011
comment
@Nick - Извините за задержку. Добавлен еще немного кода и (надеюсь, полезное) объяснение. эти две проблемы. - person meloncholy; 24.10.2011
comment
Спасибо, и извините за задержку. Переходы, безусловно, выглядят лучше, хотя я согласен, что их можно было бы немного улучшить. Самая насущная проблема заключается в том, что я изменил структуру навигации на элементы div с абсолютным позиционированием, включая скрытые элементы div с зелеными листьями, которые теперь то появляются, то исчезают. Проблема, с которой я столкнулся, заключается в том, как сделать навигационную ссылку для страницы index.html зеленой при первой загрузке страницы и как сделать текущую вкладку зеленой с помощью функции закрытия. Я буду рад задать еще один вопрос, если вы предпочитаете. Я добавил текущий код в конец исходного вопроса. - person Nick; 27.10.2011

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

person Tules    schedule 20.10.2011
comment
Это также было бы моим предположением. Поймайте событие клика, сделайте затухание, а затем перейдите на страницу. На следующей странице сделайте фейдейн. - person BernardMarx; 20.10.2011
comment
В примере CSS Tricks используется Ajax, но я только что посмотрел, и вся страница исчезает было обсуждалось ранее. Хотя эффект скорее раздражающий... - person meloncholy; 20.10.2011
comment
да, это не то, что я часто видел, но это определенно выполнимо - person Tules; 20.10.2011
comment
будет ли скользящий контент менее раздражающим? - person Nick; 20.10.2011
comment
@Nick Моя главная претензия к такого рода вещам в основном выражена на связанной странице (и действительно очевидна в демонстрации на связанном сайте): они могут излишне замедлять работу и просто мешать - скорее, как плохой сайт Flash . Но если они добавляют изюминку и не мешают моему просмотру (или даже добавляют опыта, давая полезную обратную связь), то я не против. :) - person meloncholy; 20.10.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;
    });
});

Демо

person Ricardo Binns    schedule 20.10.2011
comment
У Рика есть это прямо здесь, вы должны проверить это и принять это как правильный ответ - person Tules; 20.10.2011