script "omdraaien"

Status
Niet open voor verdere reacties.

henkhoogerbrug

Gebruiker
Lid geworden
25 sep 2008
Berichten
107
Hallo,

Ik heb hier een javascript (kwam het op diverse internet sites tegen), waarmee ik afbeeldingen naar links kan laten schuiven. Ik wil nu echter ook een zelfde soort script, waamee ik de afbeeldingen naar rechts zou kunnen laten schuiven. Ik ben alleen nog niet zo heel goed met javascript, dus kom er ook niet uit. Is er hier misschien iemand die me verder kan helpen?

Code:
function schuiflinks(){
if (iedom){
if (parseInt(afb.style.left)>(huidige_breedte*(-1)+8))
afb.style.left=parseInt(afb.style.left)-kopieersnelheid
else
afb.style.left=parseInt(afb2.style.left)+huidige_breedte+4

if (parseInt(afb2.style.left)>(huidige_breedte*(-1)+8))
afb2.style.left=parseInt(afb2.style.left)-kopieersnelheid
else
afb2.style.left=parseInt(afb.style.left)+huidige_breedte+4

}
else if (document.layers){
if (ns_slide.left>(huidige_breedte*(-1)+8))
ns_slide.left-=kopieersnelheid
else
ns_slide.left=ns_slide2.left+huidige_breedte+4

if (ns_slide2.left>(huidige_breedte*(-1)+8))
ns_slide2.left-=kopieersnelheid
else
ns_slide2.left=ns_slide.left+huidige_breedte+4
}
}
 
rrrrh, dit script is echt horrible. Het punt is dat het een _stuk_ beter, sneller, etc. kan. Maar, dan heb ik meer code nodig dan dit, want zo is het ondoenelijk.


Overgens, je 'schuift' met style.left. Bijvoorbeeld:
[JS]var obj = document.getElementById('plaatje');
obj.style.left = parseInt(obj.style.left) + 5 + 'px'; //naar rechts, +
obj.style.left = parseInt(obj.style.left) - 5 + 'px'; //naar links, -
[/JS]
HTML:
<img src='iets.png' id='plaatje' />
 
vegras, bedankt voor je reactie.
de code heb ik van http://www.leejoo.nl/java/imageeffects/foto_slider.htm gehaald.

De aanpassingen die ik heb gedaan zijn niet belangrijk voor de oplossing (array vullen m.b.v. php en snelheid wijzigen n.a.v. de muispositie).

ik heb het idd ook nog voor elkaar gekregen om de afbeeldingen naar rechts te laten schuiven, alleen had ik dan het probleem dat het zich niet herhaalde (waarschijnlijk omdat ik nog steeds niet doorheb wat ik precies doe).
 
Hmm, leejoo scriptjes zijn heel leuk, maar niet echt handig, zoals je zelf hebt gemerkt. Ze zijn niet echt gemaakt om makkelijk te veranderen.

Op helpmij staan aardig wat leuke ideeen en scripts, en een daarvan is deze van Lapixx. Erg net script! Mischien heb je er wat aan, want hij is een stuk makkelijker aan te passen dan die van jou.

Ik heb even een snel voorbeeldje online gezet: http://bin.void-studios.com/helpmij/superslide.html. Tijden tussen het wisselen etc. kan je makkelijk aanpassen.



:thumb:
 
Laatst bewerkt:
vegras, bedankt voor je voorbeeld. Dat ziet er idd een stuk eenvoudiger uit.

Ik ben nu begonnen om de code te bewerken zodat het ook naar rechts kan schuiven. Het schuiven is het probleem niet, maar wel het laten aansluiten van de foto's.

Wanneer de foto's naar links schuiven, dan sluiten de foto's netjes aan. Wanneer ik ze echter naar rechts laat schuiven, dan krijg ik dat niet voor elkaar (heeft dit met de css te maken?). Wanneer met deze code de div "slidestroke" een nieuwe style krijgt, dan verdwijnen de foto's die op dat moment getoond werden.
Ik heb onderstaande code:

Code:
function slide(){
    slide_x+=2;
    document.getElementById("slidestroke").style.left=slide_x+"px";
    if(slide_x<+slide_n*slide_w){
        window.setTimeout(slide,10);
    }
    else{
        swap(slide_n);
        window.setTimeout(slide,1000);
    }
}
function swap_right(n){
    while(n>0){
        e=document.getElementById("slidestroke");
        slide_x=slide_w*-4;		
               //slide_x = 300 * -4 (omdat er 4 foto's zijn van 300 breed)
        e.style.left=slide_x+"px";
        e.appendChild(e.getElementsByTagName('img')[0]);
        n--;
    }
}

Waarvoor gebruik je eigenlijk deze regel? Moet die bij schuiven naar rechts naar de laatste foto verwijzen?:
Code:
e.appendChild(e.getElementsByTagName('img')[0]);
 
