Jak unieruchomić stronę pod nawigacją mobilną?

CSSFrontendHTMLJavaScript
Kobieta przegląda strony na iPhone

Na pewno każdy początkujący front-end developer choć raz spotkał się z tym problemem.

Otwieramy nawigację mobilną (menu hamburgerowe), a treść na stronie, która znajduje się pod nią, porusza się w górę i dół.

Oczywiście nie chcemy takiego zachowania, wygląda to mało profesjonalnie.

Na szczęście istnieje bardzo proste rozwiązanie tego problemu!
Wystarczy dodać do naszego body właściwość overflow: hidden;

Zobacz, jak to działa w praktyce:

  • wklej poniższy kod do Twojego edytora kodu,
  • uruchom narzędzia deweloperskie,
  • włącz podgląd na urządzenie mobilne,
  • kliknij ikonę burgera i zobacz, jak zachowuje się strona, kiedy próbujesz ją scrollować.

Teraz odkomentuj overflow: hidden; w klasie sticky-body i zobacz różnicę. 🙂

P.S. Pod kodem, na samym dole artykułu znajduje się objaśnienie działania funkcji w JavaScript.

<nav>
    <div class="nav-items">
        <a href="#">Home</a>
        <a href="#">Menu 1</a>
        <a href="#">Menu 2</a>
        <a href="#">Menu 3</a>
    </div>
    <button class="burger-btn">🍔</button>
</nav>

<section class="section">Sekcja 1</section>
<section class="section">Sekcja 2</section>
<section class="section">Sekcja 3</section>
* {
	box-sizing: border-box;
	margin: 0;
	padding: 0;
}

body {
	font-family: 'Montserrat', sans-serif;
	background-color: #14213d;
	color: #e5e5e5;
}

.nav-items {
	position: fixed;
	top: 0;
	left: 0;
	transform: translateX(-100%);
	display: flex;
	justify-content: center;
	align-items: center;
	flex-direction: column;
	width: 100%;
	height: 100%;
	background-color: rgba(0, 0, 0, 0.8);
	transition: transform 0.3s;
}

.nav-items a {
	margin: 2em;
	text-decoration: none;
	font-size: 2rem;
	color: #fff;
}

.active {
	transform: translateX(0);
}

.sticky-body {
	/* overflow: hidden; */
}

.burger-btn {
	position: fixed;
	top: 30px;
	right: 30px;
	background: none;
	border: none;
	font-size: 3rem;
	cursor: pointer;
}

.section {
	display: flex;
	justify-content: center;
	align-items: center;
	height: 100vh;
	width: 100%;
	font-size: 4rem;
}

.section:nth-child(even) {
	background-color: #fca311;
	color: #fff;
}
const burgerBtn = document.querySelector('.burger-btn')
const navItems = document.querySelector('.nav-items')

const handleMobileNav = () => {
    navItems.classList.toggle('active')
    document.body.classList.toggle('sticky-body')
}

burgerBtn.addEventListener('click', handleMobileNav)

Wyjaśnienie kodu JavaScript

Do zmiennych burgerBtn oraz navItems pobraliśmy przycisk (burger icon) oraz div z klasą nav-items. W tym div przechowywane są wszystkie linki z nawigacji.

Następnie nasłuchujemy na kliknięcie przycisku.

Kiedy kliknięcie zostanie wykryte, uruchomiona zostaje funkcja handleMobileNav, która dodaje do nawigacji klasę active (dzięki czemu nawigacja pojawia się na stronie) oraz klasę sticky-body (dzięki czemu treść na stronie internetowej pozostaje nieruchoma).

Po ponownym wciśnięciu burgera, klasy active oraz sticky-body zostają zabrane. Tak działa metoda toggle.

Poprzedni wpis
Jak pobierać elementy w JavaScript?
Następny wpis
Wszystko, co musisz wiedzieć o addEventListener w JS