Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.01.2019, 14:39
Интересующийся
Отправить личное сообщение для windcrack Посмотреть профиль Найти все сообщения от windcrack
 
Регистрация: 03.02.2018
Сообщений: 13

допилить active к селектору.
Есть скрипт горизонтальной прокрутки:
(function ($) {
    'use strict';
    $.fn.horizon = function (options, i) {
        if (options === 'scrollLeft') {
            scrollLeft();
        } else if (options === 'scrollRight') {
            scrollRight();
        } else if (options === 'scrollTo') {
            if (isNumeric(i)) {
                scrollTo(+i, $.fn.horizon.defaults.scrollDuration);
            } else {
                scrollToId(i, $.fn.horizon.defaults.scrollDuration);
            }
        } else {
            $.extend($.fn.horizon.defaults, options);

            $.fn.horizon.defaults.sections = this;
            $.fn.horizon.defaults.limit = this.length;
            $.fn.horizon.defaults.i = 0;

            sizeSections();

            $(document).on('mousewheel DOMMouseScroll', function (e) {
                // Equalize event object.
                var evt = window.event || e;
                // Convert to originalEvent if possible.
                evt = evt.originalEvent ? evt.originalEvent : evt;
                // Check for detail first, because it is used by Opera and FF.
                var delta = evt.detail ? evt.detail * (-40) : evt.wheelDelta;

                scrollAction(delta);
            }).on('click', '.horizon-next', function () {
                scrollRight();
            }).on('click', '.horizon-prev', function () {
                scrollLeft();
            }).on('click', 'a[href^="#"]', function () {
                var hash = $(this).attr('href');
                if (-1 < hash.indexOf('#')) {
                    scrollToId(hash.split('#')[1], $.fn.horizon.defaults.scrollDuration);
                    selectActive();
                } 
            });
            
            
            if ($.fn.horizon.defaults.swipe) {
                $(document).swipe({
                    // Generic swipe handler for all directions.
                    swipe: function (event, direction, distance, duration, fingerCount) {
                        if (scrolls[direction]) {
                            scrolls[direction]();
                        }
                    },
                    /*click: function (event, target) {
                     event.preventDefault();
                     event.stopPropagation();
                     event.stopImmediatePropagation();

                     //$(target).click();
                     },
                     tap: function (event, target) {
                     event.preventDefault();
                     event.stopPropagation();
                     event.stopImmediatePropagation();

                     $(target).click();
                     },*/
                    // Default is 75px, set to 0 for demo so any distance triggers swipe
                    threshold: 75
                });
            }

            $(window).on('resize', function () {
                sizeSections();
            }).on('keydown', function (e) {
                if (scrolls[e.which]) {
                    scrolls[e.which]();
                    e.preventDefault();
                }
            });

            return this;
        }
    };

    $.fn.horizon.defaults = {
        scrollTimeout: null,
        scrollEndDelay: 250,
        scrollDuration: 600,
        i: 0,
        limit: 0,
        docWidth: 0,
        sections: null,
        swipe: true,
        fnCallback: function (i) {
        }
    };

    function isNumeric(num) {
        return !isNaN(num)
    }

    function scrollToId(id, speed) {
        var i = -1;
        $.fn.horizon.defaults.sections.each(function (index, element) {
            if (id === $(this).attr('id')) {
                i = index;
            }
        });

        if (0 <= i) {
            scrollTo(i, $.fn.horizon.defaults.scrollDuration);
        }
    }

    // HTML animate does not work in webkit. BODY does not work in opera.
    // For animate, we must do both.
    // [url]http://stackoverflow.com/questions/8790752/callback-of-animate-gets-called-twice-jquery[/url]
    var scrollTo = function (index, speed) {
        if (index > ($.fn.horizon.defaults.limit - 1) || index < 0) {
            console.log('Scroll where? I think you want me to go out of my limits. Sorry, no can do.');
            return;

        }
        // selectActive();
        console.log('Scroll to: ' + index);
        $.fn.horizon.defaults.i = index;

        var $section = $($.fn.horizon.defaults.sections[index]);
        $('html,body').animate({scrollLeft: $section.offset().left}, speed, 'swing', $.fn.horizon.defaults.fnCallback(index));

        
    };

    let selectActive = function(){
        let elementActive = document.querySelectorAll('.sec');
        if (!$(elementActive).hasClass('active')) {
            $(elementActive).toggleClass('active');
        }else if($(elementActive).hasClass('active')){
            $(elementActive).toggleClass('active');
        }
    }

    var scrollLeft = function () {
        console.log('Scroll left');
        var i2 = $.fn.horizon.defaults.i - 1;
        if (i2 > -1) {
            scrollTo(i2, $.fn.horizon.defaults.scrollDuration);
            selectActive();
        }else if($.fn.horizon.defaults.i == 0){
            scrollTo($.fn.horizon.defaults.limit - 1);
        }   
    };

    var scrollRight = function () {
        console.log('Scroll right');
        var i2 = $.fn.horizon.defaults.i + 1;

        if (i2 < $.fn.horizon.defaults.limit) {
            scrollTo(i2, $.fn.horizon.defaults.scrollDuration);
        }else if($.fn.horizon.defaults.limit){
            scrollTo($.fn.horizon.defaults.i = 0);
        }
        selectActive();
    };

    // Executes on 'scrollbegin'.
    var scrollBeginHandler = function (delta) {
        // Scroll up, Scroll down.
        if (delta > 1 || delta == 0) {
            scrollLeft();
            // selectActive();
        } else if (delta < -1) {
            scrollRight();
            // selectActive();
        }
    };

    // Executes on 'scrollend'.
    var scrollEndHandler = function () {
        $.fn.horizon.defaults.scrollTimeout = null;
    };

    var scrollAction = function (delta) {
        if ($.fn.horizon.defaults.scrollTimeout === null) {
            scrollBeginHandler(delta);
        } else {
            clearTimeout($.fn.horizon.defaults.scrollTimeout);
        }

        $.fn.horizon.defaults.scrollTimeout = setTimeout(scrollEndHandler, $.fn.horizon.defaults.scrollEndDelay);
    };

    var sizeSections = function () {
        var iInnerWidth = $(window).innerWidth();

        // Store window width and assign it to each panel or section.
        $.fn.horizon.defaults.docWidth = iInnerWidth;
        $.fn.horizon.defaults.sections.each(function () {
            $(this).width(iInnerWidth);
        });

        // Set the page to be a width large enough to include all panels.
        $('html').width($.fn.horizon.defaults.limit * iInnerWidth);

        // Scroll to current section without animation.
        scrollTo($.fn.horizon.defaults.i, 0);
    };

    var scrolls = {
        'right': scrollLeft,
        'down': scrollLeft,
        'left': scrollRight,
        'up': scrollRight,
        37: scrollLeft,
        38: scrollLeft,
        39: scrollRight,
        40: scrollRight
    };

})
(jQuery);

В нем я сделал фунцию
let selectActive = function(){
        let elementActive = document.querySelectorAll('.sec');
        if (!$(elementActive).hasClass('active')) {
            $(elementActive).toggleClass('active');
        }else if($(elementActive).hasClass('active')){
            $(elementActive).toggleClass('active');
        }
    }

Мне надо что бы при скролле или клике в вехнем меню добавлялся класс active. Сейчас он добавляется но всем элементам в меню. И удаляется у первого установленного. А надо что бы он добавлялся только тому элементу на который перешли или скроллом или кликом.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
выбрать поля по селектору oleg666 jQuery 3 16.10.2016 17:12
active class porezon Общие вопросы Javascript 5 19.07.2016 09:52
Как при аякс запросе вытащить теги по селектору из того, что он вернул? Hurray jQuery 0 16.04.2014 18:45
Допилить большую либу pva1967 Работа 1 29.12.2012 21:30
:hover и :active у дочерних и родительских элементов Dimus Элементы интерфейса 6 03.06.2012 19:54