Leírások+Referenciák / JavaScript / X. Layerek használata 2.

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="pld101.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="pld101.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!

<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_elem(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; // mozog-e (true=igen,false=nem)
  layerArr[index][2] = dir;    // mozgás 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_elem( 50,true, true,document.layers['szulo'].layers['gyerek1']);
  new_elem(100,true,false,document.layers['szulo'].layers['gyerek2']);
  new_elem(  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="pld102.gif">
  </LAYER>
  <LAYER NAME="pic2" LEFT=750 TOP=0 Z-INDEX=20>
    <IMG SRC="pld103.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 pld102.gif és pld103.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.

<< Vissza a tartalomhoz

Tovább a tizenegyedik fejezethez >>