闲来无事,用javascript写了一个简单的轨迹动画

简介: DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>轨迹</title>

<script>
var speed = [1, 1]; //初始位移值:[水平,垂直]
var speedMax = 5; //最大位移值
var length = 1; //位移系数
var boxSpace = [50, 50, 500, 300]; //画布参数:[起始点水平位置,起始点垂直位置,宽度,高度]
var item = [200, 150, 50, 50]; //控件参数:[起始点水平位置,起始点垂直位置,宽度,高度]
var millisec = 5; //执行周期间隔,单位:毫秒
var playFlag = true; //初始状态:播放/停止

//初始化
function init(){
    //初始化控制栏
    var styleBar = $("bar").style;
    styleBar.left = boxSpace[0] + "px";
    styleBar.width = boxSpace[2] + "px";
    //初始化画布
    var styleBox = $("box").style;
    styleBox.left = boxSpace[0] + "px";
    styleBox.top = boxSpace[1] + "px";
    styleBox.width = boxSpace[2] + "px";
    styleBox.height = boxSpace[3] + "px";
    //初始化控件
    var styleClk = $("clk").style;
    styleClk.left = item[0] + "px";
    styleClk.top = item[1] + "px";
    styleClk.width = item[2] + "px";
    styleClk.height = item[3] + "px";
    //注册控件鼠标事件
    $("clk").onmouseover = stop;
    $("clk").onmouseout = play;
    //注册控制栏事件
    $("btnPlay").onclick = play;
    $("btnStop").onclick = stop;
    //默认播放或停止
    if(playFlag) play();
}
//播放
function play(){
    playFlag = true;
    autoMove();
}
//停止
function stop(){
    playFlag = false;
}
//返回Dom对象
function $(elmId){
    return document.getElementById(elmId);
}
//生成随机数
function randomNum(min, max){  
    var Range = max - min;  
    var Rand = Math.random();  
    return(min + Math.round(Rand * Range));
}
//动画逻辑
function autoMove(){
    //生成本次位移量
    var xBool = randomNum(0, 100) > 50 ? 1 : -1; //水平位移趋势,1:向右,-1:向左
    var yBool = randomNum(0, 100) > 50 ? 1 : -1; //垂直位移趋势,1:向下,-1:向上
    speed[0] += xBool * length; //在原来水平位移量的基础上,加入趋势影响
    speed[1] += yBool * length; //在原来垂直位移量的基础上,加入趋势影响

    //处理本次位移量是否已经超过最大值
    if(speed[0] < -1 * speedMax) speed[0] = -1 * speedMax; //水平位移量不允许超过最大值
    if(speed[0] > speedMax) speed[0] = speedMax; //水平位移量不允许超过最大值
    if(speed[1] < -1 * speedMax) speed[1] = -1 * speedMax; //垂直位移量不允许超过最大值
    if(speed[1] > speedMax) speed[1] = speedMax; //垂直位移量不允许超过最大值

    //允许控件活动的画布坐标范围
    var leftLimit = boxSpace[0];
    var topLimit = boxSpace[1];
    var rightLimit = boxSpace[0] + boxSpace[2] - item[2];
    var bottomLimit = boxSpace[1] + boxSpace[3] - item[3];

    //当前控件坐标位置
    var xNow = parseInt($("clk").style.left);
    var yNow = parseInt($("clk").style.top);

    //对控件活动超出范围时进行反弹处理
    if((xNow + speed[0]) < leftLimit || (xNow + speed[0]) > rightLimit) speed[0] *= -1;
    if((yNow + speed[1]) < topLimit || (yNow + speed[1]) > bottomLimit) speed[1] *= -1;
    
    //重新设定控件坐标,形成动画
    $("clk").style.left = xNow + speed[0] + "px";
    $("clk").style.top = yNow + speed[1] + "px";

    //调用下一次动画逻辑
    if(playFlag) setTimeout(autoMove, millisec);
}
window.onload = init;
</script>
<style>
#bar { position: absolute; background: #F5F1C2; border: 1px solid #996600; z-index: 30; text-align: center; line-height:26px; height:30px; top: 20px }
#bar a { color: #FFF; font-size: 10pt; margin: 2px 2px; display: block; width: 80px; height: 26px; background: #7C7514; float: left; text-decoration:none}
#bar a:hover { background:#C00; }
#box { position: absolute; background: #FFFFCC; border: 1px solid #996600; z-index: 10 }
#clk { position: absolute; cursor:pointer; background: #000000; color: #FFF; text-align: center; line-height:50px; z-index: 20 }
</style>
</head>
<body>
<div id="bar"><a href="#" id="btnPlay">播放</a><a href="#" id="btnStop">停止</a></div>
<div id="box"></div>
<div id="clk">点这</div>
</body>
</html>

 

