103 votes

Comment puis-je définir le décalage pour ScrollSpy dans Bootstrap ?

J'ai un site avec la barre de navigation fixée en haut et 3 divs en dessous dans la zone de contenu principale.

Je tente d'utiliser scrollspy du framework Bootstrap.

J'ai réussi à mettre en surbrillance les différentes rubriques dans le menu lorsque vous faites défiler les divs.

J'ai également réussi à faire en sorte que lorsque vous cliquez sur le menu, cela fera défiler vers la bonne partie de la page. Cependant, le décalage est incorrect (cela ne prend pas en compte la barre de navigation, donc je dois décaler d'environ 40 pixels)

Je vois sur la page Bootstrap qu'il mentionne une option de décalage mais je ne sais pas comment l'utiliser.

Je ne sais pas non plus ce que cela signifie lorsque cela dit que vous pouvez utiliser scrollspy avec $('#navbar').scrollspy(), je ne sais pas où l'inclure alors je ne l'ai pas fait et tout semble fonctionner (sauf le décalage).

Je pensais que le décalage pourrait être le data-offset='10' sur la balise body, mais cela ne change rien pour moi.

J'ai l'impression que c'est quelque chose de très évident et que je le rate tout simplement. Des conseils ?

Mon code est

...

    VIPS

             Traffic

        Temps de réponse

        CPU

...

0 votes

Pourquoi attribuez-vous une position: relative à vos divs? Peut-être que c'est ce qui cause cela. Pouvez-vous créer un jsfiddle avec votre code pour que nous puissions le voir en action?

117voto

Kurt UXD Points 1996

Bootstrap utilise un décalage pour résoudre uniquement l'espionnage, pas le défilement. Cela signifie que faire défiler jusqu'au bon endroit dépend de vous.

Essayez ceci, ça fonctionne pour moi : ajoutez un gestionnaire d'événements pour les clics de navigation.

var offset = 80;

$('.navbar li a').click(function(event) {
    event.preventDefault();
    $($(this).attr('href'))[0].scrollIntoView();
    scrollBy(0, -offset);
});

Je l'ai trouvé ici : https://github.com/twitter/bootstrap/issues/3316

3 votes

Merci pour la réponse. Il m'a fallu un certain temps pour réaliser que le décalage n'affecte pas le défilement. Cela signifie que toute personne utilisant un fixed-top doit ajuster manuellement de cette manière.

9 votes

Pour mettre à jour la section du hachage de l'URL de manière appropriée, ajoutez window.location.hash = $(this).attr('href') à cette fonction.

2 votes

Merci! Pour ce que ça vaut, mettre le data-offset dans le body est également important, car l'auteur dit que cela ne sert à rien, mais c'est nécessaire pour un espionnage approprié. Il pourrait être utile d'avoir une réponse complète.

87voto

acjay Points 4797

Le tour de magie, comme Tim l'a laissé entendre, consiste à tirer parti du padding. Donc, le problème est que votre navigateur veut toujours faire défiler votre ancre jusqu'au sommet exact de la fenêtre. Si vous positionnez votre ancre là où votre texte commence réellement, il sera occulté par votre barre de menu. Au lieu de cela, ce que vous devez faire, c'est positionner votre ancre sur l'ID du conteneur

ou

, que la navigation/navbar utilisera automatiquement. Ensuite, vous devez définir votre padding-top pour le conteneur à la quantité de décalage souhaitée, et le margin-top pour le conteneur à l'opposé du padding-top. Maintenant, le bloc de votre conteneur et l'ancre commencent exactement au sommet de la page, mais le contenu à l'intérieur ne commence que sous la barre de menu.

Si vous utilisez des ancres régulières, vous pouvez accomplir la même chose en utilisant un margé-top négatif dans votre conteneur comme ci-dessus, mais sans padding. Ensuite, vous placez une ancre régulière en tant que premier enfant du conteneur. Ensuite, vous stylez le deuxième élément enfant avec un margin-top opposé mais égal, en utilisant le sélecteur .container:first-child +.

