Klissete, Glatt, Aktiv Nav

0
51

Akkurat som tittelen sier! Her er en sidebar navigasjon bar som…

  1. Bruker trege lokalisering. Det skal være på skjermen når du kan det, men ikke overlapper topptekst, bunntekst, eller har noen gang gjort noe av det lenker utilgjengelige.
  2. Ruller jevnt til de avsnittene du klikker på.
  3. Aktiverer gjeldende nav basert på bla posisjon (det er en enkelt side ting).

Se Penn Klissete, Glatt, Aktiv Nav ved Chris Coyier (@chriscoyier) på CodePen.

Sticky

Det er lett å kaste posisjon: klebrig; top: 0; på noe. Men for at det skal fungere, så må det være i en høyere overordnet element. Så, den sorterte listen (<ul>) innen navigasjon (<nav>) fungerer bra her. Takk til CSS-grid layout, <nav> er så høye som <main> innholdsområdet. Vær imidlertid oppmerksom på at vi også må posisjon: -webkit-klissete; for iOS.

Jeg har også kastet i et magisk tall for den vertikale media spørringen slik at den ikke holde på en slik måte at du ikke kan få til lavere navigasjon elementer:

/* Bare holde seg hvis du kan passform */
@media (min-height: 300px) {
nav-ul {
posisjon: klebrig;
øverst: 0;
}
}

Glatt

I min første sprekk på dette, tenkte jeg på JavaScript-basert jevn rulling. Det er enda native disse dager uten behov for rammer. Du kan målrette mot et element og jevnt bla til det:

dokumentet.querySelector(‘.hei’).scrollIntoView({
atferd: ‘glatt’
});

Å bringe det til et vilkårlig sett av nav…

la mainNavLinks = – dokument.querySelectorAll(“nav-ul li”);

mainNavLinks.forEach(link => {
link.addEventListener(“klikk”, event => {
event.preventDefault();
la target = – dokument.querySelector(event.målet.hash);
målet.scrollIntoView({
oppførsel: “glatt”,
blokk: “start”.
});
});
});

Som er støttet i både Chrome og Firefox, men ikke Edge eller Safari.

Da det slo meg, CSS kan gjøre dette! Det er en bla-atferd eiendom, og du kan sette det på dokumentet for å gjøre alt bla at måten:

html {
bla-atferd: glatt;
}

Siden vår navigasjons – <a> lenker er hash/hoppe/anker-lenker, som bokstavelig talt er alt vi trenger. Glem JavaScript. Spesielt fordi nettleseren støtte for bla-oppførselen er den samme som “glatt” versjon av .scrollIntoView().

Aktiv

Dette er litt komplisert, spesielt fordi dette er en single-side rulle app snarere enn individuelle sider med sine egne separate dokumenter. Hvis de var separate dokumenter, vil vi endre en aktiv klasse et sted i navigasjon-eller bruk en kropp.specific_page klasse eller noe.

I stedet, vi trenger å se på bla posisjon på siden velger du hvilke delen er i se og merke det på den måten. Det kan være noen ganske fancy IntersectionObserver måten å håndtere dette på, men jeg kunne ikke helt vikle hodet rundt det, så i stedet jeg bare og ser på alle de relevante delene, gjør litt måling og matematikk, og bestemmer hvis lenken er aktiv på den måten.

la mainNavLinks = – dokument.querySelectorAll(“nav-ul li”);
la mainSections = – dokument.querySelectorAll(“hoveddelen”);

la lastId;
la cur = [];

vinduet.addEventListener(“bla”, event => {
la fromTop = vinduet.scrollY;

mainNavLinks.forEach(link => {
la section = – dokument.querySelector(link.hash);

hvis (
delen.offsetTop <= fromTop &&
delen.offsetTop + del.offsetHeight > fromTop
) {
link.classList.legge til(“dagens”);
} else {
link.classList.fjern(“dagens”);
}
});
});

Bla handler det bør utløse en liten advarsel flagg. Det er den slags ting som bør nok strupes, for eksempel hvis du har lodash tilgjengelig:

vinduet.addEventListener(“bla”, () => {
_.gass(doThatStuff, 100);
});

Jeg visste bare ikke gjøre det her for å holde demo-avhengighet-fri.

Oh! Og det i stor grad fungerer fint på mobil (iOS her):

En Gratis Mal for JavaScript-Bibliotek Hjemmesider

Jeg brukte alt dette ting i denne malen jeg har gjort som du er fri til å bruke til hva som helst.

SHARE
Previous articleTrege Nettsider
Next articleLångsamma Hemsidor