A JavaScript
1998, Juray Tamás
10. fejezet: Layerek használata 2.

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.

Vágás

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>
Eredeti kép
Vágott kép

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.

Egymásba ágyazott layerek

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!

1. LAYER 2. LAYER 

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.

[ 11. fejezet ] [ Tartalomjegyzék  ] [ 9. fejezet ]