Горизонтальный одностраничный сайт не будет возвращаться к предыдущему разделу DIV

Краткая предыстория:

У меня все работало отлично, но через некоторое время я заметил, что оно перестало работать должным образом. Возможность вернуться на «страницу» чрезвычайно важна для меня, поэтому я приступил к отмене всех недавних изменений, которые я сделал. Это не сработало, поэтому я решил воссоздать фреймворк (надеясь собрать содержимое, чтобы найти проблемное место), но проблема осталась. Я перегнал код до основ ниже.

Раньше я мог нажать кнопку «Назад», и меня сразу же переводили на предыдущую панель. СЕЙЧАС ничего не происходит, за исключением того, что «#page_name» изменяется, а текущая панель смещается на 1 пиксель. Если я щелкнул несколько ссылок (тем самым сохранив больше «следа» истории), то, как только я нажму кнопку «Назад» во второй раз, я, наконец, вернусь к состоянию, но не к правильному.

Вот скрипт: http://jsfiddle.net/gz9nW/

JQ

$(document).ready(function(){
    $('.main-nav').on('click',function (e) {
       e.preventDefault();

       var target = $(this).attr("href");
       $target = $(target);

       $('html, body').stop().animate({
           'scrollLeft': $target.offset().left,
           'scrollTop': $target.offset().top
       }, 900, 'swing', function () {
           window.location.hash = target;
       });
   });
});

CSS

html {
font: 100% 'PT Sans', sans-serif;
height:100%;
width:100%;
margin:0%;
padding:0%;
}
body {
    font-size:1.25em;
    width:100%;
    margin:0%;
    padding:0%;
    overflow:hidden;
}

    header {
        width:100%;
        position:fixed;
        z-index:5000;
        top:0%;
        left:0%;
        padding:0%;
        margin:0%;
        background:silver;
        }


    /*################################ NAV ################################*/

        nav ul {
            list-style:none;
        }
            nav ul li {
                display:inline;
                margin-right:5px;
            }


/*################################ WRAPPER ################################*/

    .wrapper {
        width:1000%; /* #PAGES X 100% */
        height:100%;
    }

/*################################ PAGES ################################*/

        .page-container {
            width:10%; /* 1 / #PAGES */
            display:inline-block;
            vertical-align:top;
            padding:0%;
            margin:0%;
            margin-right:-5px;
        }
            .page-container:nth-child(even) {
                background:lightgreen;
            }
            .page-container:nth-child(odd) {
                background:lightblue;
            }
            .page-contents {
                padding:10% 0%;
                width:61%;
                margin-left:auto;
                margin-right:auto;
                background:grey;
            }

HTML

<body>
    <header>
        <nav>
            <ul>
                <li><a class="main-nav" href="#home">Home</a></li>
                <li><a class="main-nav" href="#products">Products</a></li>
                <li><a class="main-nav" href="#services">Services</a></li>
                <li><a class="main-nav" href="#quote">Quote</a></li>
                <li><a class="main-nav" href="#about">About</a></li>
                <li><a class="main-nav" href="#contact">Contact</a></li>
            </ul>
        </nav>
    </header>
    <div class="wrapper">
        <div class="page-container" id="home">
            <div class="page-contents">
            home
            </div>
        </div>
        <div class="page-container" id="products">
            <div class="page-contents">        
            products
            </div>
        </div>
        <div class="page-container" id="part-list">
            <div class="page-contents">        
            part list catalog
            </div>
        </div>        
        <div class="page-container" id="services">
            <div class="page-contents">        
            services
            </div>
        </div>
        <div class="page-container" id="quote">
            <div class="page-contents">        
            quote request
            </div>
        </div>
        <div class="page-container" id="about">
            <div class="page-contents">        
            about
            </div>
        </div>
        <div class="page-container" id="contact">
            <div class="page-contents">        
            contact page
            </div>
        </div>
        <div class="page-container" id="inquiries">
            <div class="page-contents">        
            solution inquiries
            </div>
        </div>
        <div class="page-container" id="news">
            <div class="page-contents">        
            news
            </div>
        </div>
        <div class="page-container" id="legal">
            <div class="page-contents">        
            legal info
            </div>
        </div>
    </div>
