Есть ли лучший способ достичь таких же результатов? Одностраничные сайты

0

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

Вот предварительный просмотр веб-сайта, который я создал, используя технику, которую вы увидите ниже: http://spacehopperdesign.co.uk

Пожалуйста, просмотрите этот скрипт для HTML и JavaScript, который я использую, игнорируйте CSS, поскольку он ничего не делает: http://jsfiddle.net/J2kjA

Моя проблема: я хочу, чтобы кнопки получали класс. Active, когда отображается их раздел, я знаю, что мне удалось заставить его работать, как вы заметили в режиме предварительного просмотра. Но, как вы увидите в Fiddle, JS, который я использую, немного сложна, и я действительно запутаюсь, особенно когда работаю над большим проектом со многими разделами с ним.

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

Вот и JS:

$(document).ready(function() {

    //Prevent clicking on .active links
    'use strict'; $('.active').click(function(a) {
        a.preventDefault();
    });

    //Menu Scrolling To Sections//
    $(document).ready(function () {
    $('a[href*=#]:not([href=#])').click(function() {
    if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') 
        || location.hostname == this.hostname) {

        var target = $(this.hash);
        target = target.length ? target : $('[name=' + this.hash.slice(1) +']');

        if (target.length) { 
            var topPadding = 50; 
        if($(window).width() > 1030) 
            topPadding = 80; 
        $('html,body').animate({ 
            scrollTop: target.offset().top - topPadding }, 700);
        return false;
        }}});
    });


    $(window).scroll(function(){ 
    var scrollHeight = $(window).scrollTop() + 200; 

    var index = $('#Index').offset().top; 
    var sectionA = $('#SectionA').offset().top; 
    var sectionB = $('#SectionB').offset().top; 
    var sectionC = $('#SectionC').offset().top; 

        $('#mainMenu li a').removeClass('active'); 

        if(scrollHeight >= index && scrollHeight < sectionA) 
        $('#index').addClass('active'); 

        if(scrollHeight >= sectionA && scrollHeight < sectionB) 
        $('#sectionA').addClass('active'); 

        if(scrollHeight >= sectionB && scrollHeight < contact) 
        $('#sectionB').addClass('active'); 

        if(scrollHeight >= sectionC) 
        $('#sectionC').addClass('active'); 
    });


}); 

и HTML:

        <header id="headerWrapper">
            <div id="headerContent">
                <nav>
                    <ul id="mainMenu"><!--Main Menu-->
                        <li><a class="active" href="#Index" id="index">Welcome</a></li>
                        <li><a href="#SectionA" id="sectionA">SectionA</a></li>
                        <li><a href="#SectionB" id="sectionB">SectionB</a></li>
                        <li><a href="#SectionC" id="sectionC">Contact</a></li>
                    </ul>
                </nav>

            </div>
        </header>

        <div id="page"><!--Main Container-->

            <div id="Index" class="wrapper">
                <div class="content">

                </div>
            </div>  

            <div id="SectionA" class="wrapper">
                <div class="content">

                </div>
            </div> 

            <div id="SectionB" class="wrapper">
                <div class="content">

                </div>
            </div> 

            <div id="SectionC" class="wrapper">
                <div class="content">

                </div>
            </div>        
</div>
  • 0
    Если вы передумаете над плагинами, вы можете использовать fullPage.js с опцией autoScrolling:false .
  • 0
    Ссылки не работают, приятель
Показать ещё 2 комментария
Теги:
scroll

3 ответа

1

Вы пытались использовать JQuery для добавления класса к кнопке? ИСПЫТАНИЯ И РАБОТЫ http://jsfiddle.net/J2kjA/7/

Сначала добавьте еще один класс и данные к каждой из кнопок:

<li><a class="btn active" data-btn="index" href="#Index" id="index">Welcome</a></li>
<li><a class="btn" data-btn="sectionA" href="#SectionA" id="sectionA">SectionA</a></li>
<li><a class="btn" data-btn="sectionB" href="#SectionB" id="sectionB">SectionB</a></li>
<li><a class="btn" data-btn="sectionC" href="#SectionC" id="sectionC">Contact</a></li>

И для JavaScript:

$(document).ready(function() {

//Prevent clicking on .active links
'use strict'; $('.active').click(function(a) {
    a.preventDefault();
});

//Menu Scrolling To Sections//
$(document).ready(function () {
    $('a[href*=#]:not([href=#])').click(function() {
        if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') 
            || location.hostname == this.hostname) {

            var target = $(this.hash);
            target = target.length ? target : $('[name=' + this.hash.slice(1) +']');

            if (target.length) { 
                var topPadding = 50; 
                if($(window).width() > 1030) 
                topPadding = 80; 
                $('html,body').animate({ 
                    scrollTop: target.offset().top - topPadding }, 700);
                    return false;
                }
            }
        });
    });


$(window).scroll(function(){ 
    var scrollHeight = $(window).scrollTop() + 200; 
    var index = $('#Index').offset().top; 
    var sectionA = $('#SectionA').offset().top; 
    var sectionB = $('#SectionB').offset().top; 
    var sectionC = $('#SectionC').offset().top; 

    });
}); 


$(function(){
    $('.btn').on('click', function(){
        var btn = $(this).data("btn");
        $('#index').removeClass("active");
        $('#sectionA').removeClass("active");
        $('#sectionB').removeClass("active");
        $('#sectionC').removeClass("active");
        $('#'+btn).addClass ("active");
    });
});

http://api.jquery.com/removeClass/

  • 0
    это показывает ошибку - пропущена точка с запятой в var btn
  • 0
    Извините, я пропустил скобку var btn = $(this).data("btn");
Показать ещё 7 комментариев
0

Может быть, это:

$(document).ready(function() {

  $('#mainMenu a').click(function() {
    $('#mainMenu a').removeClass('active');
       $(this).addClass('active');
   });

   if(scrollHeight >= index && scrollHeight < sectionA) 
    {$('#index').trigger('click');} //etc

  });
  • 0
    Это добавит класс, активный к кнопкам, только если щелкнуть на них только: /
  • 0
    Запустите щелчок с высотой прокрутки.
0

Я нашел эту функцию для вас:

function isScrolledIntoView(elem)
{
    var docViewTop = $(window).scrollTop();
    var docViewBottom = docViewTop + $(window).height();

    var elemTop = $(elem).offset().top;
    var elemBottom = elemTop + $(elem).height();

    return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
}

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

$(window).scroll(function(){ 
    if(isScrolledIntoView($('#SectionA'))){
        $('#sectionA').addClass('active');
    }
}
  • 0
    Это своего рода работа, однако кнопки в навигации также должны получить класс .active не только при нажатии, но и при физической прокрутке, и появляется их раздел.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню