Az előzőek alapján már sejthetjük, hogy a layerek és a JavaScript kapcsolatában rengeteg lehetőség rejlik. Ebben a részben néhány ilyen lehetőséggel ismerkedhet meg részletesebben az olvasó, illetve ötleteket is kaphat a layerek használatát illetően.
Minden layernek kijelölhetünk egy téglalap alakú részét úgy, hogy a layerből csak ez a rész lesz látható. Ezt a műveletet nevezzük vágásnak. Az alábbi egyszerű példában egy kép részét vágjuk ki az <ILAYER> HTML elem CLIP attribútumának segítségével. Természetesen a <LAYER> elem is rendelkezik ezzel az attribútummal.
<ILAYER CLIP="70,90,210,260"> <IMG SRC="kep1.jpg"> </ILAYER>
![]() |
![]() |
|
|
Amint látható, kivágtuk a képet tartalmazó layer (70,90) x (210,260) méretű részét. A CLIP attribútummal a kivágandó téglalap bal felső és jobb alsó csúcsainak koordinátáit definiálhatjuk. Természetesen sokkal látványosabb effektusok készíthetők a kivágásnak és a JavaScriptnek a kombinációjával. A kivágás mezőjét JavaScript-tel is módosíthatjuk, mégpedig úgy, hogy módosítjuk a layer objektum clip.left, clip.top, clip.right, clip.bottom mezőit. Ha új értékeket írunk ezekbe a mezőkbe, akkor a kivágás területe is módosulni fog. A következő példa a kivágás tartományának módosításával ér el egy egyszerű hatást:
<HTML> <HEAD> <SCRIPT LANGUAGE="JavaScript"> <!-- A kód elrejtése var pic_width; var pic_height; var pos; function init(){ pic_width = document.layers["picLayer"].document.kep1.width; pic_height = document.layers["picLayer"].document.kep1.height; pos = 0; start(); } function clip(left,top,right,bottom){ document.layers["picLayer"].clip.left=left; document.layers["picLayer"].clip.top=top; document.layers["picLayer"].clip.right=right; document.layers["picLayer"].clip.bottom=bottom; } function start(){ clip(0,0,pic_width,pos); pos+=2; if (pos < height) setTimeout("start()",10); } // --> </SCRIPT> </HEAD> <BODY> <FORM> <INPUT TYPE="button" VALUE="Start!" onClick="init()"> </FORM> <ILAYER NAME="picLayer"> <IMG SRC="kep1.jpg" NAME="kep1"> </ILAYER> </BODY> </HTML>A start gombra kattintva meghívjuk az init() függvényt. Ez beállít néhány értéket, például meghatározza a kép méreteit. Ezt az alábbi utasításokkal teszi:
pic_width = document.layers["picLayer"].document.kep1.width; pic_height = document.layers["picLayer"].document.kep1.height;A document.layers["picLayer"] segítségével elérjük a "picLayer" nevű layerünket. Ezt követi a document.kep1.width ill. height. Tudnunk kell, hogy minden layer egy document objektummal rendelkezik. Ahhoz, hogy a layeren lévő képet elérhessük, először a document objektumot kell elérnünk.
Az init() függvény hívja meg a start() függvényt, amely a kirajzolást végzi, olymódon, hogy a vágási tartományt folyamatosan növeli. A vágási tartományt a clip() függvény állítja be az átadott paraméterek alapján. A start() függvény setTimeout() segítségével mindaddig fut, amíg el nem értük a kép alját.
Arról már volt szó, hogy a layerek több különböző objektumot tartalmazhatnak. A layerek ezen kívül más layereket is tárolhatnak. Ez arra lehet jó megoldás, ha objektumokat szeretnénk összecsoportosítani. A következő példa jól szemlélteti ezt. Létrehozunk egy "szülő" layert, amely két másik "gyerek" layert tartalmaz. Ha mozgatjuk a szülő layert (jobbra-balra), akkor ez hatással van az általa tartalmazott layerekre is. Azok is mozognak a szülő layerrel együtt. A gyerek layereket azonban külön-külön is mozgathatjuk, a szülőtől függetlenül (le és fel). A példában három gombot is létrehozunk, ezekre kattintva ki-bekapcsolhatjuk az egyes layerek mozgását. Figyeljük meg, hogy a szülő mozgásának kikapcsolása mit eredményez!
A program kódja:
<HTML> <HEAD> <SCRIPT LANGUAGE="JavaScript"> <!-- A kód elrejtése // az adatokat tartalmazó tömb létrehozása layerArr = new Array(); var index = 0; var attr; var border; // új elem létrehozása a layerArr[] tömbben function new_element(pos,moving,dir,layer){ layerArr[index] = new Array(3); // a layerArr minden eleme egy három elemű tömb layerArr[index][0] = pos; // a layer pozíciója layerArr[index][1] = moving; // a layer mozog-e (true = igen, false = nem) layerArr[index][2] = dir; // a layer mozgásának iránya (true = előre, false = hátra) layerArr[index][3] = layer; // a layer objektum index++; } // itt definiálom az új elemeket function init(){ new_element( 50,true, true,document.layers['szulo'].layers['gyerek1']); new_element( 100,true,false,document.layers['szulo'].layers['gyerek2']); new_element( 0,false, true,document.layers['szulo']); } // az i-edik layert megállítja/elindítja function StartStop(n){ layerArr[n-1][1] = !layerArr[n-1][1]; } function setPos(n,value){ layerArr[n][0] = value; } function setMoving(n,value){ layerArr[n][1] = value; } function setDir(n,value){ layerArr[n][2] = value; } function getPos(n){ return layerArr[n][0]; } function getMoving(n){ return layerArr[n][1]; } function getDir(n){ return layerArr[n][2]; } function getLayer(n){ return layerArr[n][3]; } // a mozgatást végző függvény function move(){ for (var j=0; j<3; j++){ if (getMoving(j)){ // mozog-e a vizsgált layer if (getDir(j)) setPos(j,getPos(j)+1); // ha igen, melyik irányba else setPos(j,getPos(j)-1); if (j==2) border=200; else border = 80; if (getPos(j) < 0 ) setDir(j,true); // az irány megváltoztatása, ha elértük a széleket if (getPos(j) > border) setDir(j,false); if (j==2) getLayer(j).left = getPos(j); else getLayer(j).top = getPos(j); } } } // --> </SCRIPT> </HEAD> <BODY onLoad="init(); setInterval('move()',20)"> <ILAYER NAME="szulo" WIDTH=300 HEIGHT=120> <LAYER NAME="gyerek1" Z-INDEX=1 LEFT=50 TOP=20> <FONT SIZE=+2 COLOR=#FF0000>1. LAYER</FONT> </LAYER> <LAYER NAME="gyerek2" Z-INDEX=2 LEFT=200 TOP=70> <FONT SIZE=+2 COLOR=#0000FF>2. LAYER</FONT> </LAYER> </ILAYER> <FORM> <INPUT TYPE="button" VALUE="1. layer ki/bekapcsolása" onClick="StartStop(1)"> <INPUT TYPE="button" VALUE="2. layer ki/bekapcsolása" onClick="StartStop(2)"> <INPUT TYPE="button" VALUE="Szülő layer ki/bekapcsolása" onClick="StartStop(3)"> </FORM> </BODY> </HTML>Már a dokumentum betöltődésekor meghívjuk az init() és a move() függvényt. Az init() létrehoz egy tömböt (layerArr), amely az egyes layerekhez kapcsolódó információkat fogja tartalmazni. Ezek a következők: a layer pozíciója, éppen mozgásban van-e, mozgásának iránya és maga a layer objektum. Ez a négy információ egy négyelemű tömbben van benne, és a layerArr nevű tömb ilyen tömbökből épül fel. Van néhány további függvény, amelyek közül a getPos(n), getMoving(n), getDir(n) az n-edik layer pozícióját, mozgási állapotát (áll vagy mozog), mozgásának irányát adja vissza. A setPos(n,value), setMoving(n,value), setDir(n,value), az n-edik layer pozícióját, mozgását, mozgási irányát állítja be a value-ban megadott érték alapján. A StartStop(n) függvény az n-edik layer mozgási állapotát (true, ha mozog és false, ha nem) állítja az ellenkezőjére. Ezt a függvényt a gombokra kattintva hívjuk meg. A move() függvény végzi el a tényleges mozgatást. A setInterval() függvény segítségével 20 ezredmásodpercenként meghívjuk. Egy for ciklus minden layerre elvégzi a következőket: megnézi, hogy mozog-e a layer, ha igen, akkor mi a mozgás iránya. Ha a getMoving() függvény igaz értéket ad vissza, akkor előre mozog a layer, így növelni kell a pozíciót (setPos(j,getPos(j)+1)), ellenkező esetben csökkenteni (setPos(j,getPos(j)-1)). Ha a j ciklusváltozó értéke 2 (azaz éppen a szülő layert vizsgáljuk), akkor a border változó 200, egyébként a 80 értéket veszi fel. Ez azért van, mert a gyerek layerek mozgási tartománya más, mint a szülőé. Ha a getPos() függvény nagyobb értéket ad vissza, mint a border, vagy kisebbet, mint 0, akkor meg kell változtatni a mozgás irányát a setDir() függvénnyel. Végül a layer pozícióját kell megváltoztatni. Ha a szülőt mozgatjuk (azaz j=2), akkor a left mezőnek adunk értéket (a vízszintes mozgás miatt), egyébként pedig a top mezőnek (a függőleges mozgás miatt).
A layerek segítségével további érdekes effektusok érhetők el. Erre láthatunk egy példát a fejezet végén. Kihasználjuk azt, hogy ha egy layerre olyan képet teszünk, amelynek vannak átlátszó részei, akkor ezeken a területeken láthatjuk az alatta lévő layerek tartalmát. A példa gif89a formátumú képeket használ.
A kód a következő:
<HTML> <HEAD> <SCRIPT LANGUAGE="JavaScript"> <!-- A kód elrejtése var pos = 750; var running = false; function start(){ if (!running){ running = true; pos = 750; move(); } } function move(){ document.layers["parent"].layers["pic1"].left = -pos; document.layers["parent"].layers["pic2"].left = pos; pos-=5; if (pos >=0) setTimeout("move()",20); else running = false; } // --> </SCRIPT> </HEAD> <BODY> <FORM> <INPUT TYPE="button" VALUE="Start" onClick="start()"> </FORM> <ILAYER NAME="parent" WIDTH=591 HEIGHT=380 LEFT=50> <LAYER NAME="pic1" LEFT=-750 TOP=0 Z-INDEX=10> <IMG SRC="pic1.gif"> </LAYER> <LAYER NAME="pic2" LEFT=750 TOP=0 Z-INDEX=20> <IMG SRC="pic2.gif"> </LAYER> </ILAYER> </BODY> </HTML>Az előző példák alapján itt már minden ismert. Két képet használtunk fel, a pic1.gif és pic2.gif nevűt. Ezeket előzőleg egy képfeldolgozó programmal átalakítottuk úgy, hogy mindkettő négyzetekből álljon, de a négyzetek ne fedjék le egymást. A két kép kicsinyített képe a következő:
![]() |
![]() |
Majd ezeket két különböző layerre téve, a layereket megfelelő helyre mozgatva kapjuk a kívánt eredményt.