Aan de css zal t niet liggen - deze zou in bijde gevallen hetzelfde moeten werken.

Het punt is met het omdraaien, dat deze regel[JS]e.appendChild(e.getElementsByTagName('img')[0]);[/JS]ervoor zorgt dat je een element append; dwz, erachteraan plakt. Omdat je het omdraaid wil je m er juist voor hebben.

Als ik tijd over heb zal ik even kijken of ik er wat aan kan veranderen.
 
dat zou ik echt geweldig vinden als je hier tijd voor hebt.

Ik ben inmiddels een klein stapje verder. Ik heb de foto's even een kleur gegeven om duidelijk te zien wat de volgorde is. Met onderstaande code schuiven de foto's naar rechts. Zodra de pagina wordt geladen zou de laatste foto vooraan moeten worden geplakt. Dit gebeurt volgens mij wel, maar daarmee verdwijnen ook de foto's die al in beeld waren.

Volgens mij wordt de hele div "slidestroke" nu eerst naar links verplaatst. Wanneer ik een kopie zou maken, dan zou het wel werken. Probleem is echter dat je dan ook dubbel zoveel laadtijd nodig hebt.

Code:
<html>
<body>

<style>
#slideview{
width: 900px;
height: 200px;
overflow: hidden;
border: 3px solid #000000;
padding: 0px;
}

#slidestroke{
position: relative;
/*left: 0px;*/
width: 9000px;
text-align: left;
padding: 0px;
height: 100%;
}
</style>

<script>
slide_x=0;
slide_n=1;
slide_w=300;

function slide_right(){
    slide_x+=1;
    document.getElementById("slidestroke").style.left=slide_x+"px";
    if(slide_x<+slide_n*slide_w){	//slide_x < +1*300
	if(slide_x>0){
	   swap_right(slide_n);
	   }
        window.setTimeout(slide_right,10);
    }
    else{
	//alert ('roep swap() aan '+slide_x);
        swap_right(slide_n);
        window.setTimeout(slide_right,10);
    }
}
function swap_right(n){
    while(n>0){
        e=document.getElementById("slidestroke");
        slide_x=slide_w*-4;		//slide_x = 300 * -4
        e.style.left=slide_x+"px";
        e.appendChild(e.getElementsByTagName('img')[3],e.lastChild);
        n--;
    }
}

window.onload=window.setTimeout(slide_right,1000);

</script>

<div id="slideview">
	<div id="slidestroke">
		<img src="foto1.jpg" height="200" width="300" style="background-color:yellow;"><img src="foto2.jpg" height="200" width="300" style="background-color:blue;"><img src="foto3.jpg" height="200" width="300" style="background-color:green;"><img src="foto4.jpg" height="200" width="300" style="background-color:red;">
	</div>
</div>

</body>
</html>
 
Probleem is opgelost. Ik moet de code nog even goed ordenen. Daana zal ik het even in dit topic plaatsen (ben wel benieuwd of dit namelijk ook een praktische oplossing is: foto's gebruiken soms nogal wat laadtijd).

Ik heb de foto's nu in een array gezet (in de werkelijke omgeving moet deze m.b.v. php worden opgebouwd o.b.v. het aantal foto's in de betreffende map).
Met JS regel ik nu dat er iedere keer 1 foto aan het eind wordt weggehaald en aan het begin van de array wordt ingevoegd.
 
Ik heb nu onderstaande code, het schuiven naar links en rechts werkt super (ik heb het nog niet geprobeerd met een grote hoeveelheid foto's).
Het enige probleem wat ik nu nog heb is dat ik zodra ik bijv. op het gele blok in de slidestroke klik, een andere kleur blok onder de slidestroke krijg (dit zou echter dezelfde kleur moeten zijn). Weet iemand hoe dit komt? Ik geef toch per img duidelijk een onClick argument aan?

Code:
<html>
<head>

<style>
#slideview{
position:relative;
margin-left: 200px;
width: 900px;
height: 200px;
overflow: hidden;
border: 3px solid #000000;
padding: 0px;
}

#slidestroke{
position: absolute;
left: 0px;
width: 9000px;
text-align: left;
padding: 0px;
height: 100%;
margin-left: -300px;
}
</style>

<script language="JavaScript">
var blok = new Array;
blok[0]=['<img id="img0" src="foto1.jpg"',' width="300" height="200"',' style="background-color:yellow;"',' onClick="showImage(\'showimage\',0)"','>'];
blok[1]=['<img id="img1" src="foto2.jpg"',' width="300" height="200"',' style="background-color:blue;"',' onClick="showImage(\'showimage\',1)"','>'];
blok[2]=['<img id="img2" src="foto3.jpg"',' width="300" height="200"',' style="background-color:green;"',' onClick="showImage(\'showimage\',2)"','>'];
blok[3]=['<img id="img3" src="foto4.jpg"',' width="300" height="200"',' style="background-color:red;"',' onClick="showImage(\'showimage\',3)"','>'];
blok[4]=['<img id="img4" src="foto5.jpg"',' width="300" height="200"',' style="background-color:purple;"',' onClick="showImage(\'showimage\',4)"','>'];

