动态HTML创作之一(移动对象)

通常,当为一个CSS定位元素声明新的位置时,并不会碰到什么兼容性问题。例如,要把一个名叫“myelement”的元素移动到坐标(75,50)点,只要声明新的left和top值就可以了:

myelement.left=75

myelement.top=50

但是切记 myelement 必须是一个“Pointer变量”,像这样:

function init() {
if(ns4) myelement=document.myelementDiv
if(ie4) myelement=myelementDiv.style
}

前面已经提到,声明一个新的位置并不会出现什么不兼容性的问题,但是不管怎样,在捕捉元素的当前位置时,还是会产生一个问题。这是由于IE在储存元素的位置值时,在最后加上了“px”两个字母单位。要去掉“px”可以把单位值解析为整数:parseInt(myelement.left)

确实,每一次在变量前面都写上“parseInt()”很烦人。应该考虑一个更好的方法,这里就有一个答案:往“pointer变量”或者对象中加入属性几乎没有什么限制的,那么从现在开始就要调用这些属性。

myelement.xpos=parseInt(myelement.left)

myelement.ypos=parseInt(myelement.top)

现在,一旦需要检测当前的“left”或者“top”值,只要相应检测“myelement.xpos”和“myelement.ypos”的值就可以了。

要想改变元素的位置时,首先需要改变“xpos”和“ypos”的值,然后需要分别设置相对于“xpos”和“ypos”的值。这里有一个这样的例子:
*************************************************************
<HTML>

<HEAD>
<TITLE>DHTML Demo</TITLE>
<script language="javascript">
<!--

ns4=(document.layers)?true:false
ie4=(document.all)?true:false

function init() {
if(ns4) block=document.blockDiv
if(ie4) block=blockDiv.style
block.xpos=parseInt(block.left)
block.ypos=parseInt(block.top)
}

function move1() {
block.xpos=50
block.ypos=75
block.left=block.xpos
block.top=block.ypos
}

function move2() {
block.xpos=115
block.ypos=120
block.left=block.xpos
block.top=block.ypos
}

function move3() {
block.xpos=200
block.ypos=185
block.left=block.xpos
block.top=block.ypos
}
//-->
</script>
</HEAD>

<BODY onLoad="init()">
<p>Move the block to:
<a href="javascript:move1()">(50,75)</a>-
<a href="javascript:move2()">(115,120)</a>-
<a href="javascript:move3()">(200,185)</a>
<br><a href="javascript:alert(block.xpos+','+block.ypos)">check location</a>
</p>
<div id="blockDiv" style="position:absolute;left:90;top:100;width:30;visibility:visible">
<img src="../image/block.gif">
</div>
</BODY>
</HTML>
****************************************************
当浏览器初始化时,这个图片被定位于“left:90”和“top:100”的地方,当单击几个坐标时,图片会移动到相应的坐标位置,当单击“check location”时,浏览器会弹出一个对话框,告之当前位置。
通用移动函数

在上一个例子中,每一次移动都分别编写了代码。现在如果想要把许多不同的层移动到不同的位置,我们可以建立一些通用的移动函数。

moveTo()函数

moveTo()函数先获取一个层或者对象,然后把它们直接移动到一个新的位置。

function moveTo(obj,x,y) {
obj.xpos=x
obj.left=obj.xpos
obj.ypos=y
obj.top=obj.ypos
}

要把图像移动到一个新的位置,可以写上:moveTo(mysquare,50,100)
moveBy()函数

moveBy函数的工作原理有些不同,但是效果和moveTo()是一致的,它是在当前的位置加上一个值,得到最终的位置,而不是把层或对象直接移动到新的位置。

function moveBy(obj,x,y) {
obj.xpos+=x
obj.left=obj.xpos
obj.ypos+=y
obj.top=obj.ypos
}

要把图像向右移动5个像素,并且向上移动10个像素,只需要写上:moveBy(mysquare,5,-10)

这里有一个移动对象完整的例子:
*************************************************
<HTML>

<HEAD>
<TITLE>DHTML Demo</TITLE>
<script language="javascript">
<!--

ns4=(document.layers)?true:false
ie4=(document.all)?true:false

function init() {
if(ns4) block=document.blockDiv
if(ie4) block=blockDiv.style
block.xpos=parseInt(block.left)
block.ypos=parseInt(block.top)
}

function moveTo(obj,x,y) {
obj.xpos=x
obj.left=obj.xpos
obj.ypos=y
obj.top=obj.ypos
}

function moveBy(obj,x,y) {
obj.xpos+=x
obj.left=obj.xpos
obj.ypos+=y
obj.top=obj.ypos
}

function showObject(obj) {
if(ns4) obj.visibility="show"
else if(ie4) obj.visibility="visible"
}

function hideObject(obj) {
if(ns4) obj.visibility="hide"
else if(ie4) obj.visibility="hidden"
}
//-->
</script>
</HEAD>

<BODY onLoad="init()">
<p>
Check Values:
<a href="javascript:alert('X:'+block.xpos)">xpos</a>,
<a href="javascript:alert('Y:'+block.ypos)">ypos</a>
<br>Visibility:
<a href="javascript:showObject(block)">show</a>,
<a href="javascript:hideObject(block)">hide</a>
<br>MoveTO:
<a href="javascript:moveTo(block,100,100)">(100,100)</a>,
<a href="javascript:moveTo(block,200,160)">(200,160)</a>,
<a href="javascript:moveTo(block,300,240)">(300,240)</a>
<br>MoveBy:
<a href="javascript:moveBy(block,10,0)">(10,0)</a>,
<a href="javascript:moveBy(block,-15,0)">(-15,0)</a>,
<a href="javascript:moveBy(block,0,15)">(0,15)</a>,
<a href="javascript:moveBy(block,0,-15)"><0,-15)</a>
</p>
<div id="blockDiv" style="position:absolute;left:100;top:100;width:30;visibility:visible">
<img src="../image/block.gif">
</div>
</BODY>
</HTML>
************************************************
上面的例子实际上总结了前面所讲的所有内容,是一个非常典型的例子。