没有任何美感的运行效果:


宠辱不惊,看庭前花开花落;去留无意,望天上云卷云舒
目录
相关文章
|
6月前
|
前端开发 JavaScript UED
使用JavaScript实现动画效果
【4月更文挑战第21天】使用JavaScript实现动画效果
64 10
|
5天前
|
JavaScript
js动画循环播放特效源码(上班族的一天)
js动画循环播放特效是一段实现了包含形象的卡通小人吃、睡、电脑工作的网页动画,js循环动画,简单的画面设计。非常丝滑有意思,欢迎对此代码感兴趣的朋友前来下载参考。
16 2
|
2月前
|
前端开发 数据可视化 开发者
D3.js 内置的动画函数
D3.js 内置的动画函数
|
2月前
|
JavaScript 前端开发
JS配合CSS3实现动画和拖动小星星小Demo
本文通过代码示例展示了如何使用JavaScript和CSS3实现动画效果和拖动小星星的交互效果,包括文字掉落动画和鼠标拖动产生小星星动画的实现方法。
42 0
JS配合CSS3实现动画和拖动小星星小Demo
|
1月前
|
前端开发 数据可视化 开发者
D3.js 内置的动画函数
D3.js 内置的动画函数
|
3月前
|
JavaScript 前端开发 UED
Vue.js动画魔法:解锁流畅过渡,让每一次交互都成为用户心中的小确幸!
【8月更文挑战第30天】在Vue.js中,动画与过渡效果不仅是视觉点缀,更是提升用户体验的关键。通过流畅的动态效果,应用的互动性和吸引力得以增强,从而提高用户满意度和参与度。`&lt;transition&gt;`和`&lt;transition-group&gt;`组件结合CSS过渡,可轻松实现元素的进入、离开及列表变化动画。合理的性能优化,如使用硬件加速,能避免页面卡顿,确保动画既美观又高效。下面是一个简单的淡入淡出效果示例,展示了如何利用Vue.js实现平滑的动画过渡。总之,恰当的动画设计能显著提升应用的用户体验。
53 0
Vue.js动画魔法:解锁流畅过渡,让每一次交互都成为用户心中的小确幸!
|
3月前
|
JavaScript 前端开发
动态背景,视觉盛宴:JavaScript动画让网页活起来!
动态背景,视觉盛宴:JavaScript动画让网页活起来!
|
3月前
|
移动开发 JavaScript 前端开发
基于CSS3、原生JS、Vue3.0技术各自实现序列帧动画效果
这篇文章展示了如何使用纯CSS3、原生JavaScript以及Vue 3.0技术来实现序列帧动画效果,并通过代码示例和动画效果展示了每种方法的实现过程和最终效果。
121 0
|
4月前
|
JavaScript 前端开发 数据可视化
js 实现动画的两种方案对比:setTimeout vs RAF (requestAnimationFrame)
js 实现动画的两种方案对比:setTimeout vs RAF (requestAnimationFrame)
70 2
|
4月前
|
开发框架 前端开发 JavaScript
循序渐进BootstrapVue,开发公司门户网站(2)--- 使用wow.js动画组件以及自定义的CSS样式处理动态效果
循序渐进BootstrapVue,开发公司门户网站(2)--- 使用wow.js动画组件以及自定义的CSS样式处理动态效果