I denne opplæringen vil vi gå gjennom en enkel, men effektiv metode for å lage en off-canvas-meny med HTML, CSS og JavaScript.
For å få en innledende ide om hva vi skal bygge, ta en titt på den relaterte CodePen-demoen (sjekk ut den større versjonen for en bedre opplevelse):
Merk: Denne opplæringen vil ikke fokusere på hvordan du gjør av-lerretmenyen tilgjengelig eller responsiv, så de ville sikkert være gyldige neste trinn.
Våre oppslag består av to innpakningselementer:
.top-banner
element.top-nav
elementHer er HTML-koden:
Med oppslaget klar, la oss nå undersøke de viktigste stilene som kreves for vår meny.
Merk: For lesbarhets skyld er denne CSS-koden ikke optimalisert - du vil se dupliserte egenskaper som du kanskje vil stripe ut i din egen versjon.
De .top-banner
element ser slik ut:
Når det gjelder stiler, gjør vi følgende:
.meny-wrapper
element.Her er stilene vi trenger for å oppnå alt dette:
.topp-banner display: flex; bredde: calc (100% - 150px); høyde: 100vh; transformere: translateX (150px); bakgrunn: url (IMAGE_PATH) no-repeat center / fixed; . topp-banneroverlegg display: flex; flex-retning: kolonne; begrunn-innhold: center; bredde: 350px; polstring: 20px; overgang: transformer .7s; farge: hvit; bakgrunn: rgba (0, 0, 0, .7);
De .top-nav
element ser slik ut:
I dette tilfellet gjør vi følgende:
.fast-menyen
element..meny-wrapper
element som standard. For å gjøre det, gir vi det ikke en eiendomsverdi som skjerm: ingen
. Faktisk bruker vi oversette()
funksjonen å flytte den 200px til venstre. Husk at elementets bredde er 350px, så en del av den er fortsatt innenfor visningsporten. Det er imidlertid ikke synlig fordi elementet er plassert under .fast-menyen
element.Se på de tilsvarende CSS-stilene nedenfor:
.top-nav. menu-wrapper posisjon: fast; topp: 0; venstre: 0; bunn: 0; bredde: 350px; polstring: 20px; transformere: translateX (-200px); overgang: transformer .7s; bakgrunn: # B1FFE5; .top-nav. menu-wrapper .menu opacity: 0; overgang: opacity .4s; .top-nav .fixed-menyen posisjon: fast; topp: 0; venstre: 0; bunn: 0; display: flex; flex-retning: kolonne; bredde: 150px; polstring: 20px; Bakgrunn: Akvamarin;
På dette punktet bruker vi noen grei JavaScript-kode for å manipulere tilstanden til av-lerret-menyen.
La oss beskrive de nødvendige tiltakene:
.meny-open
knappen klikkes, menyen skal vises med en fin lysbildeffekt, og overlegget skal skyves samtidig til høyre. Eventuelt kan vi gjøre mye flere ting i denne tilstanden. I vårt eksempel legger vi til en bokseskygge til ::før
pseudo-element av overlegget og avsløre menylisten med en fade-in effekt..meny-close
knappen klikkes, menyen forsvinner med en fin uttrekkseffekt, og overlegget må skyves samtidig til venstre.Her er JavaScript-koden som implementerer denne oppførselen:
const menuOpen = document.querySelector ("top-nav. menu-open"); const menuClose = document.querySelector (". topp-nav. menu-close"); const menuWrapper = document.querySelector (". topp-nav. menu-wrapper"); const topBannerOverlay = document.querySelector ("top-banner-overlay"); funksjon toggleMenu () menuOpen.addEventListener ("klikk", () => menuWrapper.classList.add ("er åpnet"); topBannerOverlay.classList.add ("er flyttet");); menuClose.addEventListener ("click", () => menuWrapper.classList.remove ("er åpnet"); topBannerOverlay.classList.remove ("er flyttet");); toggleMenu ();
Og under finner du de tilhørende CSS-stilene:
.topp-banner-overlay.is-flyttet transform: translateX (350px); .top-banner-overlay.is-flyttet :: før innhold: "; posisjon: absolutt; topp: 0; bunn: 0; høyre: 100%; bredde: 20px; boks-skygge: 0 0 10px svart; .top-nav .menu-wrapper.is-åpnet transform: translateX (150px); .top-nav .menu-wrapper.is-åpnet .menu opacity: 1; overgangsforsinkelse: .6s;
Denne demoen vil fungere godt bare på desktop-nettlesere. Mobile enheter krever et annet sidelayout, men det er utenfor omfanget av denne opplæringen. Som vanlig bruker vi Babel til å kompilere ES6-koden ned til ES5.
Det eneste små problemet jeg opplevde mens jeg prøvde det, er tekstendringsendringen som skjer når overlegget blir animert. Selv om jeg prøvde ulike tilnærminger foreslått i forskjellige Stack Overflow-tråder, kunne jeg ikke finne en enkel løsning for alle operativsystemer og nettlesere. Så vær oppmerksom på at du kanskje ser små skriftgengivelsesproblemer da overlegget blir animert.
Det er det, folkens! Vi klarte å bygge en nyttig off-canvas-meny med relativt enkel kode.
Jeg håper du likte det endelige resultatet, og du vil bruke det som inspirasjon for å skape enda kraftigere menyer uten lerret. Og selvfølgelig, hvis du bygger noe, ikke glem å dele dem med oss!