Selon Bootstrap 3 docs, j'ai ajouté les attributs suivants à une barre de navigation:
<nav class="navbar no-margin-bottom" data-spy="affix" data-offset-top="90" >
...
</nav>
Après avoir fait défiler la page, Bootstrap 4 n’ajoute pas de classe à la barre de navigation qui est affixée. Quelqu'un peut-il me dire comment résoudre ce problème? Bootstrap.js et jQuery.js fonctionnent.
Bien que l'affixe soit supprimé de Bootstrap dans la version 4. Toutefois, vous pouvez atteindre votre objectif avec ce code jQuery:
$(window).on('scroll', function(event) {
var scrollValue = $(window).scrollTop();
if (scrollValue == settings.scrollTopPx || scrollValue > 70) {
$('.navbar').addClass('fixed-top');
}
});
À partir de la documentation de bootstrap v4:
Supprimé le plugin Affix jQuery. Nous vous recommandons d'utiliser plutôt un
position: sticky
polyfill. Voir l'entrée HTML5 Please pour plus de détails et des recommandations spécifiques sur Polyfill.Si vous utilisiez Affix pour appliquer des styles supplémentaires non -
position
, il est possible que les remplissages multiples ne prennent pas en charge votre cas d'utilisation. Une option pour de telles utilisations est la bibliothèque tierce ScrollPos-Styler .
Update Bootstrap 4
Les docs recommandent le polyfill collant, et le ScrollPos-Styler recommandé n’aide pas vraiment la position du défilement (vous pouvez facilement définir un décalage).
Je pense que c'est plus facile d'utiliser jQuery pour regarder la fenêtre défiler et changer le CSS en conséquence ...
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));
});
Affixe Bootstrap 4 (barre de navigation collante)
EDIT: Une autre solution consiste à utiliser ce port du plugin 3.x Affix en remplacement dans Bootstrap 4 ..
http://www.codeply.com/go/HmY7DLHLkI
Selon la citation de Vucko dans les documents Mirgation, ScrollPos-Styler library me convenait assez bien.
.js ScrollPos-Styler
(scrollPosStyler.js
) sur votre page.<div>
pertinent que vous souhaitez rendre 'collant'<nav class="navbar navbar-toggleable-md">
sps sps--abv
classe<nav class="navbar navbar-toggleable-md sps sps--abv">
.css
que vous souhaitez déclencher une fois que l’élément est devenu collant (Selon la page de démonstration ./**
* '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
}
S'appuyer sur la réponse d'Anwar Hussain. J'ai trouvé le succès avec ceci:
$(window).on('scroll', function (event) {
var scrollValue = $(window).scrollTop();
if (scrollValue > 120) {
$('.navbar').addClass('affix');
} else{
$('.navbar').removeClass('affix');
}
});
Cela appliquera la classe à la barre de navigation lors du défilement, mais supprimera également la classe lors du défilement. Auparavant, lors du défilement, la classe appliquée restait appliquée à la barre de navigation.
$(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');
}
});
Pour les utilisateurs qui recherchent une réponse en Javascript pur, voici comment procéder:
window.onscroll = (e) => {
let scrollValue = window.scrollY;
if (scrollValue > 120) {
document.querySelector('.navbar').classList.add('affix');
} else{
document.querySelector('.navbar').classList.remove('affix');
}
}
Après avoir essayé toutes les solutions que je pouvais trouver (et sachant que cet affixe avait été retiré de bootstrap 4), la seule façon d'obtenir les résultats collants souhaités était d'utiliser sticky-kit .
C’est un plugin jQuery très simple et facile à configurer.
Il suffit d’inclure le code dans votre projet, puis d’affecter l’élément que vous souhaitez conserver.
$("#sidebar").stick_in_parent();