Scripaculous TutorialEffekte

Grundeffekte - Core Effects


Allgemein

Es gibt in Scriptaculous fünf Grundeffekte, so genannte 'Core Effects': Effect.Opacity, Effect.Scale, Effect.MoveBy, Effect.Highlight und Effect.Parallel.

Alle Effekte haben den selben Aufbau und gemeinsame Grundparameter. Ein Effekt besitzt folgenden grundlegenden Aufbau:

new Effect.Name(Element, Pflichtparameter, {Optionale, Parameter});

Element kann die ID eines Elements sein oder ein DOM Element.

Pflichtparameter kommen nicht bei allen Effekten vor. Ob und welche Pflichtparameter angegeben werden müssen, ist für jeden Effekt einzeln angegeben.

Optionale Parameter können angegeben werden, müssen aber nicht. Werden sie nicht spezifiziert, wird der Standard-Wert angenommen:

Parameter Beschreibung
duration Dauer des Effekts in Sekunden. Standard:1.0.
fps Frames pro Sekunde. maximal 100, Standard:25.
transition Setzt eine Funktion, die den aktuellen Fortschritt eines Effektes, welcher zwischen 0.0 und 1.0 liegt verändert, sprich den Übergang eines Elements von einem Zustand zum nächsten. Funktionen die dafür angegeben werden können sind: Effect.Transitions.sinoidal (Standard), Effect.Transitions.linear, Effect.Transitions.reverse, Effect.Transitions.wobble und Effect.Transitions.flicker.
from Setzt den Startpunkt des Übergangs (transition)auf einen Wert zwischen 0.0 und 1.0. Standard: 0.0
to Setzt den Endpunkt des Übergangs (transition)auf einen Wert zwischen 0.0 und 1.0. Standard: 1.0
sync Bestimmt, ob Frames automatisch gerendert werden(false), oder mittels der render() Instanzmethode der Effekte (true). Standard: false.

Für den transition-Parameter gibts beim Effect.MoveBy Beispiele.

Zusätzlich können noch so genannte 'Callback'- Methoden als Parameter angegeben werden, mit denen JavaScript-Funktionen an bestimmten Zuständen des Effekts ausgeführt werden können.

Callback Beschreibung
beforeStart Wid aufgerufen, bevor der Effekt gestartet wird.
beforeUpdate Wird bei jedem Durchlauf des Effekts vor Neuzeichnen des Elements aufgerufen.
afterUpdate Wird bei jedem Durchlauf des Effekts nach Neuzeichnen des Elements aufgerufen.
afterFinish Wird am Ende des Effektes, nach dem letzten Mal Neuzeichnen aufgerufen.

Außerdem gibt es da noch ein paar nützliche Variablen, deren Werte interessant sein könnten:

Variable Beschreibung
effect.element Enthält das Element, auf das der Effekt angewendet wird.
effect.options Enthhält die Optionalen Parameter die übergeben wurden.
effect.currentFrame Die Nummer des zuletzt gerenderten Frames.
effect.startOn
effect.finishOn
Die Zeit in ms, an der der Effekt gestartet wurde und dessen Ende.

Soweit so gut. Nun werden wir und an einem "richtigen" Effect ansehen wie man mit einigen dieser Funktionen und Eigenschaften arbeitet.

Nach obenNach oben

Effect.Opacity

Opacity bedeutet deutsch 'Deckkraft'. Genau darum geht es hier bei diesem Effekt auch. Mit diesem Effekt kann die Deckkraft eines Elements verändert werden.

Die Syntax des Effects ist ganz simpel:

new Effect.Opacity('Element', {Optionen});

Nun erstellen wir nochmal ein HTML-Dokument und binden wieder unsere zwei JavaScript-Dateien ein. Wieder benötigen wir ein div-Element, doch diesmal setzten wir auch zwei Links. Als Zieladresse setzten wir allerdings nur "#" , was soviel bedeutet, wie "der Link macht nix". Wichtig ist das onclick-Ereignis. Wird also auf den Link geklickt, wird der neue Opacity-Effekt erstellt und dem angegebenen Element zugewiesen.

<html>
<head>
<title>Beispiel 2</title>
<script type="text/javascript" src="js/prototype.js"></script>
<script type="text/javascript" src="js/scriptaculous.js"></script>
</head>
<body>
<div id="div1">Ich bin ein div-Element</div>
<p> <a href="javascript:void(0)" onclick="new Effect.Opacity( 'div1', {duration:0.8, from:1.0, to:0.2} );"> Deckkraft runter</a>
<a href="javascript:void(0)" onclick="new Effect.Opacity( 'div1', {duration:0.8, from:0.2, to:1.0} );"> Deckkraft rauf</a></p>
</body>
</html>

Sehen wir uns nochmal kurz den neuen Code an:

 <a href="javascript:void(0)"
 	onclick="new Effect.Opacity( 'div1', {duration:0.8, from:1.0, to:0.2} );">
 	Deckkraft runter</a>

Tritt das Ereignis 'onclick' auf, wird ein neuer Opacity-Effekt erstellt. Es wird angegeben, dass der Effekt für das Element mit der ID 'div1' ausgeführt werden soll. Der Effekt soll 0.8 Sekunden dauern, von einer Deckkraft von 1.0 (100%) bis 0.2 (20%).

Es ist also nicht wahnsinnig kompliziert mit Effekten zu arbeiten.

Nach obenNach oben

Effect.Scale

Dieser Effekt ermöglicht es Elemente zu skalieren,also zu vergrößern und zu verkleinern. Die Syntax ist wieder ähnlich zu Opacity, mit Ausnahme des hier vorhandenen Pflichtparameters:

new Effect.Scale('Element', Prozent, {Optionen});

Prozent steht für den Prozentsatz, um den das Element skaliert werden soll. Weiters gibt es dann auch noch optionale Parameter:

Parameter Beschreibung
scaleX Bestimmt, ob das Element horizontal skaliert werden soll, Standard: true.
scaleY Bestimmt, ob das Element vertikal skaliert werden soll, Standard: true.
scaleContent Bestimmt, ob der Inhalt des elements mitskaliert werden soll oder nicht, Standard:true.
scaleFromCenter Bestimmt ob das Element so skaliert werden soll, dass die Mitte des Elements immer an der gleichen Stelle ist (true), Standard: false.
scaleMode 'box': skaliert den sichtbaren bereich des Elements (Standard)
'contents': auch die nicht sichtbaren Elemente werden skaliert
{originalHeight: yyy, originalWidth: xxx}: Die genaue Größe, die das Element haben soll.
scaleFrom Setzt den Startwert der Skalierung, Standard:100.

Nun, kommen wir wieder zu einem Beispiel.

<html>
<head>
<title>Beispiel 1</title>
<script type="text/javascript" src="js/prototype.js"></script>
<script type="text/javascript" src="js/scriptaculous.js"></script>
</head>
<body>
<div onclick="new Effect.Scale(this, 300)" style="width:200px; border:1px solid #000;">
Klicken zum skalieren!</div>
</body>
</html>

Es wird also ein div-Bereich erstellt, der auf klick auf das 3-fache anwächst. Nun können wir die verschiedenen Eigenschaften ausprobieren.

Lassen wir das Element zum Beispiel nur in x-Richtung skalieren. dazu geben wir zusätzlich den Parameter scaleY:false an:

<div onclick="new Effect.Scale(this, 300, {scaleY: false})" 
		style="width:200px; height:100px; border:1px solid #000;">
 Klicken zum skalieren!</div> 

Das ganze geht natürlich auch in Richtung der y-Achse. Bei den obigen Beispielen fällt auf, dass sich der Inhalt der Box, also des div-Elementes mitändert. Wollen wir das nicht, so müssen wir den optionalen Parameter scaleContent=false setzen:

<div onclick="new Effect.Scale(this, 200, {scaleContent: false})" 
		style="width:200px; height:100px; border:1px solid #000;">
 Klicken zum skalieren!</div>

Eine Eigenschaft die auch sehr interessant sein könnte ist der scaleFromCenter-Parameter. Wir wollen nun dass sich das Element in alle Richtungen gleich ausbreitet. Dazu verschieben wir es zuerst mittels CSS Styleangaben um den Effekt zu sehen.

Bei der Gelegenheit können wir auch gleich einmal den transition-Parameter verändern und vom Default-Wert Effect.Transitions.sinoidal auf Effect.Transitions.wobble ändern. Genaue Beispiele der transition-Effekte gibts beim Effect.MoveBy Effekt.

<div onclick="new Effect.Scale(this, 200, {scaleFromCenter: false, transition:Effect.Transitions.wobble})" 
		style="width:200px; height:100px;; border:1px solid #000;">
Klicken zum skalieren!</div>

Nach obenNach oben

Effect.MoveBy

Dieser Effekt ermöglicht es, ein Element ganz einfach um einen bestimmten x- bzw. y-Wert zu verschieben.

Die Syntax ist wieder ähnlich wie oben, nur dass diesmal die x- und y-Werte um die verschoben wird Pflichtparameter sind:

new Effect.MoveBy('Element', y, x, {Optionen});

Wichtig ist hierbei, dass für das zu verschiebende Element die CSS-Eigenschaft 'position' mit dem Wert 'absolute' oder 'relative' gesetzt ist. Wird 'position' weggelassen, kann es sein dass der Effekt in älteren Internet Explorer Versionen nicht funktioniert.

<html>
<head>
<title>Beispiel 1</title>
<script type="text/javascript" src="js/prototype.js"></script>
<script type="text/javascript" src="js/scriptaculous.js"></script>
</head>
<body>
<p onclick="new Effect.MoveBy(this, 50, 100)">Klicken um zu bewegen!</p>
</body>
</html>

Hier lassen sich auch sehr schön die verschiedenen transition-Parameter testen.

<p onclick="new Effect.MoveBy(this, 0, 100, 
		{duration:2, transition:Effect.Transitions.sinoidal})">
	Sanfte Bewegung!</p>
