Mam witrynę z paskiem nawigacyjnym na górze i trzema elementami div poniżej w głównym obszarze zawartości.
Próbuję użyć scrollspy z frameworka bootstrap.
Udało mi się podświetlić różne nagłówki w menu, gdy przewijasz elementy div.
Ja też to mam, więc po kliknięciu menu przewinie się do odpowiedniej części strony. Jednak przesunięcie jest nieprawidłowe (nie bierze pod uwagę paska nawigacyjnego, więc muszę przesunąć o około 40 pikseli)
Widzę na stronie Bootstrap, że wspomina o opcji przesunięcia, ale nie jestem pewien, jak jej użyć.
Nie jestem też tym, co to znaczy, gdy mówi, że możesz użyć scrollspy z $('#navbar').scrollspy()
, nie jestem pewien, gdzie to uwzględnić, więc nie zrobiłem i wszystko wydaje się działać (z wyjątkiem przesunięcia).
Myślałem, że przesunięcie może być data-offset='10'
na tagu body, ale nic to dla mnie nie robi.
Mam wrażenie, że jest to coś naprawdę oczywistego i po prostu mi tego brakuje. Jakaś pomoc?
Mój kod to
...
<!-- 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>
źródło
Odpowiedzi:
Bootstrap używa offsetu tylko do rozpoznawania szpiegowania, a nie przewijania. Oznacza to, że przewijanie do odpowiedniego miejsca zależy od Ciebie.
Spróbuj tego, to działa dla mnie: dodaj procedurę obsługi zdarzeń dla kliknięć nawigacji.
Znalazłem to tutaj: https://github.com/twitter/bootstrap/issues/3316
źródło
window.location.hash = $(this).attr('href')
do tej funkcji.var navOffset = $('#navbar').height();
iscrollBy(0, -navOffset);
Sztuczka, jak wspomniał Tim, polega na wykorzystaniu dopełnienia. Problem polega więc na tym, że Twoja przeglądarka zawsze chce przewinąć zakotwiczenie dokładnie na górę okna. jeśli ustawisz kotwicę w miejscu, w którym faktycznie zaczyna się tekst, zostanie on zasłonięty przez pasek menu. Zamiast tego ustawiasz kotwicę na identyfikator kontenera
<section>
lub<div>
tagu, którego nav / navbar użyje automatycznie. Następnie musisz ustawićpadding-top
dla kontenera żądaną kwotę przesunięcia, amargin-top
dla kontenera przeciwną dopadding-top
. Teraz twój blok kontenera i kotwica zaczynają się dokładnie na górze strony, ale zawartość wewnątrz zaczyna się dopiero poniżej paska menu.Jeśli używasz zwykłych kotwic, możesz osiągnąć to samo, używając ujemnego górnego marginesu w kontenerze, jak powyżej, ale bez dopełnienia. Następnie umieszczasz zwykłą
<a target="...">
kotwicę jako pierwsze dziecko kontenera. Następnie nadajesz styl drugiemu elementowi podrzędnemu przeciwny, ale równymargin-top
, ale używając selektora.container:first-child +
.Wszystko to zakłada, że Twój
<body>
tag ma już ustawiony margines rozpoczynający się poniżej nagłówka, co jest normą (w przeciwnym razie strona byłaby renderowana z przesłoniętym tekstem od razu).Oto przykład tego w akcji. Wszystko na Twojej stronie, do którego masz identyfikator, może być powiązane, umieszczając # the-elements-id na końcu adresu URL. Jeśli utworzysz wszystkie tagi h ad tagi dt z identyfikatorami umożliwiającymi łączenie (tak jak robi to github ) za pomocą jakiegoś skryptu, który wstawi mały link po lewej stronie ; dodanie następujących elementów do CSS zajmie się przesunięciem paska nawigacyjnego za Ciebie:
źródło
Możesz zmienić przesunięcie scrollspy'a w locie dzięki temu (zakładając, że szpiegujesz ciało):
Działa to również w przypadku konieczności dynamicznej zmiany wartości przesunięcia. (Lubię, gdy scrollspy przełącza się, gdy następna sekcja znajduje się mniej więcej w połowie okna, więc muszę zmienić przesunięcie podczas zmiany rozmiaru okna).
źródło
$('body').data()['bs.scrollspy'].options.offset
. Przydatne do wyzwalania scrollspy'u podczas ładowania strony za pomocąwindow.scrollBy(X,Y)
Jeśli chcesz przesunąć 10, umieść to w swojej głowie:
Twój tag body wyglądałby tak:
źródło
Z numeru 3316 bootstrap :
Zatem ustawienie przesunięcia wpływa tylko na to, gdzie scrollspy myśli, że strona jest przewijana . Nie wpływa na przewijanie po kliknięciu znacznika kotwicy.
Korzystanie ze stałego paska nawigacyjnego oznacza, że przeglądarka przewija w niewłaściwe miejsce. Możesz to naprawić za pomocą JavaScript:
Aby jednak upewnić się, że scrollspy podświetla właściwy bieżący element, nadal musisz ustawić przesunięcie:
Oto kompletne demo na JSFiddle .
Alternatywnie możesz dopełnić znaczniki kotwicy, zgodnie z sugestiami sztuczek CSS .
źródło
Myślę, że to przesunięcie może coś zrobić z dolną pozycją sekcji.
Naprawiłem swój problem - taki sam jak twój - dodając
w deklaracji sekcji w pliku bootstrap.css
Mam nadzieję, że to pomoże!
źródło
Dodałem
.vspace
element o wysokości 40px trzymający kotwicę przed każdym z moichh1
elementów.W CSS:
Działa świetnie, a przestrzeń nie jest zatłoczona.
źródło
Bootstrap 4 (aktualizacja 2019)
Wdrażanie: Naprawiono nawigację, Scrollspy i płynne przewijanie
Jest to rozwiązanie od @ Wilfred Hughes powyżej, dokładnie rozwiązuje problem nakładania się ze stałym paskiem nawigacyjnym Bootstrap, używając CSS „:: before”, aby blok przed każdym znacznikiem sekcji. Zaleta: nie kończy się niepotrzebnym wypełnieniem między sekcjami. Np. Sekcja 3 może być ustawiona pionowo naprzeciw sekcji 2 i nadal będzie przewijać się do dokładnej prawidłowej pozycji na górze sekcji 3.
Nota boczna: ustawienie przesunięcia scrollspy w tagu skryptu nie spowodowało, że nic się nie wydarzyło ($ ('# navbar'). Scrollspy ({offset: 105});) i próby dostosowania przesunięcia w bloku animacji nadal skutkowały niewspółosiowością. animacja.
index.html
później w index.html ...
style.css:
Źródło: @ wilfred-hughes powyżej i oryginalne źródło od użytkownika @mnot na https://github.com/twbs/bootstrap/issues/1768
źródło
Miałem problemy z rozwiązaniami acjohnson55 i Kurt UXD. Oba działały, aby kliknąć link do skrótu, ale przesunięcie scrollspy nadal nie było poprawne.
Wymyśliłem następujące rozwiązanie:
I odpowiedni CSS:
Będziesz musiał zastąpić wypełnienie / margines 40 pikseli wysokością paska nawigacyjnego i identyfikatorem kotwicy.
W tej konfiguracji mogę nawet zaobserwować efekt ustawienia wartości atrybutu przesunięcia danych. Jeśli znajdziesz duże wartości przesunięcia danych w okolicach 100-200, prowadzi to do bardziej oczekiwanego zachowania (przewijanie szpiegowskie- "przełączenie" nastąpi, jeśli nagłówek znajduje się mniej więcej pośrodku ekranu).
Odkryłem również, że scrollspy jest bardzo wrażliwy na błędy, takie jak niezamknięte znaczniki DIV (co jest dość oczywiste), więc http://validator.w3.org/check był moim przyjacielem.
Moim zdaniem scrollspy działa najlepiej z całymi sekcjami niosącymi identyfikator kotwicy, ponieważ zwykłe elementy kotwicy nie prowadzą do oczekiwanych efektów podczas przewijania do tyłu (scrollspy - "przełącznik" w końcu następuje, gdy tylko trafisz w element kotwicy, np. Nagłówek, ale w tym czasie przewinąłeś już zawartość, której użytkownik spodziewa się, że należy do odpowiedniego nagłówka).
źródło
Jeśli natknąłeś się na to pytanie (tak jak ja) przez Google i nadal szukasz sposobu na dynamiczną zmianę przesunięcia scrollspy. Dołączam teraz link do rozwiązania, które działało dla mnie.
Spójrz na ten post, który zrobiłem w innym wątku . Zawiera krótki opis, w jaki sposób można programowo zmienić wartość przesunięcia i dynamicznie reagować na zmiany (np. Gdy pasek nawigacyjny zmienia rozmiar).
Nie musisz majstrować przy poprawkach CSS, ale raczej ustawić przesunięcie, którego obecnie potrzebujesz w zależności od pewnych zdarzeń.
źródło
Możesz także otwierać
bootstap-offset.js
i modyfikowaćtam.
źródło
Wystarczy ustawić:
data-offset
ma domyślnie wartość „50”, co odpowiada 10 pikselom, więc po prostu zwiększ,data-offset
a problem zostanie rozwiązany.źródło