Hur ofta tycker du att bilder på en webbplats laddas graciöst den typ där en laddningsikon först visas, och bilden sedan bleknar, en gång laddad? Denna teknik kan kraftigt öka prestandan på din webbplats. Om du inte redan är bekant med den här metoden har du lycka till! Idag skapar vi ett preloader plugin för dina projekt. Fascinerad? Låt oss börja!
Först ska vi ställa in projektmappen för denna handledning. Vi behöver:
Vi ska börja med HTML-koden.
Bildpreloader Preloader - Ladda bilder med stil
Inget fint här: helt enkelt HTML-kod för ett enkelt galleri. Vi har importerat jQuery, vårt plugin jquery.preloader.js
(för närvarande tom) och vår preloader stilark. För att avsluta lägger vi till en oorderad lista, som innehåller listobjekt som bilder som är inslagna av en ankaremärke (vanligtvis gjort på en webbplats för att öppna en ljuskälla eller länka till en webbplats).
Observera att extra
p
etikettförpackning varje ankare används för att ställa in bilden; de är inte uttryckligen nödvändiga.
Nu ska vi skapa en preloader.css
stylesheet i css
mapp, och inuti det, skapa en undermapp jag
där vi kommer att behålla vår preloaderikon. Preloaders.net har en bra samling av laddningsikoner som du kan välja mellan. Lägg till följande kod i ditt stilark:
* marginal: 0; padding: 0; kropp bakgrund: url (i / bg.jpg); #container width: 960px; marginal: 0px auto; h2 font-vikt: 100; textskugga: #ffffff 1px 1px 0px; text-align: center; padding: 20px; font-size: 32px; color: # 555555; border-bottom: 1px stupad #ccc; margin-bottom: 30px; font-family: Georgia, "Times New Roman", Times, Serif;
Först har vi skapat en 960 x
centrerad behållare och har lagt till en bakgrund till sidan. Dessutom har vi lagt till en del grundläggande styling till titeln ( h2
tagg).
Sedan ska vi stila galleriet och, medan vi är på det, kasta in lite CSS3 godhet.
#gallery list-style: none; #gallery li background: # e8e8e8; flyta till vänster; display: block; gränsen: 1px solid # d7d7d7; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; -webkit-box-skugga: 1px 1px 6px #ddd; -moz-box-skugga: 1px 1px 6px #ddd; boxskugga: 1px 1px 6px #ddd; marginal: 15px 56px; padding: 0; #gallery li p border: 1px solid #fff; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; marginal: 0; padding: 7PX; #gallery li a display: block; färg: #fff; text-decoration: none; padding: 0; #gallery img width: 315px; höjd: 210px; marginal: 0; padding: 0;
Vid det här laget ska vårt galleri se ut så här:
Låt oss skapa en preloader
klass som ansvarar för att visa laddningsikonen medan bilder laddas.
.förläsare bakgrund: url (i / 89.gif) center center no-repeat #ffffff; display: inline-block;
Preloaderelementet är visa
egendom måste ställas in på blockera
eller inline block
; annars visas inte laddningsikonen.
Låt oss börja med att skapa pluginstrukturen och alternativen.
Tillåt för anpassningsalternativ gör ett plugin mycket flexiblare för användaren.
Vi börjar med basstrukturen:
$ .fn.preloader = funktion (alternativ) var standard = fördröjning: 200, preload_parent: "a", check_timer: 300, ondone: funktion () , oneachload: funktion (bild) , fadein: 500 ; // variabler deklarera och precachera bilder och föräldrabehållare var alternativ = $ .extend (standardvärden, alternativ),
Därefter förklara och förklara vi vilka variabler vi ska använda i resten av plugin.
var standard = fördröjning: 200, preload_parent: "a", check_timer: 300, ondone: funktion () , oneachload: funktion (bild) , fadein: 500; // variabler deklarerar och precacherar bilder och föräldrabehållare var alternativ = $ .extend (standardvärden, alternativ), root = $ (detta), bilder = root.find ("img"). css ("synlighet" , opacitet: 0), timer, räknare = 0, i = 0, checkFlag = [], delaySum = options.delay;
För det första preciserar vi rotelementet (alltid en bra metod), hitta sedan bilderna (gör dem också gömda) och slutligen deklarera de variabler som kommer att förklaras närmare när vi motverkar dem.
Det finns två saker som är värda att notera här: du kan till och med tro att den enklaste lösningen är att dölja bilderna, och sedan blekna dem, snarare än att hoppa genom hela denna kod. Problemet är emellertid att om vi döljer bilderna markerar webbläsaren det utrymme som de brukade ockupera som tomt, och sålunda är själva layouten förstörd när de slutligen bleknade i. Okej, bra, vad om vi använde opacitet
att "visa" och "dölja" bilderna? Det är en bättre övning, men vissa versioner av IE gillar inte den här metoden.
Vi kommer nu att iterera över varje bildelement och kontrollera om dess förälder är den som nämns i alternativet. Om så är fallet lägger vi till vår preloader klass till den; Annars sätter vi in bilden i en ankare med en klass av preloader
.
images.each (function () var $ this = $ (detta); om ($ this.parent (options.preload_parent) .length == 0) $ this.wrap (""); annars $ this. förälder (). addClass ("preloader"); checkFlag [i ++] = false;); images = $ .makeArray (bilder);
Här använder vi en array checkFlag
, och ställer in varje arrays objektvärde till falsk
. Dess användning kommer att klargöras när du flyttar.
Vi ska nu genomföra vad som faktiskt händer bakom kulisserna. Det finns en boolean
egendom, kallad komplett
, associerad med bildobjektet. När bilden har laddats helt, är denna boolean inställd på Sann
. Så vi fortsätter att kolla den här egenskapen för varje bild, och om den verkligen är inställd på Sann
, vi bleknar i den bilden.
Vi kan använda setInterval
funktionen för att kontinuerligt bestämma om bilderna har laddats eller inte. Det är här check_timer
alternativet kommer in: det kartläggs direkt till vår timer frekvens.
En bild har också en onload
händelse i samband med det; du undrar förmodligen varför vi inte använder den. Anledningen är att vissa webbläsare inte fungerar bra med den händelsen; Som sådan hoppar vi över det. Vi behöver en lösning som fungerar som en charm över alla webbläsare. Vi börjar med:
init = funktion () timer = setInterval (funktion () ), options.check_timer);
timer
är variabeln som kommer att referera till timern. Detta behövs för att slutligen stoppa timern. Denna funktion deklareras tillsammans med alla variablerna.
Vi kommer att iterera genom arrayen och kontrollera varje bild komplett
egenskap för att avgöra om det har slutförts nedladdning. Om den har laddats ner, sätter vi den på synlig och bleknar långsamt. När animationen är avslutad tar vi bort förläsarklassen från dess förälder.
för (i = 0; iDet är en liten fråga här: timern fortsätter att kontrollera - jämna efter bilderna har alla laddats. För att motverka detta lägger vi till en räknarevariabel och ökar den efter varje bild har laddats. På så sätt kan vi kontrollera om räknaren är lika med storleken på bilderna. Om så är fallet slutar vi.
timer = setInterval (funktion () if (counter> = checkFlag.length) clearInterval (timer); options.ondone (); return; för (i = 0; iDet finns dock en annan liten fråga nu. Vår timer kan sluta tidigare än förväntat Om en bild har laddats, är dess
komplett
egendom har blivit inställd påSann
och räknaren ökar således med 1. Nu, när slingan går nästa gång, är bilden redan laddad, denkomplett
fastigheten är inställd påSann
, och sålunda kommer slingan att springa två gånger! För att lösa detta problem använder vicheckFlag
array. När en bild är laddad ställer vi incheckFlag
tillSann
, och ställ in villkoret för att räknaren ska ökas endast under förutsättning attcheckFlag
värdet ärfalsk
. Så räknas uppräknaren endast en gång: när en bild laddas för första gången.timer = setInterval (funktion () om (räknare & gt; = checkFlag.length) clearInterval (timer); options.ondone (); return; för (i = 0; i & lt; images.length; i ++) if (images [i] .complete == true) om (checkFlag [i] == false) checkFlag [i] = true; options.oneachload (bilder [i]); counter ++; delaySum = delaySum + options. fördröjning; $ (bilder [i]). css ("synlighet", "synlig") .fördröjning (delaySum) .animate (opacity: 1, options.fadein, function () $ ) .removeClass ("preloader"););, options.check_timer);Observera att vi kallar
ondone
funktion när motflaggan är större än gruppens längd - dvs när alla bilder laddas. När räknaren ökas,oneachload
kallas med den aktuella bilden som passerat som parameter.
Steg 8: Den enkla delen
Slutligen, i detta steg kallar vi
i det();
funktionen i slutet av plugin.i det(); // heter på den sista raden av pluginDet är allt; Vi har gjort ett fullt fungerande preloading plugin, och storleken är mindre än 2kb. Fortfarande kvarstår ett problem: laddningsikonbilden laddas slumpmässigt. Vi vill inte ha det. I nästa avsnitt tar vi hand om det.
Steg 9: Att gå på Extra Mile
För att åtgärda problemet som nämns ovan laddar vi först ikonen och ringer sedan på
i det
fungera. Men ikonen för laddning är en bakgrundsbild, så vi injicerar den som en bild på sidan, samtidigt som den hålls gömd. När det laddas kallar vii det
fungera. Vi förslår i princip själva ikonen.varikon = jQuery ("", id: 'loadicon', src: 'css / i / 89.gif'). hide (). appendTo (" body "); timer = setInterval (funktion () om (ikon [0] == true) clearInterval (timer); init (); icon.remove (); return;, 100);Först skapar vi ett bildobjekt med en
id
avloadingicon
, och akälla
pekar på ladden för laddningsikonen. Sedan lägger vi till detkropp
och göm det först. Slutligen ställer vi in intervallet för att kontrollera om ikonen har laddats eller inte. Om det har det, dödar vi timern och börjar förinställa bilderna. Glöm inte att ta bort den ikonen också!
Slutsats
Med det sista steget är vi färdiga! Denna funktionalitet fungerar i alla webbläsare, precis som förväntat, och försämras graciöst. Var noga med att ställa in förinstanselementet
visa
egendom tillblockera
ellerinline-blocket
. Det är nu klart att användas i dina projekt. Tack för att du läser!