<p onclick="new Effect.MoveBy(this, 0, 100, {duration:2, transition:Effect.Transitions.linear})"> Lineare Bewegung!</p>
<p onclick="new Effect.MoveBy(this, 0, 100, {duration:2, transition:Effect.Transitions.reverse})"> Verkehrte Bewegung!</p>
<p onclick="new Effect.MoveBy(this, 0, 100, {duration:2, transition:Effect.Transitions.wobble})"> Wackelige Bewegung!</p>
<p onclick="new Effect.MoveBy(this, 0, 100, {duration:0.5, transition:Effect.Transitions.flicker})"> Flimmernde Bewegung!</p>

Mit diesem Effekt kann zum Beispiel auch eine kleine Animation erstellt werden. Wir erstellen ein Bild, das sich in einem Rahmen hin und her bewegen soll.

<html>
<head>
	<title>Beispiel 1</title>
   <script type="text/javascript" src="js/prototype.js"></script>
   <script type="text/javascript" src="js/scriptaculous.js"></script>
   <script type="text/javascript">
   function moveRight(){
   	Effect.MoveBy('p1', 0, 100, 
	 {duration:1, transition:Effect.Transitions.sinoidal, afterFinish: moveLeft});
   }
   
   function moveLeft(){
   	Effect.MoveBy('p1', 0, -100, 
	 {duration:5, transition:Effect.Transitions.sinoidal, afterFinish: moveRight});
   }
   </script>
   </head>
   <body onload="moveRight();">
   <div style="width:200px; height:200px; overflow:hidden; position:absolute;">
   <img src="pics/wiese.jpg" width="340" height="201" id='p1' 	
			style="position:absolute; left:-120px; z-index:1;" /> 
   </div>
</body>
   </html>

Dieses Beispiel verwendet jetzt die für alle Effekte vorhandenen Callbacks. Wir haben zwei Funktionen, moveRight() und moveLeft(). moveRight() beinhaltet einen MoveBy-Effekt der das Bild um 100 Pixel nach rechts verschiebt. Am Ende des Effektes (afterFinish) wird die Funktion moveLeft() aufgerufen. Diese beinhaltet wiederum einen MoveBy-Effekt der das Bild zurückverschiebt und nach dessen Ende wiederum moveRight() aufgerufen wird. Da beginnt das Spiel von vorne.

Gestartet wird die Animation ganz einfach durch den Befehl moveRight() im Ereignis 'onload' des 'body'-Tags.

Wichtig ist auch, dass im äusseren div-Rahmen die CSS- Eigenschaft 'overflow:hidden;' angegeben wird, sonst fährt das Bild zwar trotzdem hin und her, aber es steht über den Rahmen hinaus, was ja nicht Sinn der Sache ist.

Nach obenNach oben

Effect.Highlight

Der nächste Effekt hebt Elemente hervor, in dem er die Hintergrundfarbe verändert.

Die Syntax ist wieder ähnlich wie oben, wichtig ist bei diesem Effect, dass er nur mit dem Schlüsselwort 'new' aufgerufen wird, sonst wird er nicht funktionieren.

 new Effect.Highlight('Element', [Optionen]);

Für diesen Effekt gibt es drei spezielle Optionsparameter:

Parameter Beschreibung
startcolor Setzt die erste Hintergrundfarbe des Elements, Standard: #ffff99.
endcolor Setzt die Endhintergrundfarbe des Elements. Am besten nimmt man natürlich die originale Hintergrundfarbe des Elements, Standard: #ffffff.
restorecolor Setzt die Hintergrundfarbe des Elements nachdem der Effekt beendet wurde. Der Standardwert ist hierbei die Hintergrundfarbe des Elements vor dem Effect.

Nun also wieder das obligatorische erste Beispiel:

<html>
<head>
<title>Beispiel 1</title>
<script type="text/javascript" src="js/prototype.js"></script>
<script type="text/javascript" src="js/scriptaculous.js"></script>
</head>
<body>
<p onmouseover="new Effect.Highlight(this)" style=" background-color:#FF0000;">
Mit der Maus dr&uuml;berfahren! </p>
</body>
</html>

Vielleicht ist es dir auch selbst aufgefallen, aber dieser Effekt hat einen Fehler: Wenn man schnell hintereinander zwei- oder mehrmals mit der Maus über den Absatz fährt, also den Effekt nochmals ausführt bevor er zu Ende ist, kehrt die Hintergrundfarbe nicht mehr in den Originalzustand zurück.

Wenn wir den Parameter 'restorecolor' benützen, können wir den Fehler allerdings umgehen, auch wenns nicht so toll aussieht. Dazu setzen wir ganz einfach 'restorecolor' auf den Wert unserer Hintergrundfarbe, also '#ff0000':

<p onmouseover="new Effect.Highlight(this, {restorecolor:'#ff0000'})"
		style=" background-color:#FF0000;">
	Mit der Maus dr&uuml;berfahren! </p>

 

Nach obenNach oben

 

(C)Copyright 2007 Thomas Lemmé. Feedback und Fragen auf meinem Blog web/code.