JavaScript - Praxistutorial 1 - Scrollen
1. Die Abschnitte
2. Und jetzt nach links
Als erstes nehmen wir uns nun die Funktion moveLeft
vor. Damit bewegen wir die Bildnavigation nach links. Zunächst benötigen
wir zwei Variablen. In der ersten definieren wir die aktuelle Position des "Scroll"-div
und in der zweiten die minimal mögliche
Links-Position desselben. Wir wollen ja nicht, dass alles irgendwo im Nirwana landet.
function moveLeft()
{
var leftpos = parseInt(scroll_ele.style.left);
var minpos = (pic_width - 440) * - 1;
}
Erläuterung
Zunächst mal legen wir mit var
fest, dass beide Variablen lokal, also nur innerhalb(!) der Funktion verfügbar sind. Damit
vermeiden wir, dass wir aus Versehen in einer anderen Funktion dieselben Namen für etwas völlig Anderes verwenden und uns die Anwendung
um die Ohren fliegt.
leftpos
Mit scroll_ele.style.left
holen wir uns die aktuelle Links-Position des div
-Elements. Erinnert ihr euch noch?
scroll_ele
hatten wir schon in < body onload ... >
definiert mit scroll_ele =
document.getElementById('navi');
. Aber was soll das parseInt
? Nun, ohne das bekämen wir Werte wie 0px
oder -20px
. Leider kann man mit denen nicht rechnen, da es sich dabei um Zeichenketten handelt. Also wandeln wir sie mit
parseInt
in eine Zahl um. Es gibt auch noch eine andere Variante, aber die stelle ich in einem späteren Tutorial vor.
minpos
Dies ist die minimale Links-Position, die das div
haben darf. pic_width
hatten wir ja schon
vorher festgelegt als die Gesamtbreite der Bildnavigation. Also ziehen wir 6 Bilder à 70 Pixel plus ein
wenig Sicherheitsabstand davon ab. Das sind ist dann die 440
. Und da wir die Navigation nach links verschieben wollen,
benötigen wir negative Werte, daher das * - 1
.
Bewegen
function moveLeft()
{
...
if (leftpos >= minpos)
{
scroll_ele.style.left = leftpos - tempo + 'px';
lefti = setTimeout ('moveLeft()', time);
}
}
Erläuterung
Zuerst überprüfen wir, ob die aktuelle Links-Position größer/gleich der festgelegten Minimalposition ist (if (leftpos >=
minpos)
). Wenn dem so ist, verschieben wir das Scrollelement um tempo
plus der Einheit px
nach links.
Den Wert der Variable hatten wir ja schon zu Beginn mit 10
festgelegt.
Die Animation
Zunächst mal fällt dem geübten Auge auf, dass wir die Funktion moveLeft()
in selbiger noch mal aufrufen (setTimeout
('moveLeft()', time);
). Dabei handelt es sich um eine Art von Rekursion. Also eine Funktion ruft sich selber wieder auf. In diesem Fall bedeutet das einfach gesagt, dass
scroll_ele.style.left = leftpos - tempo + 'px';
erneut ausgeführt wird. Und das geschieht immer und immer wieder, solange
die Bedingung if (leftpos >= minpos)
wahr ist.
Kommen wir nun zu der setTimeout
-Sache. Um die zu verstehen ersetzt mal spaßeshalber die Zeile durch ein einfaches
moveLeft();
. Wenn ihr jetzt mit der Maus auf den linken Pfeil geht, so hüpft die Bilderleiste sofort(!) komplett nach links.
Das liegt daran, dass in so einem Fall erst der komplette Code ausgeführt wird, und man dann danach(!) das Ergebnis zu
Gesicht bekommt.
setTimeout
dagegen führt den im ersten Parameter angegebenen Code mit einer Zeitverzögerung aus. Die wird im zweiten Parameter
festgelegt (time
), wobei der Wert in Millisekunden gerechnet wird. Interessant ist noch die Variable lefti
. Sie
stellt eine Referenz auf die setTimeout
-Methode dar. Und die benötigen wir, um die Animation zu beenden.
Stoppen
Das ist in diesem Fall ganz einfach. Wir haben ja die global verfügbare Referenzvariable lefti
für die
setTimeout
-Methode. Und nun müssen wir nichts anderes tun, als Letztere zu beenden. Das geschieht mit clearTimeout
,
wobei der Parameter die Referenz auf setTimeout
ist.
function stopLeft()
{
clearTimeout(lefti);
}
3. Und jetzt nach rechts
function moveRight()
{
var leftpos = parseInt(scroll_ele.style.left);
if (leftpos < 0)
{
scroll_ele.style.left = leftpos + tempo + 'px';
righti = setTimeout ('moveRight()', time);
}
}
function stopRight()
{
clearTimeout(righti);
}
Erläuterung
Der Code ist fast identisch mit dem bisherigen. Daher gehe ich nur auf die Unterschiede ein. if (leftpos < 0)
besagt ganz
einfach nur, solange sich das div
-Element nicht an seiner ursprünglichen Position, also der 0 befindet. Und da wir diesmal
alles nach rechts bewegen wollen, nehmen wir anstelle des Minus ein Plus bei leftpos + tempo + 'px';
.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt