slider container opent langzaam

Status
Niet open voor verdere reacties.

lauraahh

Gebruiker
Lid geworden
14 aug 2012
Berichten
47
Beste allemaal,

Ik heb weer een lastige vraag ik heb zelf een slider gemaakt die als header moet gaan dienen.
het probleem is alleen als de pagina opstart hij eerst alle plaatjes in de container laat zien. en deze daarna inklapt.

Mij was het eerst niet opgevallen, omdat ik snel internet hebt. maar als je in IE hem opent zie je het wel heel snel gebeuren.
Mijn baas had hem thuis op de ipad geopend en daar duurde het gewoon 5 sec voordat hij in elkaar schoof, dat kan natuurlijk niet. :confused:

https://shop.heditex.nl/websolutions/default.aspx?wsmt=wscontact&menu=423

Ik heb het op deze pagina laten staan zodat ik kan testen.

iemand een idee hoe ik dit kan oplossen.

ik heb het volgende al geprobeerd.
de css in de hoofd css te zetten.
 
Je zou de images van te voren kunnen inladen met

HTML:
    <SCRIPT language="JavaScript">
    <!--

    if (document.images)
    {
      preload_image_object = new Image();
      // set image url
      image_url = new Array();
      image_url[0] = "http://mydomain.com/image0.gif";
      image_url[1] = "http://mydomain.com/image1.gif";
      image_url[2] = "http://mydomain.com/image2.gif";
      image_url[3] = "http://mydomain.com/image3.gif";

       var i = 0;
       for(i=0; i<=3; i++) 
         preload_image_object.src = image_url[i];
    }

    //-->
    </SCRIPT>

dit stukje Javascript tussen de head-tags
 
Code:
  <link href="..//websolutions/WSData/WSStyle/Heditex2012/header/styles/style.css" type="text/css" rel="stylesheet"/>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script src="..//websolutions/WSData/WSStyle/Heditex2012/header/scripts/jflow.plus.min.js" type="text/javascript"></script>
<script type="text/javascript">
	$(document).ready(function(){
	    $("#myController").jFlow({
			controller: ".jFlowControl", 
			slideWrapper : "#jFlowSlider", 
			slides: "#mySlides",  
			selectedWrapper: "jFlowSelected",  
			effect: "flow", 
			width: "970px",  
			height: "250px",  
			duration: 400,  			
			pause: 5000, 
			prev: ".jFlowNext", 
			next: ".jFlowPrev", 
			auto: true	
    });
});
</script>


  <div id="sliderContainer">
    <div id="mySlides">
      <div id="slide1" class="slide"> <img src="..//websolutions/WSData/WSStyle/Heditex2012/header/images/header_home_image1.png" width="970" height="250" /></div>
      <div id="slide2" class="slide"> <img src="..//websolutions/WSData/WSStyle/Heditex2012/header/images/header_home_image2.png" width="970" height="250" /></div>
      <div id="slide3" class="slide"> <img src="..//websolutions/WSData/WSStyle/Heditex2012/header/images/header_home_image3.png" width="970" height="250" /></div>
      <div id="slide4" class="slide"> <img src="..//websolutions/WSData/WSStyle/Heditex2012/header/images/header_home_image4.png" width="970" height="250" /></div>
      <div id="slide5" class="slide"> <img src="..//websolutions/WSData/WSStyle/Heditex2012/header/images/header_home_image5.png" width="970" height="250" /></div>
    </div>
    <div id="myController"> 
        <span class="jFlowControl"></span> 
        <span class="jFlowControl"></span> 
        <span class="jFlowControl"></span> 
        <span class="jFlowControl"></span>
        <span class="jFlowControl"></span> 
    </div>
    <div class="jFlowPrev"></div>
    <div class="jFlowNext"></div>
  </div>

Waar zou ik dat dan precies moeten neerzetten.
Had hem in de bestaande javascript gezet, maar toen deed heel mijn code het niet meer
 
Om te beginnen zou ik die .png afbeeldingen omzetten naar jpg afbeeldingen, die nemen een stuk minder ruimte in en zullen dus sneller laden. Het is ook een stuk prettiger voor mobiele bezoekers die rekening moeten houden met hun datalimiet.
 
Foto's verandert in jpg, qua formaat maakte het niet heel veel uit.

Maar ik zie het in IE nog steeds gebeuren, dus nog niet echt opgelost.
 
Van het verkleinen (qua opslagruimte) van de afbeeldingen zul je idd het meeste profijt hebben. Als dat nog niet voldoende is, heb ik een variatie op de suggestie van Milenko voor je:

't Idee is dat in de eerste instantie alleen het eerste plaatje geladen wordt. In je script laad je dan de rest van de plaatjes. Pas als ze allemaal geladen zijn, wordt de slider geactiveerd. Op die manier voorkom je ook het effect van het 'in elkaar schuiven' van de plaatjes die gebruikt worden voor je slider. (Als 't goed is, iig, heb het niet getest :P)

[JS]function addEvent(obj, type, callback, useCapture) {
if (obj.addEventListener) {
obj.addEventListener(type, callback, useCapture);
}
else if (obj.attachEvent) {
obj.attachEvent("on" + type, callback);
}
else {
console.warn("Failed to add " + type + "-event, ", obj);
}
}

(function() {

var documentReady = false, imageReadyCount = 0, urls = [
"..//websolutions/WSData/WSStyle/Heditex2012/header/images/header_home_image2.png",
"..//websolutions/WSData/WSStyle/Heditex2012/header/images/header_home_image3.png",
"..//websolutions/WSData/WSStyle/Heditex2012/header/images/header_home_image4.png",
"..//websolutions/WSData/WSStyle/Heditex2012/header/images/header_home_image5.png"
], images = [];

function checkReady() {
if (documentReady && imageReadyCount == urls.length) {

var mySlides = document.getElementById("mySlides");
for (var i = 0; i < images.length; i++) {
var div = document.createElement("div");
div.id = "slide" + (i + 2);
div.className = "slide";
div.appendChild(images);
mySlides.appendChild(div);
}

$("#myController").jFlow({
controller: ".jFlowControl",
slideWrapper : "#jFlowSlider",
slides: "#mySlides",
selectedWrapper: "jFlowSelected",
effect: "flow",
width: "970px",
height: "250px",
duration: 400,
pause: 5000,
prev: ".jFlowNext",
next: ".jFlowPrev",
auto: true
});

}
}
function onImgReady() {
images.push(this);
imageReadyCount++;
checkReady();
}
function onImgError(e) {
console.warn("Image not loaded, ", this.src);
imageReadyCount++;
checkReady();
}

$(document).ready(function(){
documentReady = true;
checkReady();
});

//Image preloading
for (var i = 0; i < urls.length; i++) {
var img = new Image();
img.src = urls;
img.width = 970;
img.height = 250;
addEvent(img, "ready", onImgReady, false);
addEvent(img, "error", onImgError, false);
}

})();[/JS]

#mySlides:
HTML:
<div id="mySlides">
    <div id="slide1" class="slide"> <img src="..//websolutions/WSData/WSStyle/Heditex2012/header/images/header_home_image1.png" width="970" height="250" /></div>
</div>

Edit:
Als je je plaatjes van .png-files naar .jpg-files verandert, moet je dat natuurlijk in bovenstaande code ook nog even doen ;)
 
Laatst bewerkt:
hij schuift inderdaad dankzij dit scripje niet meer in elkaar.
Alleen heel me slider werkt niet meer.
Zal de code online laten staan op de contact pagina.


En dit scripje is mij te moeilijk zodat ik hem niet eens begrijp. :confused:
Een designer programeer werk laten doen;)
 
Ah, dat is een foutje van mijn kant. Dat krijg je als je scriptjes niet test :( :P

Dit is een verbeterde versie. De urls op regel 27 t/m 30 hebben van mij even een lokaal pad gekregen, maar dat kun je zelf wel weer verbeteren lijkt me? ;)

Mijn testpagina: http://robins.awardspace.com/helpmij/lauraahh/

Ik zal even de werking toelichten - ook leuk voor jou om te weten hoe je website werkt :P
De HTML begint dus met één plaatje, dat gelijk met de pagina geladen zal worden (in het bijzonder: als het document geladen is, is je plaatje dat ook).

- Bij een bezoek aan je website zal éérst de JavaScript uitgevoerd worden. Dat script doet in principe twee dingen: wachten tot het document geladen is (r. 73) en de rest van de plaatjes laden (r. 79, urls op r.27)
- Wanneer een plaatje geladen is (onImgReady, r. 62), zal deze toegevoegd worden aan de array images, de array waar we de geladen plaatjes in zetten. De teller (imageReadyCount) wordt opgehoogd, en de check uitgevoerd (checkReady).
- checkReady controleert of zowel de pagina als de rest van de plaatjes geladen zijn. Is dat het geval, dan wordt de rest van de plaatjes toegevoegd aan de pagina, en een slider van het hele ding gemaakt :)

[JS]function addEvent(obj, type, callback, useCapture) {
if (obj.addEventListener) {
obj.addEventListener(type, callback, useCapture);
}
else if (obj.attachEvent) {
obj.attachEvent("on" + type, callback);
}
else {
console.warn("Failed to add " + type + "-event, ", obj);
}
}
function partial (f /*, args */) {
var args = Array.prototype.slice.call(arguments, 1);
return function partialFunction(/* arguments */) {
var i = 0, j = 0, _args = [];
while (i < args.length || j < arguments.length) {
_args.push(args !== undefined ? args : arguments[j++]);
i++;
}
return f.apply(this, _args);
};
}

(function() {

var documentReady = false, imageReadyCount = 0, urls = [
"img/header_home_image2.jpg",
"img/header_home_image3.jpg",
"img/header_home_image4.jpg",
"img/header_home_image5.jpg"
], images = [];

function checkReady() {
if (documentReady && imageReadyCount == urls.length) {

var mySlides = document.getElementById("mySlides");
for (var i = 0; i < images.length; i++) {
var div = document.createElement("div");
div.id = "slide" + (i + 2);
div.className = "slide";
div.appendChild(images);
mySlides.appendChild(div);
}

$("#myController").jFlow({
controller: ".jFlowControl",
slideWrapper : "#jFlowSlider",
slides: "#mySlides",
selectedWrapper: "jFlowSelected",
effect: "flow",
width: "970px",
height: "250px",
duration: 400,
pause: 5000,
prev: ".jFlowNext",
next: ".jFlowPrev",
auto: true
});

}
}
function onImgReady(img) {
images.push(img);
imageReadyCount++;
checkReady();
}
function onImgError(img) {
console.warn("Image not loaded, ", img.src);
imageReadyCount++;
checkReady();
}

$(document).ready(function(){
documentReady = true;
checkReady();
});

//Image preloading
for (var i = 0; i < urls.length; i++) {
var img = new Image();
img.src = urls;
img.width = 970;
img.height = 250;
addEvent(img, "load", partial(onImgReady, img), false);
addEvent(img, "error", partial(onImgError, img), false);
}

})();[/JS]
 
@ robin s - Dankje wel, dit heeft heel erg geholpen.

Ook de plaatjes heb ik opgeslagen in jpg lage kwaliteit. dan scheelde het inderdaad wel. nu is de laad tijd een stuk sneller.

Nu nog een probleem met me andere javascript op lossen, (het botst)
https://shop.heditex.nl/websolutions/default.aspx?wsmt=wscontent&code=POS materiaal
zie op deze pagina.

Ik dacht het zelf via een iframe aan te roepen, waardoor het in theorie op een andere pagina staat.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan