《JavaScript DOM编程艺术》第十章 用javascript实现动画效果

实现移动图片效果,当鼠标指针悬停在哪个链接上,我们将这个图片向左或者右移动

在这里插入图片描述

HTML 代码块

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>预览图片</title>
	<style type="text/css">
	#slideshow{
        width: 120px;
	 	height: 150px;
	 	overflow: hidden;
	 	position: relative;
	  }
	</style>
</head>
<body>
	<h1>Web Design</h1>
	<p>these things you should know!</p>
	<ol id="linklist">
		<li><a href="structure.html">Structure</a></li>
		<li><a href="presentation.html">Presentation</a></li>
		<li><a href="behaior.html">Behaior</a></li>
	</ol>
	<div id="slideshow">
		<img src="images/1.png" alt="builting blocks of web desight"  id="preview" />
	</div>

	 <script type="text/javascript" src="js/addLoadEvent.js"></script>
     <script type="text/javascript" src="js/moveElement.js"></script>
     <script type="text/javascript" src="js/previewSlideshow.js"></script>
</body>
</html>

JS

1、addLoadEvent.js

function addLoadEvent(func){
	var oldonload = window.onload;
	if(typeof window.oldonload != 'function'){
		window.onload = func;
	}else {
		window.onload = function(){
			oldonload();
			func();
		}
	}
}

2、moveElement.js

function moveElement(elementID,final_x,final_y,interval) {
	if (!document.getElementById) return false;
	if (!document.getElementById(elementID)) return false;
    var elem = document.getElementById(elementID);
    if (elem.movement) {
    	clearTimeout(elem.movement);
    }
    var xpos = parseInt(elem.style.left);
    var ypos = parseInt(elem.style.top);
    
    if (xpos == final_x && ypos == final_y) {
    	return true;
    }

    if (xpos < final_x) {
    	xpos++;
    }
    if (xpos > final_x) {
    	xpos--;
    }
     if (ypos < final_y) {
    	ypos++;
    }
    if (ypos > final_y) {
    	ypos--;
    }
    elem.style.left = xpos + "px";
    elem.style.top = ypos + "px";
    //重新调用本函数,Javascript用引号表示字符串,用 “+”号连接字符串
    //moveElement(' 和 elementID 和 ', 和 final_x 和 ,和 final_y 和 , 和 interval 和 ) 
    //拼接以后如下:moveElement('elementID',final_x,final_y,interval); 
    var repeat = "moveElement('"+elementID+"',"+final_x+","+final_y+","+interval+")";
    elem.movement = setTimeout(repeat,interval);
}

3、previewSlideshow.js

function previewSlideshow() {
    if (!document.getElementById)  return false;
    if(!document.getElementById("preview")) return false;
    if (!document.getElementById("linklist"))  return false;
    if (!document.getElementsByTagName) {return false;}
 
	//为图片应用样式
	var preview = document.getElementById("preview");
	preview.style.position = "absolute";
	preview.style.left = "0px";
	preview.style.top = "0px";
	var linklist = document.getElementById("linklist");
	var links = linklist.getElementsByTagName("a");

    //为mouseover事件添加动画
    links[0].onmouseover = function(){
        moveElement("preview",-193,0,10);
    }
    links[1].onmouseover = function(){
        moveElement("preview",-371,0,10);
    }
    links[2].onmouseover = function(){
        moveElement("preview",-548,0,10);
    }
}
addLoadEvent(previewSlideshow);

改进 moveElement.js 实现如果那个元素离目标地较远,就每次进行一大步,较近就进行一小步

function moveElement(elementID,final_x,final_y,interval){
	if (!document.getElementById) return false;
	if (!document.getElementById(elementID)) return false;
    var elem = document.getElementById(elementID);
    if (elem.movement) {
    	clearTimeout(elem.movement);
    }
   if (!elem.style.left) {
	  elem.style.left = "0px";
   }
   if (!elem.style.top) {
     elem.style.top = "0px";
   }
    var xpos = parseInt(elem.style.left);
    var ypos = parseInt(elem.style.top);
    var dist = 0;
    if (xpos == final_x && ypos == final_y) {
    	return true;
    }
    if (xpos < final_x) {
    	var dist = Math.ceil((final_x - xpos)/10); 
    	//每次进行这个距离的十分之一 Math.ceil(number)是返回向"大于"方向舍入为之最接近的整数,
    	//Math.floor(number) 返回向“小于”方向舍入为与之最接近的整数,
    	//Math.round(number) 返回任意舍入为与之最接近的整数
        xpos = xpos + dist;
    }
    if (final_x < xpos) {
    	var dist = Math.ceil((xpos - final_x)/10); 
        xpos = xpos - dist;
    }
    if (ypos < final_y) {
    	var dist = Math.ceil((final_y - ypos)/10); 
        ypos = ypos + dist;
    }
    if (final_y < ypos) {
    	var dist = Math.ceil((ypos - final_y)/10); 
        ypos = ypos - dist;
    }

    elem.style.left = xpos + "px";
    elem.style.top = ypos + "px";

    var repeat = "moveElement('"+elementID+"',"+final_x+","+final_y+","+interval+")";
    elem.movement = setTimeout(repeat,interval);
/*
    var repeat = "moveElement('"+elementID+"',"+final_x+","+final_y+","+interval+")";
    elem.movement = setTimeout(repeat,interval);*/
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值