var slide_a = 3;		//total of visible thumbnails
var slide_x = 0;		//start position in pixels
var slide_n = 1;		//counter (used in "while"-loop)
var slide_w = 300;		//width of thumbnail
var slide_i = 'slidestroke';	//id of element (in this case the div "slidestroke"
var Items = blok.length;	//total of thumbnails in array
var breedte = slide_a*slide_w;	//width of slidestroke
var speed = 0;			//initial slidespeed
var left = breedte/3;		//from 0 to [left] --> area which triggers left slide show
var right = breedte-left;	//from right to [breedte] --> area which triggers right slide show


function handler(e){
//Get coördinates of mousepointer.

    e = e || window.event; 

    var mousex = e.layerX || e.x || e.offsetX; 
    var mousey = e.layerY || e.y || e.offsetY;

return mousex;
}


function slidespeed(){
//The more the mousepointer is to the left or to the right, the faster the slideshow will scroll.
//The div "slidestroke" is devided into 7 parts: left_sp-3, left_sp-2, left_sp-1, sp-0, right_sp-1, right_sp-2, right_sp3

mousex=handler();
speed=0			//speed is 0 (= no scroll), 1, 2 or 3
if (mousex<=left/3){
	speed=-3;
	}
else if(mousex>left/3 && mousex<=left/2){
	speed=-2;
	}
else if(mousex>left/2 && mousex<=left){
	speed=-1;
	}

if (mousex>=breedte-(left/3)){
	speed=3;
	}
else if(mousex<breedte-(left/3) && mousex>=breedte-(left/2)){
	speed=2;
	}
else if(mousex<breedte-(left/2) && mousex>=right){
	speed=1;
	}

return speed;
}

function slide(n){

if(n==1){
//only used for page load, trigger is: body onload="slide(1)"
	swap_right(slide_n);
	n--;
	}
else{
	slide_x+=speed;
	if(speed>0){
		if(slide_x>=slide_w && slide_x<=slide_w+3){	//slide_x is 300 - 303
			slide_x-=slide_w;
			swap_right(slide_n);
		}
	}
	else if(speed<0){
		if(slide_x<=-slide_w || slide_x<=0){
			slide_x+=slide_w;
			swap_left(slide_n);
			}
	}

	document.getElementById(slide_i).style.left=slide_x+"px";
	}

window.setTimeout(slide,10);
}


function swap_right(n){
	while(n>0){
		blok.splice(0,0,blok[Items-1]);
		blok.splice(Items,1);
		document.getElementById(slide_i).innerHTML = blok.join('');
	n--;
	}
}


function swap_left(n){
	while(n>0){
		blok.splice(Items,0,blok[0]);
		blok.splice(0,1);
		document.getElementById(slide_i).innerHTML = blok.join('');
	n--;
	}
}


function showImage(location,number){
alert(blok[number][0]+' width="450" height="338"'+blok[number][2]+blok[number][4]);
document.getElementById(location).innerHTML = blok[number][0]+' width="450" height="338"'+blok[number][2]+blok[number][4];
}

</script>

</head>
<body >
<div id="slideview">
	<div id="slidestroke" onMouseMove="speed=slidespeed()" onMouseout="speed=0">
	</div>
</div>
<center>
<div id="showimage" style="width:450px;height:338px;"></div>
</center>

<script language="JavaScript">
window.onload=slide(1);
</script>
</body>
</html>

ps. dit is alleen maar testcode, de bedoeling is om deze code te integreren met php, zodat de array al serverside wordt opgebouwd.
 
zojuist heb ik ook nog even getest met foto's, probleem is dan dat de de div "slidestroke" sneller schuift dan dat de foto's worden geladen. Resultaat: je ziet niets tijdens het schuiven.
Wellicht dat dit verandert als ik de foto's resize, maar wat als het er 100 zijn?
Hoe kan ik dit probleem oplossen?
 
Het foto probleem is opgelost door de foto's te resizen (met een image resizer) naar het juiste formaat. Hierdoor wordt de laadtijd zeer sterk verkort.

Ik blijf nu dus alleen met het probleem zitten dan de onClick functie niet goed werkt. Als ik op een kleine afbeelding klik, dan moet die afbeelding in groot formaat worden weergegeven. Volgens mij is dat ook wat in het script staat. In praktijk wordt er echter een andere afbeelding vergroot (meestal 1 of 2 naar rechts en het maakt niet uit of je de scroll-functie al actief is geweest).

Hopelijk is er iemand die uitsluitsel kan geven, of een tip hoe het beter kan?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan