Прокрутка до определенного div с помощью window.onload без добавления веб-адреса

Я создаю страницу с 5 div. Я использую следующий код JavaScript для плавного перемещения между ними по горизонтали:

    $(function () {
    $('ul.nav a').bind('click', function (event) {
        var $anchor = $(this);
        $('html, body').stop().animate({
        scrollLeft: $($anchor.attr('href')).offset().left
        }, 1500,'easeInOutExpo');

        event.preventDefault();
    });
});

Дивы примерно такие:

 <div class="section white" id="section5">
            <h2>Technologies</h2>
            <p>
                text

            </p>
            <ul class="nav">
                <li><a href="#section1">1</a></li>
                <li><a href="#section2">2</a></li>
                <li><a href="#section3">3</a></li>
                <li><a href="#section4">4</a></li>
                <li>5</li>
            </ul>
        </div> 

Я хочу начать с элемента div # 3 при загрузке страницы. Единственное решение, которое сработало, — это функция onload:

window.onload = window.location.hash = 'section3';

но, к сожалению, когда я загружаю страницу, URL-адрес

http://localhost:51551/trial1/MainPage.aspx#section3

даже когда я нажимаю на якоря другой страницы (div) и перехожу туда, URL-адрес привязан к MainPage.aspx#section3.

Я попробовал решения здесь: jQuery: как прокрутить до определенного якоря/div при загрузке страницы?

Но я думаю, что, поскольку я уже использую Javascript для навигации по div, он не работает. Я хочу либо:

  1. Удалите часть адреса #section3 и продолжайте использовать функцию загрузки.

  2. Еще лучше перейти к разделу 3 в начале и изменить URL-адрес при изменении раздела.

Я использую Visual Studio 2010 Express с ASP.NET, JS и C#. в Windows 8.1


person Sherbieny    schedule 05.10.2014    source источник


Ответы (2)


Во-первых, следующее важное различие:

  • Селектор jQuery #section1 ищет элемент HTML с идентификатором "section1", т. е. <div id="section1"></div>
  • Хэш URL-адреса href #section1 ищет якорь с именем "section1", т. е. <a name="section1"></a>

Это основное отличие, которое вам нужно проверить и понять. Итак, вам обычно нужно:

<a name="section1"></a>
<div id="section1">... your content here ...</div>

Но так как вы прокручиваете горизонтально, я собираюсь сделать это без части <a name=...></a> и иметь дело с хешем в обработчике загрузки окна, как я объясню ниже.

Далее, я бы не стал называть переменную JavaScript «событием», так как это очень похоже на ключевое слово, поэтому попробуйте переименовать ее в ev.

Если вы хотите, чтобы обработчик кликов (функция, которую вы привязываете к событию click) не следовал по ссылке, по которой щелкнули, эта функция должна возвращать false:

$('ul.nav a').click(function (ev) {
    var anchor = $(this);
    $('.viewport').stop().animate({
        scrollLeft: $($(anchor).attr('href')).offset().left
    }, 1500,'easeInOutExpo');

    // Add the section ID to the URL
    window.location.hash = $(anchor).attr('href').substring(1);

    ev.preventDefault();
    return false;
});

Затем я предлагаю вам переместить <ul class="nav">...</ul> за пределы разделов разделов, чтобы вам не приходилось повторять это внутри ваших разделов. Поскольку вы, кажется, прокручиваете влево/вправо, я предполагаю, что вы перемещаете свои разделы div рядом друг с другом в широком контейнере:

<div class="viewport">
    <div class="container clearfix">
        <div class="section" id="section1">
            <h2>Technologies</h2>
            <p>Text</p>
        </div>
        <div class="section" id="section2">
            ... content ...
        </div>
        <div class="section" id="section3">
            ... content ...
        </div>
    </div>
</div>
<ul class="nav">
    <li><a href="#section1">1</a></li>
    <li><a href="#section2">2</a></li>
    <li><a href="#section3">3</a></li>
</ul>

Используя следующий CSS (в качестве примера для 3 элементов div по 600 пикселей, размещенных рядом друг с другом внутри контейнера размером 1800 пикселей, обернутых окном просмотра размером 600 пикселей):

.viewport {
  width: 600px;
  overflow: hidden;
  overflow-x: scroll;
}
.container {
  width: 1800px;
}
.section {
  float: left;
  width: 600px;
}

