Affix не работает в Bootstrap 4 (альфа)

В соответствии с Bootstrap 3 документами я добавил следующие атрибуты в навигационную панель:

<nav class="navbar no-margin-bottom" data-spy="affix" data-offset-top="90" >
...
</nav>

После прокрутки страницы Bootstrap 4 не добавляет класс на navbar, который является аффикс. Может ли кто-нибудь сказать мне, как решить эту проблему? Bootstrap.js и jQuery.js работают.

Ответ 1

Хотя аффикс удален из Bootstrap в версии 4. Однако вы можете достичь своей цели с помощью этого кода jQuery:

$(window).on('scroll', function(event) {
    var scrollValue = $(window).scrollTop();
    if (scrollValue == settings.scrollTopPx || scrollValue > 70) {
         $('.navbar').addClass('fixed-top');
    } 
});

Ответ 2

Из документации bootstrap v4:

Отбросил плагин Affix jQuery. Вместо этого рекомендуется использовать position: sticky polyfill. См. HTML5 Пожалуйста, введите для получения более подробной информации и конкретных рекомендаций polyfill.

Если вы использовали Affix для применения дополнительных стилей position, полиполки могут не поддерживать ваш прецедент. Одним из вариантов такого использования является сторонняя библиотека ScrollPos-Styler.

Ответ 3

Обновление Bootstrap 4

В документах рекомендуется использовать липкий полифилл, а рекомендуемый ScrollPos-Styler не очень помогает с позицией прокрутки (вы можете легко определить смещение).

Я думаю, что проще использовать jQuery для просмотра прокрутки окна и соответственно изменить CSS на фиксированный...

  var toggleAffix = function(affixElement, wrapper, scrollElement) {

    var height = affixElement.outerHeight(),
        top = wrapper.offset().top;

    if (scrollElement.scrollTop() >= top){
        wrapper.height(height);
        affixElement.addClass("affix");
    }
    else {
        affixElement.removeClass("affix");
        wrapper.height('auto');
    }

  };


  $('[data-toggle="affix"]').each(function() {
    var ele = $(this),
        wrapper = $('<div></div>');

    ele.before(wrapper);
    $(window).on('scroll resize', function() {
        toggleAffix(ele, wrapper, $(this));
    });

    // init
    toggleAffix(ele, wrapper, $(window));
  });

Аффикс Bootstrap 4 (липкая навигационная панель)

РЕДАКТИРОВАТЬ: Другое решение заключается в использовании этого порта плагина 3.x Affix в качестве замены в Bootstrap 4..

http://www.codeply.com/go/HmY7DLHLkI


Связанный: анимация/сжатие NavBar при прокрутке с помощью Bootstrap 4

Ответ 4

Чтобы построить ответ Анвара Хуссейна. Я нашел успех с этим:

$(window).on('scroll', function (event) {
    var scrollValue = $(window).scrollTop();
    if (scrollValue > 120) {
        $('.navbar').addClass('affix');
    } else{
        $('.navbar').removeClass('affix');
    }
});

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

Ответ 5

В соответствии с цитатой Vucko в документах Mirgation, ScrollPos-Styler библиотека мне очень понравилась.

  • Включите файл .js ScrollPos-Styler (scrollPosStyler.js) на свою страницу.
  • Найдите соответствующий <div>, который вы хотите сделать "липким"

<nav class="navbar navbar-toggleable-md">

  1. Применить sps sps--abv class

<nav class="navbar navbar-toggleable-md sps sps--abv">

  1. Добавьте стили .css, которые вы хотите активировать после того, как элемент стал липким (согласно демонстрационной странице .
/** 
 * 'Shared Styles' 
**/
.sps {

}

/** 
 * 'Sticky Above' 
 *
 * Styles you wish to apply
 * Once stick has not yet been applied
**/
.sps--abv {
   padding: 10px
}

/** 
 * 'Sticky Below' 
 *
 * Styles you wish to apply
*  Once stick has been applied
**/
.sps--blw {
   padding: 2px
}

Ответ 6

$(window).on('scroll', function (event) {
    var scrollValue = $(window).scrollTop();
    var offset = $('[data-spy="affix"]').attr('data-offset-top');
    if (scrollValue > offset) {
        $('[data-spy="affix"]').addClass('affix-top');
        var width = $('[data-spy="affix"]').parent().width();
        $('.affix-top').css('width', width);
    } else{
        $('[data-spy="affix"]').removeClass('affix-top');
    }
}); 

Ответ 7

После каждого решения, которое я смог найти (и, зная, что аффикс удален из bootstrap 4), единственный способ получить желаемые липкие результаты, которые мне нужны, это использовать sticky-kit.

Это очень простой плагин jQuery, который легко настроить.

Просто включите код в свой проект и затем назначьте элемент, который вы хотите придерживаться,

$("#sidebar").stick_in_parent();

Ответ 8

Для пользователей, которые ищут ответ в чистом Javascript, вот как вы можете сделать это, используя чистый Javascript:

window.onscroll = (e) => {
    let scrollValue = window.scrollY;
    if (scrollValue > 120) {
        document.querySelector('.navbar').classList.add('affix');
    } else{
        document.querySelector('.navbar').classList.remove('affix');
    }
}

Ответ 9

просто используйте класс с фиксированной вершиной в начальной загрузке 4 и используйте addClass и removeClass

$(window).on('scroll', function(event) {
    var scrollValue = $(window).scrollTop();
    if ( scrollValue > 70) {
         $('.navbar-sticky').addClass('fixed-top');
    }else{
       $('.navbar-sticky').removeClass('fixed-top');
    }
});