Tout cela présume que la marge de votre balise est déjà définie pour commencer sous votre en-tête, ce qui est la norme (sinon la page s'afficherait avec du texte occulté dès le démarrage).

Voici un exemple de ceci en action. Tout ce qui a un id sur votre page peut être lié en ajoutant # l'id-des-éléments à la fin de votre URL. Si vous rendez tous vos balises h et balises dt avec des ids link-able (Comme github le fait) avec une sorte de script qui injecte un petit lien à gauche d'eux; en ajoutant ce qui suit à votre CSS, cela prendra en charge le décalage de la barre de navigation pour vous :

body {
    margin-top: 40px;/* faire de la place pour la barre de navigation */
}

/* faire de la place pour la barre de navigation */
h1[id],
h2[id],
h3[id],
h4[id],
h5[id],
h6[id],
dt[id]{
    padding-top: 60px;
    margin-top: -40px;
}

9 votes

Aimer le combo padding-top, margin-bottom négatif (sur le même élément). Plus facile que de bidouiller avec le js.

0 votes

On dirait que c'est la meilleure réponse, mais je suis un peu perdu. Y a-t-il une chance d'avoir un exemple?

0 votes

@eddyparkinson, devine que tu viens de comprendre maintenant: Par exemple, lorsque vous avez vos identifiants sur les lignes de Bootstrap: .row[id] { padding-top: 60px; margin-top: -40px; } Mettez cela dans votre fichier less: .row[id]{ padding-top: 60px; margin-top: -40px; }

10voto

cogell Points 373

Vous pouvez changer l'offset de la scrollspy en cours d'exécution avec ceci (en supposant que vous espionnez le corps) :

offsetValue = 40;
$('body').data().scrollspy.options.offset = offsetValue;
// forcer la scrollspy à recalculer les décalages de vos cibles
$('body').data().scrollspy.process();

Cela fonctionne également si vous avez besoin de changer la valeur de l'offset dynamiquement. (J'aime que la scrollspy bascule lorsqu'un élément de la section suivante est à environ à mi-hauteur de la fenêtre, donc j'ai besoin de changer l'offset pendant le redimensionnement de la fenêtre.)

2 votes

Merci pour cela - fonctionne très bien avec un petit ajustement pour Bootstrap 3.0 $('body').data()['bs.scrollspy'].options.offset = newOffset; // Définir le nouvel écart $('body').data()['bs.scrollspy'].process(); // Forcer scrollspy à recalculer les écarts vers vos cibles $('body').scrollspy('refresh'); // Rafraîchir le scrollspy.

0 votes

J'ai trouvé que cette méthode est bonne, mais que si je veux l'utiliser pour définir le décalage depuis le début en raison de hauteurs de menu différentes, les options offset de $('body').data().scrollspy (ou la variante pour la version 3.0) ne sont pas encore définies. Y a-t-il quelque chose d'asynchrone à propos de scrollspy que je manque?

0 votes

À partir de Bootstrap 3.1.1, cela devrait être $('body').data()['bs.scrollspy'].options.offset. Utile pour déclencher le scrollspy lors du chargement de la page en utilisant window.scrollBy(X,Y)

9voto

David Naffis Points 85

Si vous voulez un décalage de 10, vous mettriez ceci dans votre en-tête :

  $('#navbar').scrollspy({
    offset: 10
  });

Votre balise body ressemblerait à ceci :

7 votes

Cela ne décale pas le contenu, cela décale la navigation.

0 votes

Cela fonctionnera pour mettre en évidence le bon élément de navigation et non l'endroit où le clic mène (qui est la question originale de l'auteur du message). Cela dit, c'était ce que je cherchais! Merci!

1voto

Tim Points 21

Je pense que l'offset pourrait avoir un lien avec la position inférieure de la section.

J'ai corrigé mon problème - le même que le vôtre - en ajoutant

  padding-top: 60px;

dans la déclaration de la section dans bootstrap.css

J'espère que cela vous aidera !

0 votes

Qu'est-ce qu'une "déclaration de section"? Où mettez-vous ce code?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X