</body>

Это огромный удар по этому проекту, так как эта конкретная функциональность была тем, что мне было нужно. Любая помощь будет принята с благодарностью!


person Todd    schedule 24.02.2014    source источник
comment
У меня эта скрипка работает в Firefox (27.0.1).   -  person Phil H    schedule 24.02.2014
comment
Я попробовал скрипку, и она отлично работает в Firefox (последняя версия).   -  person tcj    schedule 24.02.2014
comment
Я вижу проблему, используя Chrome. Если вы перейдете на вторую страницу, затем на третью, затем щелкните правой кнопкой мыши в окне скрипки и нажмите «Назад», третья страница, службы, останется там, где она есть, но сместится примерно на 1 пиксель. Можете ли вы уточнить, какие браузеры/устройства вы используете для этого и есть ли у вас какие-либо другие функции или события, которые могут быть связаны с этим поведением?   -  person Lazerblade    schedule 24.02.2014
comment
@Lazerblade, я видел поведение во всех своих браузерах (Chrome, Firefox, IE, Opera и Safari; последние версии), поэтому не счел нужным упоминать. Виноват. tcj, у меня тоже поначалу работало. Очень странно.   -  person Todd    schedule 24.02.2014


Ответы (2)


Это должно решить вашу проблему:

ДЕМО

$(document).ready(function () {
    $('.main-nav').on('click', function (e) {
        e.preventDefault();
        var toTarget = $(this).attr('href');
        history.pushState(null, null, toTarget);
        $(window).triggerHandler('hashchange');
    });
});

$(window).on('hashchange', function () {
    if(!window.location.hash) return;
    var $target = $(window.location.hash);
    $('html, body').stop().animate({
        scrollLeft: $target.offset().left,
        scrollTop: $target.offset().top
    }, 900, 'swing');
});
person A. Wolff    schedule 24.02.2014
comment
Это, кажется, сделало свое дело, по большей части. В IE (последняя версия) он выполняет эту функцию, но не перефразирует. В Opera он не вернется на домашнюю страницу (я полагаю, из-за того, что начальная страница не имеет хеш-значения). - person Todd; 24.02.2014
comment
Прошло немного времени, но мне было интересно, не могли бы вы взглянуть на новую проблему, с которой я столкнулся, используя предоставленный вами скрипт: stackoverflow.com/questions/22677016/ - person Todd; 27.03.2014

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

Вернуться на главную

Некоторые браузеры плохо работают при попытке вернуться на домашнюю страницу, поскольку она не имеет хеш-значения.

Исправление хэша главной страницы

function hashHome() {
    var currentHash = location.hash;
    var homeHash = '#home';
    if (currentHash == '') {
        history.pushState(null, null, homeHash);
    }
}
hashHome();

Проблема с одновременной прокруткой Webkit

ОГРОМНАЯ проблема в некоторых браузерах webkit, особенно мобильных (читай iOS!!!), заключается в том, что когда вы одновременно прокручиваете по горизонтали и вертикали, то в конечном итоге вы получаете разбрызгиваемый, нервный беспорядок, который возвращает вас туда, где вы начали. Довольно разрушительно и очень озадачивает.

Сначала я подумал, что это произошло из-за того, что браузер не хеширует новые значения, но позже я понял, что новые значения были там, просто не «сообщались» в область просмотра. Адресная строка iOS (7+) не показывает изменения по мере их возникновения, только после нажатия на адресную строку (DOI! упс, надо было попробовать это первым делом...) я понял это вне. Назовите меня сумасшедшим, но если ваш код опирается на что-то одно (новое значение хеш-функции), а это явно не происходит, вы можете предположить (как и я), что причина, по которой код не работает, связана с одной вещью то, что вы «видите», не происходит.

Полное объяснение: Горизонтальный одностраничный сайт: проблемы с прокруткой и перелистыванием в мобильном Webkit

