Hoe vaak vind je dat afbeeldingen op een website netjes worden geladen; het soort waar een laadpictogram voor het eerst verschijnt, en de afbeelding verdwijnt dan, eenmaal geladen? Deze techniek kan de prestaties van uw website aanzienlijk verbeteren. Als u nog niet bekend bent met deze methode, heeft u geluk! Vandaag maken we een preloader-plug-in voor uw projecten. Geïntrigeerd? Laten we beginnen!
Eerst gaan we de projectmap voor deze zelfstudie instellen. We hebben het volgende nodig:
We beginnen met de HTML-code.
Afbeelding Preloader Preloader - Laad afbeeldingen met stijl
Niets bijzonders hier: gewoon HTML-code voor een eenvoudige galerij. We hebben jQuery, onze plug-in, geïmporteerd jquery.preloader.js
(momenteel leeg) en de stylesheet van onze preloader. Ter afronding voegen we een ongeordende lijst toe, die lijstitems bevat als afbeeldingen die zijn omwikkeld met een ankertag (meestal gedaan in een website voor het openen van een lightbox of het linken naar een site).
Merk op dat de extra
p
tag wrapping elk anker wordt gebruikt voor het stylen van de afbeelding; ze zijn niet expliciet vereist.
Nu gaan we een maken preloader.css
stylesheet in de css
map en maak daarbinnen een submap aan ik
waarin we ons preloader-pictogram behouden. Preloaders.net heeft een mooie verzameling laadpictogrammen waaruit u kunt kiezen. Voeg de volgende code toe aan uw stylesheet:
* marge: 0; padding: 0; body background: url (i / bg.jpg); #container width: 960px; marge: 0px auto; h2 font-weight: 100; text-shadow: #ffffff 1px 1px 0px; text-align: center; padding: 20px; font-size: 32px; color: # 555555; border-bottom: 1px dashed #ccc; margin-bottom: 30px; font-family: Georgia, "Times New Roman", Times, serif;
Eerst hebben we een gemaakt 960px
gecentreerde container en hebben een achtergrond toegevoegd aan de pagina. Daarnaast hebben we wat basisstyling toegevoegd aan de titel ( h2
label ).
Vervolgens zullen we de galerij stylen en, terwijl we bezig zijn, wat CSS3-goedheid inbrengen.
#gallery lijststijl: geen; #gallery li background: # e8e8e8; float: left; display: block; rand: 1px vast # d7d7d7; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: 1px 1px 6px #ddd; -moz-box-shadow: 1px 1px 6px #ddd; box-shadow: 1px 1px 6px #ddd; marge: 15px 56px; padding: 0; #gallery li p border: 1px solid #fff; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; margin: 0; padding: 7px; #gallery li a display: block; color: # fff; text-decoration: none; padding: 0; #gallery img width: 315px; Hoogte: 210px; margin: 0; padding: 0;
Op dit punt zou onze galerij er als volgt uit moeten zien:
Laten we een maken preloader
klasse die verantwoordelijk is voor het weergeven van het laadpictogram, terwijl de afbeeldingen worden geladen.
.preloader background: url (i / 89.gif) center center no-repeat #ffffff; weergave: inline-block;
Het preloader element is tonen
eigenschap moet worden ingesteld op blok
of inline blok
; Anders wordt het laadpictogram niet weergegeven.
Laten we beginnen met het maken van de plug-insstructuur en opties.
Het toestaan van aanpassingsopties maakt een plugin veel flexibeler voor de gebruiker.
We beginnen met de basisstructuur:
$ .fn.preloader = function (options) var defaults = delay: 200, preload_parent: "a", check_timer: 300, ondone: function () , oneachload: function (image) , fadein: 500 ; // variabelen declaratie en precaching afbeeldingen en parent container var opties = $ .extend (standaardinstellingen, opties),
Vervolgens verklaren en precachen we de variabelen die we in de rest van de plug-in zullen gebruiken.
var defaults = delay: 200, preload_parent: "a", check_timer: 300, ondone: function () , oneachload: function (image) , fadein: 500; // variabelen declaratie en precaching afbeeldingen en parent container var opties = $ .extend (standaardinstellingen, opties), root = $ (this), images = root.find ("img"). css ("visibility": "hidden" ondoorzichtigheid: 0), timer, teller = 0, i = 0, checkFlag = [], delaySum = options.delay;
Ten eerste, we precachen het wortelelement (altijd een best practice), zoeken dan de afbeeldingen (waardoor ze ook verborgen worden) en verklaren tenslotte de variabelen die gedetailleerder zullen worden uitgelegd als we ze tegengaan.
Er zijn twee dingen die de moeite waard zijn om hier te vermelden: je zou in eerste instantie denken dat de eenvoudigste oplossing is om de afbeeldingen te verbergen en ze vervolgens te laten vervagen in plaats van door al deze code te bladeren. Het probleem is echter dat, als we de afbeeldingen verbergen, de browser de ruimte markeert die ze gebruikten om als leeg te bezetten, en dus wordt de lay-out zelf verknoeid wanneer ze uiteindelijk worden vervaagd. Oké, wel, wat als we ondoorzichtigheid
om de afbeeldingen te "tonen" en "verbergen"? Dat is een betere oefening, hoewel sommige versies van IE deze methode niet waarderen.
We herhalen nu elk afbeeldingselement en controleren of het bovenliggende element de naam is die in de optie wordt genoemd. Als dat het geval is, voegen we er onze klasse preloader aan toe; anders verpakken we de afbeelding binnen een ankertag met een klasse van preloader
.
images.each (function () var $ this = $ (this); if ($ this.parent (options.preload_parent) .length == 0) $ this.wrap (""); else $ this. parent (). addClass ("preloader"); checkFlag [i ++] = false;); images = $ .makeArray (afbeeldingen);
Hier gebruiken we een array checkFlag
, en stel de artikelwaarde van elke array in op vals
. Het gebruik ervan zal duidelijk worden gemaakt terwijl u voortbeweegt.
We zullen nu implementeren wat er achter de schermen gebeurt. Er is een boolean
eigenschap, genaamd compleet
, geassocieerd met het afbeeldingsobject. Wanneer de afbeelding volledig is geladen, is deze boolean ingesteld op waar
. Dus we blijven deze eigenschap controleren voor elke afbeelding en, als deze inderdaad is ingesteld op waar
, we vervagen dat beeld.
We kunnen de gebruiken setInterval
functie om continu te bepalen of de afbeeldingen zijn geladen of niet. Dit is waar de check_timer
de optie komt binnen: deze is rechtstreeks gekoppeld aan de frequentie van onze timer.
Een afbeelding heeft ook een onload
evenement geassocieerd met het; je vraagt je waarschijnlijk af waarom we het niet gebruiken. De reden is dat sommige browsers niet goed werken met die gebeurtenis; als zodanig slaan we het over. We hebben een oplossing nodig die voor alle browsers werkt. We beginnen met:
init = function () timer = setInterval (function () , options.check_timer);
timer
is de variabele die naar de timer verwijst. Dit is nodig om de timer uiteindelijk te stoppen. Deze functie wordt samen met alle variabelen gedeclareerd.
We herhalen de array en controleren elke afbeelding compleet
eigenschap om te bepalen of het downloaden is voltooid. Als het is gedownload, stellen we het in op zichtbaar en vervagen langzaam. Wanneer de animatie is beëindigd, verwijderen we de klasse preloader van de bovenliggende.
voor (i = 0; iEr is een klein probleempje hier: de timer blijft controleren - zelfs na de afbeeldingen zijn allemaal geladen. Om dit tegen te gaan, voegen we een tellervariabele toe en verhogen deze nadat elke afbeelding is geladen. Op deze manier kunnen we controleren of de tellervariabele gelijk is aan de grootte van de afbeeldingenreeks. Als dat het geval is, stoppen we.
timer = setInterval (function () if (counter> = checkFlag.length) clearInterval (timer); options.ondone (); return; for (i = 0; iEr is echter nog een klein probleempje. Onze timer kan eerder stoppen dan verwacht; als een afbeelding is geladen, is het
compleet
eigenschap is ingesteld opwaar
en de teller wordt dus met 1 verhoogd. Wanneer de lus de volgende keer wordt uitgevoerd, is de afbeelding al geladen, decompleet
eigenschap is ingesteld opwaar
, en dus zal de lus tweemaal lopen! Om dit probleem op te lossen, gebruiken we decheckFlag
matrix. Wanneer een afbeelding wordt geladen, zullen we instellencheckFlag
naarwaar
, en stel de voorwaarde in dat de teller alleen wordt verhoogd op voorwaarde dat decheckFlag
waarde isvals
. Dus de teller wordt slechts eenmaal verhoogd: wanneer een afbeelding voor de eerste keer wordt geladen.timer = setInterval (function () if (counter & gt; = checkFlag.length) clearInterval (timer); options.ondone (); return; for (i = 0; i & lt; images.length; i ++) if (images [i] .complete == true) if (checkFlag [i] == false) checkFlag [i] = true; options.oneachload (afbeeldingen [i]); counter ++; delaySum = delaySum + options. delay; $ (images [i]). css ("visibility", "visible"). delay (delaySum) .animation (onacity: 1, options.fadein, function () $ (this) .parent ( ) .removeClass ("preloader"););, options.check_timer);Merk op dat we de
ondone
functie wanneer de tellervlag groter is dan de lengte van de array - d.w.z. wanneer alle afbeeldingen zijn geladen. Wanneer de teller wordt opgehoogd,oneachload
wordt aangeroepen met de huidige afbeelding die is doorgegeven als de parameter.
Stap 8: Het gemakkelijke deel
Tot slot noemen we in deze stap de
in het();
functie aan het einde van de plug-in.in het(); / / geroepen bij de laatste lijn van pluginDat is alles; we hebben een volledig werkende plug-in voor preloading gemaakt en de grootte is minder dan 2 kB. Toch blijft er een probleem: de afbeelding van het laadpictogram wordt willekeurig geladen. Dat willen we niet. In de volgende sectie zullen we daar voor zorgen.
Stap 9: De extra mijl gaan
Om het hierboven genoemde probleem te verhelpen, laden we eerst het pictogram en bellen we het
in het
functie. Maar het laadpictogram is een achtergrondafbeelding, dus we injecteren het als een afbeelding op de pagina, maar houden het verborgen. Wanneer het laadt, noemen we hetin het
functie. We zijn in wezen het pictogram zelf aan het laden.var icon = jQuery ("", id: 'loadingicon', src: 'css / i / 89.gif'). hide (). appendTo (" body "); timer = setInterval (function () if (pictogram [0] .complete == true) clearInterval (timer); init (); icon.remove (); return;, 100);Eerst maken we een afbeeldingsobject met een
ID kaart
vanloadingicon
, en eenbron
wijzend naar het pad van het laadpictogram. Vervolgens voegen we het delichaam
en in eerste instantie verbergen. Ten slotte stellen we het interval in om te controleren of het pictogram is geladen of niet. Als dit het geval is, doden we de timer en beginnen we met het vooraf laden van de afbeeldingen. Vergeet ook niet dat pictogram te verwijderen!
Conclusie
Met die laatste stap zijn we klaar! Deze functionaliteit werkt in alle browsers, net zoals verwacht, en degradeert elegant. Zorg er wel voor dat je de preloader-elementen instelt
tonen
eigendom aanblok
ofinline-block
. Het is nu klaar om te worden gebruikt in uw projecten. Bedankt voor het lezen!