Фискированное меню в мобильной версии сайта

11.05.2019
5418 просмотров

Популярный фреймворк Bootstrap 4 имеет простое встроенное решение для реализации фиксированного верхнего меню, надо всего лишь добавить класс «fixed-top» к нужному элементу, например к «nav». Но как быть, если хочется прилепить верхнее меню только в мобильной версии сайта? Тут на помощь приходит Java скрипт, использующий библиотеку jQuery которая так же поставляется в пакете с бутстрапом.

Добавляем к дефолтному Bootstrap 4 Navigation Bar элементу «nav» идентификатор «id="stick_menu"»

<nav id="stick_menu" class="navbar navbar-expand-md bg-dark navbar-dark">
    <!-- Toggler/collapsibe Button -->
    <button data-target="#navbar" class="navbar-toggler" type="button" data-toggle="collapse">
    <span class="navbar-toggler-icon"></span>
    </button>
    <!-- Navbar links -->
    <div id="navbar" class="collapse navbar-collapse">
        <ul class="navbar-nav">
            <li class="nav-item">
                <a class="nav-link" href="#">Link</a>
            </li>
        </ul>
    </div> 
</nav>

и подключаем к странице скрипт:

(function(window, $){
    var $window = $(window),
        isWindowLoad = false;
    $window.on('load', function(){
        isWindowLoad = true;
    });
    function log(){
        console.log.apply(console, arguments);
    }
    $(document).ready(function(){
        function initMenu(){
            var $hNav = $('#stick_menu'); /*ID фиксируемого элемента*/
            function checkScroll(e, init){
                init = init || false;
                if ($window.scrollTop() > 120) { /*Высота срабатывания*/
                    if ($('#navbar').is(':hidden')) { /*Триггер переключения*/
                    $hNav.addClass('fixed-top');}
                } else {
                    $hNav.removeClass('fixed-top');
                }
            }
            checkScroll(null, true);
            $window.on('scroll.checkScroll', checkScroll);
        }
       initMenu();
    });
}(window, window.jQuery));

Скрипт отработает только когда верхнее меню изменится с десктопного на планшетный\мобильный вид, высота прокрутки на которой включится триггер задаётся в пикселях, замерить нужную высоту можно с помощью расширения Page Ruler для Google Chrome или аналогов. Триггером переключения является имя связки «button data-target» блока Toggler/collapsibe Button и «div id» блока Navbar links из примера выше. Если вы используете отличное от по-умолчанию имя, не забудьте поменять его и в коде скрипта.

Идентификатор «id="stick_menu"» не обязательно прикручивать к «nav», можно к любому контейнеру, который содержит меню и который требуется зафиксировать при прокрутке, например:

<div class="container-fluid" id="stick_menu">
    <div class="row">
        <nav class="navbar navbar-expand-lg bg-dark navbar-light">
...
        </nav>
    </div>
</div>

Ну и, разумеется, ID можно заменить на свой, не забыв поменять его и в коде java-скрипта.

Важно:

Скрипт должен идти ПОСЛЕ вызова jQuery

Дополнение

Можно использовать упрощённую версию скрипта, так же отлично работает:

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

    if (scroll >= 250) { /*Высота срабатывания*/
        if ($('#navbar').is(':hidden')){ /*Работает только на бутстрап-триггер XS*/
        $("#stick_menu").addClass("fixed-top");}
    }
    else {
        $("#stick_menu").removeClass("fixed-top");
    }
});

 

Оставьте комментарий