Функция щелчка остается такой же, как у Вольфа.

Исправление кроссбраузерности

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

    if(!window.location.hash) return;
    var target = $(window.location.hash);
    var targetHash = window.location.hash;

    var iOS = ( navigator.userAgent.match(/(iPad|iPhone|iPod)/g) ? true : false );

    var currentPosition = $(window).scrollLeft();

    var targetPosLeft = target.offset().left;

    var targetPosTop = target.offset().top;

    function unbindWindow() { $(window).unbind('scroll'); }

    function repositionWin() {
        unbindWindow();
        $(window).on('scroll', function() {
            var alteredPosLeft = $(window).scrollLeft();
            var alteredPosTop = $(window).scrollTop();          
            if (alteredPosLeft != targetPosLeft) {
                window.scrollTo(targetPosLeft, alteredPosTop),
                unbindWindow(),
                repositionWin();
            }           
        });
    }

    function fadePages() {
        if (targetPosLeft == currentPosition) {
        }
        else {
            function fadePageOut() {
                $('.page-container').stop(true,false).animate({
                    opacity: "0.25",
                    transition: "opacity 0.1s 0.0s ease"
                });
            }
            function fadePageIn() {
                $('.page-container').stop(true,false).animate({
                    opacity: "1.0",
                    transition: "opacity 0.3s 0.0s ease"
                });
            }
            fadePageOut();
            setTimeout (fadePageIn, 900);
        }
    }

    function pageChange() {
        if (jQuery.browser.mobile === true) {
            if (iOS === true) {
                unbindWindow();
                $('html,body').stop(true,false).animate({
                    scrollLeft: targetPosLeft}, 1400);
                    setTimeout (repositionWin, 1500);
            }
            else {
                unbindWindow();
                $('html,body').stop(true,false).animate({
                    scrollLeft: targetPosLeft}, 1200, function() {
                        $(this).stop(true,false).animate({
                            scrollTop: targetPosTop
                        }, 200, repositionWin);
                });
            }
        }
        else {
            fadePages();
            unbindWindow();
            $('html,body').stop(true,false).delay(100).animate({
                scrollLeft: targetPosLeft,
                scrollTop: targetPosTop
            }, 1300, repositionWin);
        }
    }   
    if ($('#mini-site-menu-button-container').is(':visible') === true && $('#main-menu-wrapper').hasClass('show-main-menu') === true) {
        setTimeout (pageChange, 300)
    }
    if ($('.footer-container').is(':visible') === true) {
        setTimeout (pageChange, 500)
    }
    if ($('.form-instructions-wrapper').hasClass('expand-form-instruct') === true) {
        setTimeout (pageChange, 500)
    }
    if ($('.quick-quote-container').hasClass('toggle-open') === true) {
        setTimeout (pageChange, 500)
    }
    if ($('#mini-site-menu-button-container').is(':visible') === false && $('.footer-container').is(':visible') === false && $('.form-instructions-wrapper').hasClass('expand-form-instruct') === false && $('.quick-quote-container').hasClass('toggle-open') === false) {
        pageChange();
    }
    if ($('#main-menu-wrapper').hasClass('show-main-menu') === false && $('.footer-container').is(':visible') === false && $('.form-instructions-wrapper').hasClass('expand-form-instruct') === false && $('.quick-quote-container').hasClass('toggle-open') === false) {
        pageChange();
    }

});

Дополнительные примечания

Я удалил большую часть своего дополнительного кода, но оставил условные операторы в конце, чтобы показать, как можно вызвать изменение страницы на мобильном сайте. В зависимости от того, как вы решите разрешить пользователю перемещаться по вашей странице (я решил вывести свое меню слева, отсюда и «переключение-открытие»), вы захотите дать время другим анимациям завершиться, прежде чем вы запустите анимация прокрутки. Для большинства мобильных устройств, как правило, достаточно много одновременной обработки. Я все еще слишком молод, чтобы понять, как анимация работает, поэтому я решил это.

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

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

person Todd    schedule 25.04.2014