La documentation de démarrage sur ce sujet est un peu déroutant pour moi. Je souhaite obtenir le même comportement que dans les documents avec la barre de navigation affixée: la barre de navigation est située au-dessous d'un en-tête de paragraphe/page et, lors du défilement, elle devrait d'abord défiler jusqu'au sommet de la page, puis y rester fixée pour permettre des défilement plus poussés .
Comme jsFiddle ne fonctionne pas avec le concept navbar, j'ai créé une page distincte à utiliser comme exemple minimal: http://i08fs1.ira.uka.de/~s_drr/navbar.html
J'utilise ceci comme ma barre de navigation:
<div class="navbar affix-top" data-spy="affix" data-offset-top="50">
<div class="navbar-inner">
<div class="container">
<div class="span12">
<a class="brand" href="#">My Brand</a>
This is my navbar.
</div>
</div> <!-- container -->
</div> <!-- navbar-inner -->
</div> <!-- navbar -->
Je pense que je voudrais que data-offset-top
soit de valeur 0 (puisque la barre doit "coller" au sommet ") mais avec 50, il y a au moins un effet observable.
Si également mettre le code javascript en place:
<script>
$(document).ready (function (){
$(".navbar").affix ();
});
</script>
Toute aide appréciée.
J'avais un problème similaire et je pense avoir trouvé une solution améliorée.
Ne prenez pas la peine de spécifier data-offset-top
dans votre code HTML. Indiquez-le plutôt lorsque vous appelez .affix()
:
$('#nav').affix({
offset: { top: $('#nav').offset().top }
});
L'avantage ici est que vous pouvez modifier la mise en page de votre site sans avoir à mettre à jour l'attribut data-offset-top
. Comme cela utilise la position réelle calculée de l'élément, cela évite également les incohérences avec les navigateurs qui rendent l'élément à une position légèrement différente.
Vous aurez toujours besoin de fixer l'élément au sommet avec CSS. De plus, je devais définir width: 100%
sur l'élément de navigation car .nav
éléments avec position: fixed
se conduisent mal pour une raison quelconque:
#nav.affix {
position: fixed;
top: 0px;
width: 100%;
}
Une dernière chose: lorsqu'un élément apposé devient fixe, son élément ne prend plus de place sur la page, ce qui entraîne le "saut" des éléments situés en dessous. Pour éviter cette laideur, je place la barre de navigation dans une div
dont la hauteur est égale à la barre de navigation à l'exécution:
<div id="nav-wrapper">
<div id="nav" class="navbar">
<!-- ... -->
</div>
</div>
.
$('#nav-wrapper').height($("#nav").height());
Cela vient d’être implémenté pour la première fois, et voici ce que j’ai trouvé.
La valeur data-offset-top
est la quantité de pixels que vous devez faire défiler pour que l’effet d’apposition ait lieu. Dans votre cas, une fois que 50px
est fait défiler, la classe de votre élément passe de .affix-top
à .affix
. Vous voudrez probablement définir data-offset-top
à environ 130px
dans votre cas d'utilisation.
Une fois que ce changement de classe a eu lieu, vous devez positionner votre élément dans css en nommant le positionnement pour la classe .affix
. Bootstrap 2.1 définit déjà .affix
en tant que position: fixed;
; il ne vous reste donc qu'à ajouter vos propres valeurs de position.
Exemple:
.affix {
position: fixed;
top: 20px;
left: 0px;
}
Pour résoudre ce problème, j'ai modifié le plug-in affix afin d'émettre un événement jQuery lorsqu'un objet est apposé ou non.
Voici la demande de tirage: https://github.com/Twitter/bootstrap/pull/4712
Et le code: https://github.com/corbinu/bootstrap/blob/master/js/bootstrap-affix.js
Et ensuite, attachez la barre de navigation:
<script type="text/javascript">
$(function(){
$('#navbar').on('affixed', function () {
$('#navbar').addClass('navbar-fixed-top')
});
$('#navbar').on('unaffixed', function () {
$('#navbar').removeClass('navbar-fixed-top')
});
});
</script>
Vous devez supprimer .affix()
de votre script.
Bootstrap offre la possibilité d'accomplir des tâches soit via data-attributes
, soit directement en JavaScript, la plupart du temps.
Je l'ai depuis le code source de twitterbootstrap et ça marche plutôt bien:
HTML:
<div class="row">
<div class="span3 bs-docs-sidebar">
<ul id="navbar" class="nav nav-list bs-docs-sidenav">
...
</ul>
</div>
</div>
CSS:
.bs-docs-sidenav {
max-height: 340px;
overflow-y: scroll;
}
.affix {
position: fixed;
top: 50px;
width: 240px;
}
JS:
$(document).ready(function(){
var $window = $(window);
setTimeout(function () {
$('.bs-docs-sidenav').affix({
offset: {
top: function (){
return $window.width() <= 980 ? 290 : 210
}
}
})
}, 100);
});
Merci à Namuol et Dave Kiss pour la solution. Dans mon cas, j’ai eu un petit problème de hauteur et de largeur avec la barre de navigation lorsque j’utilisais afflix et collapse en même temps. Le problème avec la largeur peut être facilement résolu en héritant de l'élément parent (conteneur dans mon cas). De plus, je pouvais réussir à le réduire en douceur avec un peu de javascript (coffeescript en fait). L'astuce consiste à définir la hauteur de l'encapsuleur sur auto
avant que le basculement ne se produise, puis à le corriger après.
Balisage (haml):
#wrapper
#navbar.navbar
.navbar-inner
%a.btn.btn-navbar.btn-collapse
%span.icon-bar
%span.icon-bar
%span.icon-bar
#menu.nav-collapse
-# Menu goes here
CSS:
#wrapper {
width: inherit;
}
#navbar {
&.affix {
top: 0;
width: inherit;
}
}
Coffeescript:
class Navigation
@initialize: ->
@navbar = $('#navbar')
@menu = $('#menu')
@wrapper = $('#wrapper')
@navbar.affix({offset: @navbar.position()})
@adjustWrapperHeight(@navbar.height())
@navbar.find('a.btn-collapse').on 'click', () => @collapse()
@menu.on 'shown', () => @adjustWrapperHeight(@navbar.height())
@menu.on 'hidden', () => @adjustWrapperHeight(@navbar.height())
@collapse: ->
@adjustWrapperHeight("auto")
@menu.collapse('toggle')
@adjustWrapperHeight: (height) ->
@wrapper.css("height", height)
$ ->
Navigation.initialize()
Il vous suffit de supprimer le script. Voici mon exemple:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.0.min.js"></script>
<script type="text/javascript" src="http://netdna.bootstrapcdn.com/Twitter-bootstrap/2.1.0/js/bootstrap.min.js"></script>
<style>
#content {
width: 800px;
height: 2000px;
background: #f5f5f5;
margin: 0 auto;
}
.menu {
background: #ccc;
width: 200px;
height: 400px;
float: left;
}
.affix {
position: fixed;
top: 20px;
left: auto;
right: auto;
}
</style>
</head>
<body>
<div id="content">
<div style="height: 200px"></div>
<div class="affix-top" data-spy="affix" data-offset-top="180">
<div class="menu">AFFIX BAR</div>
</div>
</div>
</body>
</html>
Semblable à la réponse acceptée, vous pouvez également faire quelque chose comme ceci pour tout faire en une fois:
$('#nav').affix({
offset: { top: $('#nav').offset().top }
}).wrap(function() {
return $('<div></div>', {
height: $(this).outerHeight()
});
});
Ceci invoque non seulement le plugin affix
, mais enveloppe également l’élément apposé dans un div qui conserve la hauteur initiale de la barre de navigation.
Ma solution pour attacher la barre de navigation:
function affixnolag(){
$navbar = $('#navbar');
if($navbar.length < 1)
return false;
h_obj = $navbar.height();
$navbar
.on('affixed', function(){
$navbar.after('<div id="nvfix_tmp" style="height:'+h_obj+'px">');
})
.on('unaffixed', function(){
if($('#nvfix_tmp').length > 0)
$('#nvfix_tmp').remove();
});
}