Чтобы узнать о классе clearfix, обратитесь к clearfix от Bootstrap.

Поскольку вы прокручиваете горизонтально, я думаю, что <a name=...></a> вещи не будут работать, поэтому я бы сделал проверку загрузки для хэша и прокручивал там при доступе к странице с предустановленным хэшем. Это было сделано в обработчике загрузки окна в следующем фрагменте вместе с запуском в разделе 3, когда не указан хэш:

Что касается запуска в разделе 3 при загрузке, добавьте это в свой обработчик $(window).load(), например:

$(window).load(function() {
   var startSection = window.location.hash;
   if (startSection == "") startSection = '#section3';

   $('.viewport').scrollLeft($(startSection).offset().left);
   window.location.hash = startSection;
});

Отказ от ответственности: непроверенный код! :) Но, пожалуйста, попробуйте это, и это должно приблизить вас к тому, чего вы пытаетесь достичь.

Надеюсь это поможет!

person Wouter Thielen    schedule 05.10.2014
comment
Спасибо за быстрый ответ, к сожалению, он не изменился. - person Sherbieny; 05.10.2014
comment
@user1821444 user1821444 Вы видели мой комментарий об именах привязок и идентификаторах div? JQuery видит #section3 как элемент с идентификатором section3, а href=#section3 ищет привязку с именем section3. - person Wouter Thielen; 05.10.2014
comment
Спасибо !!. ваш новый комментарий сначала не загружался - я использовал ваше решение по переходу в раздел по умолчанию, и оно сработало. так что теперь я начинаю с 3 без добавления URL-адреса --- Однако я не добавлял return false; часть, так как я на самом деле не знаю, что такое функция-обработчик :) --- Также я добавил предложенное вами ‹a name=›, и это ничего не изменило --- Но в любом случае теперь это сработало !!! Спасибо. Если вы можете посоветовать, как я могу теперь представить имя раздела в URL-адресе при навигации, это было бы здорово - person Sherbieny; 05.10.2014
comment
Я обновил ответ. Надеюсь, что он охватывает все ваши вопросы! - person Wouter Thielen; 06.10.2014
comment
Новое решение не сработало :( когда я удалил навигатор за пределами div, он просто остался на первой странице и не появился на всех страницах - person Sherbieny; 10.10.2014
comment
Что вы имеете ввиду: // Добавить ID раздела в URL?? - person Sherbieny; 10.10.2014
comment
Мне удалось переставить его, так что теперь навигация находится снаружи и работает, но переход Javascript не работает. Нужно ли мне что-то добавить к javascript, который вы упомянули выше? Примечание. Я изменил идентификаторы разделов на (Главная, Свяжитесь с нами, О нас , ....) имеет ли это значение в функции Javascript - person Sherbieny; 10.10.2014
comment
Ах, я думаю, что я сделал ошибку. Это область просмотра, которая должна прокручиваться. В этом случае именно .viewport должен получать прокрутку, а не html/body. Я обновил код JavaScript в ответе. // начинает однострочный комментарий, так что это просто комментарий, сообщающий вам, что делает следующая строка. Идентификаторы разделов не должны содержать пробелов. И да, это важно. Если в JavaScript вы ссылаетесь на что-то $('#name'), он ищет элемент с точно id=name в качестве атрибута. - person Wouter Thielen; 10.10.2014

Почему бы вам не перейти к этому div при загрузке окна? И измените привязку с помощью on, начиная с jQuery 1.7 .on() является предпочтительным методом для прикрепления обработчиков событий к документу.

Итак, ваш код должен быть примерно таким

$(document).ready( function(){
    $('ul.nav a ').on('click ', function (event) {
        var $anchor = $(this);
        $('html, body ').stop().animate({
            scrollLeft: $($anchor.attr('href')).offset().left
        }, 1500, 'easeInOutExpo ');

        event.preventDefault();
    });
});


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

    $('html, body').stop().animate({
        scrollLeft: $('#section3').offset().left
    }, 1500, 'easeInOutExpo ');

});
person Bojan Petkovski    schedule 05.10.2014
comment
Это решение не сработало, анимация, которая работала раньше, не работала, и она не начиналась в разделе 3 --- Обратите внимание, что у меня нет опыта работы с jQuery. - person Sherbieny; 05.10.2014