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.
|