I denne opplæringen vil vi ha det gøy med JavaScript-museversjoner ved å bygge noe nyttig og interessant: miniatyrer som, når de svinger over, viser et utvalg forskjellige eBøker.
Her er den demoen vi skal bygge (flytt musen over hver miniatyrbilde):
Hver miniatyrbilde viser de tilhørende ebøkene skjult under, avhengig av markørposisjonen. Det er en ideell måte å gi et snikksempel på hva som er tilgjengelig (i dette tilfellet i Envato Tuts + eBok-biblioteket).
Når vi bygger dette bruker vi CSS Grid Layout og JavaScript mousemove
arrangement, blant annet.
Markeringen vi skal bruke er ganske enkel; en vanlig uordnet liste med noen like store bilder inne i hver av listepostene (kortene).
Nå, med hensyn til CSS-stilene, er to ting viktige:
bredde: 25%
. I stedet for CSS-nett kan du bruke flexbox eller din foretrukne layoutmetode.CSS-reglene som gjelder for vår demo, vises nedenfor:
.kort display: grid; grid-gap: 20px; Rutenett-mal-kolonner: Gjenta (4, 1fr); .card posisjon: relative; boks-skygge: 0 3px 6px rgba (0, 0, 0, 0,5); .card: hover cursor: pointer; .card img: not (: first-of-type) posisjon: absolutt; topp: 0; høyre: 0; bunn: 0; venstre: 0; opasitet: 0; .card img.is-visible opacity: 1;
Med et par andre tilbakestillede stiler (fjerner kulene fra den uordnede listen, gir kroppen en bakgrunnsfarge etc.), slutter vi med dette:
La oss legge til følgende to linjer, slik at når alle sidebildene er klare, i det
funksjonen utføres. Vi vil også utløse det hver gang nettleservinduet endres.
window.addEventListener ("load", init); window.addEventListener ("resize", init);
Innenfor denne funksjonen skjer en rekke ting; Først gikk vi gjennom kortene.
funksjon init () const cards = document.querySelectorAll (".kort"); cards.forEach (el => // handlinger her);
Deretter henter vi for hvert kort antall barnbilder uten å ta hensyn til det første bildet.
Merk: Første bilde er synlig som standard og ikke helt posisjonert.
const numOfChildImages = el.querySelectorAll ("img: not (: first-of-type)"). lengde;
Hvis det er minst ett barns bilde, gjør vi følgende:
hvis (numOfChildImages> 0) const width = el.getBoundingClientRect (); const deler = bredde / numOfChildImages;
For å bedre forstå dette, la oss anta at vårt første kort er 235 px bredt. Dette kortet inneholder fire bilder (husk vi ignorerer det første bildet), slik at divisjonen 235px / 4 gir oss 58.75px. Så hva er rollen til dette nummeret? Vel, det skaper våre intervaller, så ved korthenger, sporer vi musens X-posisjon, kontrollerer rekkevidden, og viser til slutt det riktige bildet.
For vårt enkle eksempel, her er de genererte områdene:
Mus X Posisjon | Bilde å vise |
---|---|
0 | første |
58.75px | andre |
117.5px | tredje |
176.25pxfjerde | |
Vær oppmerksom på at "Image to Show" -kolonnen viser bildet som skal vises fra bassenget på fire barns bilder (igjen utelukker vi det første synlige bildet).
Nå som vi kjenner kravene, la oss oversette dem til kode. Fortsatt inne i løkken vi lytter etter mousemove
begivenhet.
// hover-kort el.addEventListener ("mousemove", e => // gjør ting her);
Når denne hendelsen brenner, utfører vi følgende handlinger:
er-synlige
klasse fra alle kortbilder.En del av koden som implementerer den nevnte oppførselen er som følger:
el.addEventListener ("mousemove", e => // 1 const xPos = e.pageX - el.offsetLeft; // 2 removeIsVisibleClass (); // 3 switch (numOfChildImages) tilfelle 1: hvis (xPos> 0 && XPOS <= parts) addClass(el, "img:nth-child(2)"); break; case 2: if (xPos > 0 && xPos <= parts) addClass(el, "img:nth-child(2)"); else if (xPos > deler && xPos <= parts * 2) addClass(el, "img:nth-child(3)"); break; // more cases below );
Som du kan se, er det to tilpassede funksjoner. For det første, removeIsVisibleClass
funksjon som er ansvarlig for å fjerne er-synlige
klasse fra det tilsvarende bildet. For det andre, jo mer generell addClass
funksjon som er ansvarlig for å legge til er-synlige
klasse til målbildet.
Her er deres signatur:
funksjon removeIsVisibleClass () if (document.querySelector ("img.is-visible")) document.querySelector ("img.is-visible"). classList.remove ("er synlig"); funksjon addClass (foreldre, barn, className = "er synlig") parent.querySelector (child) .classList.add (klassenavn);
Så langt har vi sett hva som skjer hver gang vi svinger over et kort. La oss nå diskutere det motsatte scenariet. Med andre ord, hva skal skje hvis vi Stoppe svinger over et kort. I dette tilfellet skal første første bilde vises:
// innvendige kortsløyfe el.addEventListener ("mouseleave", () => removeIsVisibleClass (););
Vår demo skal fungere godt i de fleste nettlesere. Noen få notater skjønt:
for hver
sløyfe som ikke støttes av alle nettlesere. Det finnes alternative løsninger for begge tilfeller hvis du foretrekker å bruke en tilbakebetaling.Til slutt bruker vi som vanlig Babel å kompilere ES6-koden ned til ES5.
I denne opplæringen klarte vi å bygge en interessant hover-effekt ved å utnytte JavaScript-musenes hendelser. Forhåpentligvis har du blitt inspirert til å bygge noe fantastisk.
For å ta ting videre, oppfordrer jeg deg til å bygge en gjenbrukbar funksjon som håndterer den repeterende koden inne i bytte om
uttalelse. Legg inn en kommentar hvis du tar utfordringen på!