Hvor ofte finner du at bilder på et nettsted lastes grasiøst; typen der et ikon for lasting først vises, og bildet fades deretter inn, en gang lastet? Denne teknikken kan i stor grad øke ytelsen til nettstedet ditt. Hvis du ikke allerede er kjent med denne metoden, har du lykke til! I dag lager vi et forprogrammeringsplugin for prosjektene dine. Fascinert? La oss komme i gang!
Først skal vi sette opp prosjektmappen for denne opplæringen. Vi trenger:
Vi skal begynne med HTML-koden.
Bildepreloader Preloader - Legg bilder med stil
Ikke noe fancy her: Bare vanlig HTML-kode for et enkelt galleri. Vi har importert jQuery, vårt plugin jquery.preloader.js
(for øyeblikket tom), og vår forhåndsinnstillinger stilark. For å fullføre, legger vi til en uordnet liste, som vil inneholde listeposter som bilder innpakket av en ankermerke (vanligvis gjort på et nettsted for å åpne en lysboks eller koble til et nettsted).
Legg merke til at ekstra
p
Tagpakning hvert anker brukes til å stylere bildet; de er ikke eksplisitt kreves.
Nå skal vi lage en preloader.css
stilark i css
mappe, og i det, lag en undermappe Jeg
der vi vil beholde vårt forhåndsindikatorikon. Preloaders.net har en fin samling av lastingsikoner som du kan velge mellom. Legg til følgende kode i stilarket ditt:
* margin: 0; padding: 0; kropp bakgrunn: url (i / bg.jpg); #container width: 960px; margin: 0px auto; h2 font-weight: 100; tekstskygge: #ffffff 1px 1px 0px; tekst-Justering: center; padding: 20 piksler; font-size: 32 piksler; color: # 555555; border-bottom: 1px stiplet #ccc; margin-bottom: 30px; font-familie: Georgia, "Times New Roman", Times, Serif;
Først har vi opprettet en 960 x
sentrert container, og har lagt til en bakgrunn til siden. I tillegg har vi lagt til noen grunnleggende styling til tittelen ( h2
stikkord ).
Deretter skal vi stillegge galleriet og, mens vi er på det, kaster inn litt CSS3 godhet.
#gallery listestil: none; #gallery li bakgrunn: # e8e8e8; float: venstre; display: block; grense: 1px solid # d7d7d7; -moz-border-radius: 4 piksler; -webkit-border-radius: 4 piksler; border-radius: 4 piksler; -webkit-boks-skygge: 1px 1px 6px #ddd; -moz-box-shadow: 1px 1px 6px #ddd; boks-skygge: 1px 1px 6px #ddd; margin: 15px 56px; padding: 0; #gallery li p grense: 1px solid #fff; -moz-border-radius: 4 piksler; -webkit-border-radius: 4 piksler; border-radius: 4 piksler; margin: 0; padding: 7px; #gallery li a display: block; farge: #fff; text-decoration: none; padding: 0; #gallery img width: 315px; høyde: 210px; margin: 0; padding: 0;
På dette tidspunktet bør vårt galleri se slik ut:
La oss lage en preloader
klasse som vil være ansvarlig for å vise lastikonet mens bilder lastes.
.forlaster bakgrunn: url (i / 89.gif) senter senter no-repeat #ffffff; display: inline-blokk;
Preloaderelementet er vise
Eiendommen må settes til blokkere
eller inline blokk
; Ellers vises ikke ikonet for lasting.
La oss begynne med å lage pluginstrukturen og alternativene.
Å tillate for tilpasningsalternativer gjør et plugin langt mer fleksibelt for brukeren.
Vi starter med grunnstrukturen:
$ .fn.preloader = funksjon (valg) var standard = forsinkelse: 200, preload_parent: "a", check_timer: 300, ondone: funksjon () , oneachload: funksjon (bilde) , fadein: 500 ; // variabler erklære og forklare bilder og foreldrebeholder var alternativer = $ .extend (standard, alternativer),
Deretter erklærer og forklarer vi de variablene vi skal bruke i resten av plugin.
var standard = forsinkelse: 200, preload_parent: "a", check_timer: 300, ondone: funksjon () , oneachload: funksjon (bilde) , fadein: 500; // variabler erklære og forklare bilder og foreldrebeholder var alternativer = $ .extend (standard, alternativer), root = $ (dette), bilder = root.find ("img"). css ("synlighet" , opacity: 0), timer, counter = 0, i = 0, checkFlag = [], delaySum = options.delay;
For det første forvirrer vi rotelementet (alltid en god praksis), så finn bildene (gjør dem også skjult) og til slutt deklarere variablene som vil bli forklart i større detalj når vi motvirker dem.
Det er to ting verdt å merke seg her: du kan i utgangspunktet tro at den enkleste løsningen er å skjule bildene, og deretter fade dem inn, i stedet for å hoppe gjennom all denne koden. Problemet er imidlertid at hvis vi skjuler bildene, markerer nettleseren plassen de pleide å okkupere som tom, og dermed blir selve oppsettet ødelagt når de til slutt falmer inn. Ok, vel, hva om vi brukte opasitet
å "vise" og "skjule" bildene? Det er en bedre praksis, men noen versjoner av IE liker ikke denne metoden.
Vi vil nå deterere over hvert bildeelement, og kontrollere om overordnet er det som er nevnt i alternativet. Hvis så er tilfelle, legger vi vår preloader klasse til det; ellers pakker vi bildet i et ankermerke med en klasse av preloader
.
images.each (function () var $ this = $ (dette); hvis ($ this.parent (options.preload_parent) .length == 0) $ this.wrap (""); else $ this. foreldre (). addClass ("preloader"); checkFlag [i ++] = false;); images = $ .makeArray (bilder);
Her bruker vi en matrise checkFlag
, og setter hver vares elementverdi til falsk
. Dens bruk vil bli gjort tydelig når du beveger deg.
Vi skal nå gjennomføre det som faktisk skjer bak kulissene. Det er en boolean
eiendom, kalt fullstendig
, knyttet til bildeobjektet. Når bildet er lastet helt, er dette boolean satt til ekte
. Så, vi fortsetter å sjekke denne egenskapen for hvert bilde, og hvis det faktisk er satt til ekte
, vi fade i bildet.
Vi kan bruke setInterval
Fungerer for kontinuerlig å avgjøre om bildene er lastet eller ikke. Det er her check_timer
alternativet kommer inn: det kartlegges direkte til timers frekvens.
Et bilde har også en på Last
hendelse knyttet til det; du lurer sikkert på hvorfor vi ikke bruker det. Årsaken er at noen nettlesere ikke fungerer bra med den hendelsen; Som sådan hopper vi over det. Vi trenger en løsning som fungerer som en sjarm over alle nettlesere. Vi starter med:
init = funksjon () timer = setInterval (funksjon () , options.check_timer);
tidsur
er variabelen som vil referere til timeren. Dette er nødvendig for å slutte å stoppe timeren. Denne funksjonen er erklært sammen med alle variablene.
Vi vil iterere gjennom arrayet og sjekke hvert bilde fullstendig
egenskap for å avgjøre om det er ferdig med nedlasting. Hvis den er lastet ned, vil vi sette den til synlig og falme inn sakte. Når animasjonen er avsluttet, fjerner vi forlasterklassen fra forelderen.
for (i = 0; iDet er et lite problem her: timeren fortsetter å sjekke - jevn etter bildene er alle lastet. For å motvirke dette, legger vi til en tellervariabel, og øker den etter hvert bilde er lastet inn. På denne måten kan vi sjekke om tellervariabelen er lik størrelsen på bildarammen. Hvis det er tilfelle, stopper vi.
timer = setInterval (funksjon () hvis (counter> = checkFlag.length) clearInterval (timer); options.ondone (); return; for (i = 0; iDet er imidlertid et annet lite problem nå. Timeren vår kan stoppe tidligere enn forventet; Hvis ett bilde er lastet, er det
fullstendig
eiendommen er satt tilekte
og telleren øker dermed med 1. Nå, når sløyfen kjører neste gang, er bildet allerede lastet, denfullstendig
eiendommen er satt tilekte
, og slik vil løkken løpe to ganger! For å overvinne dette problemet bruker vicheckFlag
array. Når et bilde er lastet, setter vi inncheckFlag
tilekte
, og sett betingelsen for telleren for å øke bare under forutsetning av atcheckFlag
verdien erfalsk
. Så telleren økes kun én gang: når et bilde lastes for første gang.timer = setInterval (funksjon () hvis (counter> gtkflag.length) clearInterval (timer); options.ondone (); return; for (i = 0; i & lt; images.length; i ++) if (bilder [i] .complete == true) if (checkFlag [i] == false) checkFlag [i] = true; options.oneachload (bilder [i]); counter ++; delaySum = delaySum + alternativer. forsinkelse; $ (bilder [i]). css ("synlighet", "synlig") forsinkelse (delaySum) .animate (opacity: 1, options.fadein, function () $ ) .removeClass ("preloader"););, options.check_timer);Legg merke til at vi kaller
ondone
Fungerer når tellerflagget er større enn gruppens lengde - dvs. når alle bildene er lastet. Når telleren økes,oneachload
kalles med det nåværende bildet bestått som parameter.
Trinn 8: Den enkle delen
Til slutt, i dette trinnet, kaller vi
i det();
funksjonen på slutten av plugin.i det(); // kalt på siste linje av pluginDet er alt; Vi har laget et fullt fungerende preloading plugin, og størrelsen er mindre enn 2kb. Likevel gjenstår ett problem: Lastbilikonbildet lastes tilfeldig. Vi vil ikke ha det. I neste avsnitt vil vi ta vare på det.
Trinn 9: Går den ekstra mile
For å fikse problemet nevnt ovenfor, laster vi inn ikonet først, og deretter ringer du på
i det
funksjon. Men ikonet for lasting er et bakgrunnsbilde, så vi injiserer det som et bilde på siden, mens du holder den skjult. Når den laster, kaller vii det
funksjon. Vi laster i hovedsak selve ikonet.varikon = jQuery ("", id: 'loadingicon', src: 'css / i / 89.gif'). skjul (). appendTo (" body "); timer = setInterval (funksjon () hvis (ikon [0] == true) clearInterval (timer); init (); icon.remove (); return;, 100);Først oppretter vi et bildeobjekt med en
id
avloadingicon
, og akilde
peker til banen til lastingsikonet. Deretter legger vi det tilkropp
og skjul det i utgangspunktet. Til slutt angir vi intervallet for å sjekke om ikonet er lastet eller ikke. Hvis den har, dreper vi timeren, og begynner å forhåndsbelaste bildene. Ikke glem å fjerne det ikonet også!
Konklusjon
Med det siste skrittet er vi ferdige! Denne funksjonaliteten fungerer i alle nettlesere, akkurat som forventet, og nedbrytes grasiøst. Bare vær sikker på å angi forhåndslasterelementet
vise
eiendom tilblokkere
ellerinline-blokk
. Det er nå klart for bruk i prosjektene dine. Takk for at du leste!