Scrollspy bootstrap, niezsynchronizowane podświetlanie linków z aktualnymi sekcjami

0

mam stronę w bootstrapie 5. gdy zjeżdżam do danej sekcji to podświetlenie w navbarze wskazuje nie tą sekcję, co trzeba.
kod:

<!DOCTYPE html>
<html lang="PL">
<head>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/hover.css/2.3.1/css/hover-min.css" rel="stylesheet"/>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<style>
html
{
scroll-behavior: smooth;
}
.herofull
{
background: linear-gradient(rgba(0, 0, 0, 0.193), rgba(0, 0, 0, 0.499)), url("https://i.ibb.co/fn7nD6D/image.png");
min-height: 100vh;
background-size: cover;
background-position: center;
display: flex;
font-weight:bold;
}
</style>
</head>
<body class="text-white bg-dark">
<nav class="navbar navbar-expand-lg bg-dark navbar-dark shadow-lg sticky-top">
<div class="container">
<a class="navbar-brand" href="">blogtemplate</a>
<button class="navbar-toggler shadow-none" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto">
<li class="nav-item">
<a class="nav-link" href="#stronaglowna">Strona główna</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#uslugi">Usługi</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#projekty">Projekty</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#zespol">Zespół</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#opinie">Opinie</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#blog">Blog</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#kontakt">Kontakt</a>
</li>
</ul>
</div>
</div>
</nav>
<div data-bs-spy="scroll">
<section class="herofull py-5 text-center justify-content-center align-items-center" id="stronaglowna">
<div class="container">
<h1>Strona główna</h1>
<p>Lorem<br><br><br><br>ipsum</p>
</div> 
</section>
<section class="text-center py-5" id="uslugi">
<div class="container">
<h1 class="pt-5">Usługi</h1>
<h2>lorem ipsum<br>lorem ipsum<br>lorem ipsum<br>lorem ipsum<br>lorem ipsum</h2>
</div>
</section>
<section class="text-center py-5" id="projekty">
<div class="container">
<h1 class="pt-4">Projekty</h1>
<h2>lorem ipsum<br>lorem ipsum<br>lorem ipsum<br>lorem ipsum<br>lorem ipsum</h2>
</div>
</section>
<section class="text-center py-5" id="zespol">
<div class="container">
<h1 class="pt-4">Zespół</h1>
<h2>lorem ipsum<br>lorem ipsum<br>lorem ipsum<br>lorem ipsum<br>lorem ipsum</h2>
</div>
</section>
<section class="text-center py-5" id="opinie">
<div class="container">
<h1 class="pt-4">Opinie</h1>
<h2>lorem ipsum<br>lorem ipsum<br>lorem ipsum<br>lorem ipsum<br>lorem ipsum</h2>
</div>
</section>
<section class="text-center py-5" id="blog">
<div class="container">
<h1 class="pt-4">Blog</h1>
<h2>lorem ipsum<br>lorem ipsum<br>lorem ipsum<br>lorem ipsum<br>lorem ipsum</h2>
</div>
</section>
<section class="text-center" id="kontakt">
<div class="container">
<h1>Kontakt</h1>
<h2>lorem ipsum<br>lorem ipsum<br>lorem ipsum<br>lorem ipsum<br>lorem ipsum</h2><br>
</div>
</section>
<footer class="bg-dark text-white shadow-sm py-2 text-center shadow-lg">
<div class="container pt-4">
<h1>!footer<br>ipsum<br>dolor</h1>
</div>
</footer>
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
1

Zanim zaczniesz cokolwiek przerabiać to zdefiniuj jasno, która to jest "ta" sekcja. Co chcesz osiągnąć w sytuacji, kiedy 3 sekcje mieszczą się na ekranie jedna pod drugą w całości zarówno przy przewijaniu w dół jak i przy przewijaniu do góry.

To, co robisz zawsze z jakiejś perspektywy "działa źle". No bo załóżmy na stronie masz widoczne na raz

[projekty]
[zespół]
[opinie]

no i wydaje ci się, że chcesz, żeby

  • jak tylko sekcja pojawi się w kawałku na ekranie - to wtedy jest podświetlona w menu u góry. Tylko wtedy może być tak, że jednak na ekranie najbardziej widoczne są aktualnie projekty, a opinie to tylko kilka pikseli tytułu - czyli źle
  • no to może jak cała sekcja jest na ekranie to dopiero ją podświetlić? tylko wtedy masz akurat jedną długą sekcję (np. opinie), przeczytałeś ją w 80%, a ona nadal niepoświetlona, w dodatku problem, gdy kilka sekcji na raz w całości jest widoczne - czyli źle
  • no to może dopiero jak sekcja "dotknie" góry ekranu (człowiek czyta przecież od góry, więc najbardziej się by zgadzało podświetlenie z wzrokiem ludzkim)? Tylko wtedy jeżeli ostatnia sekcja jest krótka to nigdy się nie podświetli, bo nigdy nie dotknie góry ekranu (chyba, ze pod nią zrobisz mnóstwo pustej przestrzenii) - czyli nadal źle
  • tu zaczyna się kombinowanie - gdy 20, 40, 50% sekcji się pojawi na stronie to wtedy podświetlam - zaraz się okaże, że źle to wygląda dla przypadku X, (np. pierwsza sekcja jest krótka, druga dłuższa, w efekcie pierwsza nigdy nie zostaje podświetlona)
  • a potem dochodzi temat taki, że może i przy scrollowaniu w dół wyszło to "znośnie" to jednak przy scrollowaniu do góry znowu wygląda grubo "nie tak"

Ja zalecam porzucenie Ci tego pomysłu niestety. Mnóstwo razy to przerobiłem i zawsze klient niezadowolony i ty też będziesz niezadowolony.

Wyjątkiem jest sytuacja, kiedy masz pewność, że każda z sekcji ZAWSZE zajmuje przynajmniej cały ekran (aka. min-height: 100vh). Wtedy po wielu testach wyszło mi, źe najlepiej jest podświetlać sekcję, gdy ok 80% z niej jest widoczne.

0

co mogę użyć zamiast scrollspy?

0

A co jest nie tak ze scrollspy? Bo zmiana biblioteki nie pomoże jeżeli sam nie wiesz, co chcesz osiągnąć

1 użytkowników online, w tym zalogowanych: 0, gości: 1