Tenho um site com a barra de navegação fixada na parte superior e 3 divs na parte inferior da área de conteúdo principal.
Estou tentando usar scrollspy da estrutura de bootstrap.
Eu tenho sucesso destacando os diferentes títulos no menu quando você rola para além dos divs.
Também o tenho para que, quando você clicar no menu, ele role para a parte correta da página. No entanto, o deslocamento está incorreto (não leva em consideração a barra de navegação, então preciso deslocar em cerca de 40 pixels)
Vejo na página Bootstrap que menciona uma opção de deslocamento, mas não tenho certeza de como usá-lo.
Também não sou o que significa quando diz que você pode usar scrollspy com $('#navbar').scrollspy()
, não tenho certeza de onde incluí-lo, então não o fiz e tudo parece estar funcionando (exceto o deslocamento).
Achei que o deslocamento poderia ser data-offset='10'
na etiqueta do corpo, mas isso não faz nada para mim.
Tenho a sensação de que isso é algo realmente óbvio e estou simplesmente perdendo isso. Qualquer ajuda?
Meu código é
...
<!-- note: the data-offset doesn't do anything for me -->
<body data-spy="scroll" data-offset="20">
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<a class="brand" href="#">VIPS</a>
<ul class="nav">
<li class="active">
<a href="#trafficContainer">Traffic</a>
</li>
<li class="">
<a href="#responseContainer">Response Times</a>
</li>
<li class="">
<a href="#cpuContainer">CPU</a>
</li>
</ul>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="span12">
<div id="trafficContainer" class="graph" style="position: relative;">
<!-- graph goes here -->
</div>
</div>
</div>
<div class="row">
<div class="span12">
<div id="responseContainer" class="graph" style="position: relative;">
<!-- graph goes here -->
</div>
</div>
</div>
<div class="row">
<div class="span12">
<div id="cpuContainer" class="graph" style="position: relative;">
<!-- graph goes here -->
</div>
</div>
</div>
</div>
...
<script src="assets/js/jquery-1.7.1.min.js"></script>
<script src="assets/js/bootstrap-scrollspy.js"></script>
</body>
</html>
fonte
Respostas:
Bootstrap usa deslocamento para resolver apenas espionagem, não rolagem. Isso significa que a rolagem para o local adequado depende de você.
Experimente isso, funciona para mim: adicione um manipulador de eventos para os cliques de navegação.
Encontrei aqui: https://github.com/twitter/bootstrap/issues/3316
fonte
window.location.hash = $(this).attr('href')
a esta função.var navOffset = $('#navbar').height();
escrollBy(0, -navOffset);
O truque, como Tim aludiu, é aproveitar as vantagens do preenchimento. Portanto, o problema é que seu navegador sempre deseja rolar sua âncora até o topo exato da janela. se você definir sua âncora onde seu texto realmente começa, ele será obstruído pela barra de menu. Em vez disso, o que você faz é definir sua âncora para o ID do contêiner
<section>
ou<div>
tag, que o nav / navbar usará automaticamente. Em seguida, você deve definir seupadding-top
para o contêiner com a compensação de valor que deseja e omargin-top
para o contêiner como o oposto depadding-top
. Agora o seu bloco de contêiner e a âncora começam exatamente no topo da página, mas o conteúdo interno não começa até abaixo da barra de menu.Se você estiver usando âncoras regulares, poderá realizar a mesma coisa usando a margem superior negativa em seu contêiner, como acima, mas sem preenchimento. Em seguida, você coloca uma
<a target="...">
âncora regular como o primeiro filho do contêiner. Em seguida, você estiliza o segundo elemento filho com um oposto, mas igualmargin-top
, mas usando o seletor.container:first-child +
.Isso tudo presume que sua
<body>
tag já tem sua margem definida para começar abaixo do seu cabeçalho, o que é a norma (caso contrário, a página seria renderizada com o texto ocluído logo de cara).Aqui está um exemplo disso em ação. Qualquer coisa em sua página com um id pode ser vinculado colocando # the-elements-id no final do seu URL. Se você fizer todas as suas h tags ad dt tags com ids que podem ser vinculados ( como o github faz ) com algum tipo de script que injeta um pequeno link à esquerda deles ; adicionar o seguinte ao seu CSS cuidará do deslocamento da barra de navegação para você:
fonte
Você pode alterar o deslocamento de scrollspy na hora com isto (supondo que você esteja espionando o corpo):
Isso também funciona se você precisar alterar o valor de deslocamento dinamicamente. (Gosto que o scrollspy mude quando a próxima seção estiver na metade da janela, então preciso alterar o deslocamento durante o redimensionamento da janela.)
fonte
$('body').data()['bs.scrollspy'].options.offset
. Útil para acionar scrollspy no carregamento da página usandowindow.scrollBy(X,Y)
Se você quiser um deslocamento de 10, você deve colocar isso em sua cabeça:
Sua tag de corpo seria assim:
fonte
Do problema de bootstrap nº 3316 :
Portanto, definir o deslocamento afeta apenas onde o scrollspy pensa que a página foi rolada . Não afeta a rolagem quando você clica em uma tag âncora.
Usar uma barra de navegação fixa significa que o navegador está rolando para o lugar errado. Você pode corrigir isso com JavaScript:
No entanto, para garantir que scrollspy destaque o elemento atual correto, você ainda precisa definir o deslocamento:
Aqui está uma demonstração completa do JSFiddle .
Alternativamente, você pode preencher as tags âncora, conforme sugerido por truques CSS .
fonte
Acho que esse deslocamento pode fazer algo com a posição inferior da seção.
Corrigi meu problema - igual ao seu - adicionando
na declaração para a seção em bootstrap.css
Espero que ajude!
fonte
Eu adicionei um
.vspace
elemento de altura de 40px segurando a âncora antes de cada um dos meush1
elementos.No CSS:
Está funcionando muito bem e o espaço não é chocante.
fonte
Bootstrap 4 (atualização de 2019)
Implementando: Nav fixo, Scrollspy e Smooth Scrolling
Esta é a solução de @ wilfred-hughes acima, ela corrige exatamente o problema de sobreposição com o Bootstrap Fixed Navbar usando CSS ':: before' para preceder um bloco não exibido antes de cada tag de seção. Vantagem: você não acaba com preenchimento desnecessário entre suas seções. Por exemplo, a seção 3 pode ser posicionada verticalmente contra a seção 2 e ainda irá rolar para a posição correta exata no topo da seção 3.
Nota lateral: definir o deslocamento de scrollspy na tag de script não causou nada que acontecesse ($ ('# navbar'). Scrollspy ({offset: 105});) e as tentativas de ajustar o deslocamento no bloco de animação ainda resultaram em desalinhamento pós- animação.
index.html
mais tarde em index.html ...
style.css:
Crédito: @ wilfred-hughes acima e a fonte original do usuário @mnot em https://github.com/twbs/bootstrap/issues/1768
fonte
Tive problemas com as soluções de acjohnson55 e Kurt UXD. Ambos funcionaram para clicar em um link para o hash, mas o deslocamento scrollspy ainda não estava correto.
Eu encontrei a seguinte solução:
E o CSS correspondente:
Você precisará substituir o preenchimento / margem de 40px pela altura de sua barra de navegação e o id de sua âncora.
Nesta configuração, posso até observar um efeito de definir um valor para o atributo de deslocamento de dados. Se encontrar grandes valores para o deslocamento de dados em torno de 100-200 leva a um comportamento mais esperado (o scrollspy- "switch" acontecerá se o título estiver em torno do meio da tela).
Também descobri que o scrollspy é muito sensível a erros como tags div não fechadas (o que é bastante óbvio), então http://validator.w3.org/check era meu amigo aqui.
Na minha opinião, scrollspy funciona melhor com seções inteiras carregando o ID da âncora, uma vez que os elementos âncora regulares não levam aos efeitos esperados ao rolar para trás (o scrollspy- "switch" eventualmente acontece assim que você atinge o elemento âncora, por exemplo, seu título, mas naquele momento você já rolou sobre o conteúdo que o usuário espera pertencer ao título correspondente).
fonte
Se você tropeçou nesta questão (como eu fiz) através do Google e ainda está procurando uma maneira de alterar dinamicamente o deslocamento do scrollspy. Agora estou anexando um link para uma solução que funcionou para mim.
Dê uma olhada neste post que fiz em outro tópico . Ele contém um trecho de como você pode alterar programaticamente o valor de deslocamento e reagir dinamicamente às alterações (por exemplo, se a barra de navegação mudar de tamanho).
Você não precisa mexer em consertos CSS, mas sim definir o deslocamento que você precisa atualmente na dependência de certos eventos.
fonte
Você também pode abrir
bootstap-offset.js
e modificarhá.
fonte
Basta definir:
data-offset
é por padrão "50" e isso equivale a 10px, então apenas aumentedata-offset
e seu problema estará resolvido.fonte