js运动框架之掉落的扑克牌(重心、弹起效果)

玩过电脑自带纸牌游戏的同志们应该都知道,游戏过关后扑克牌会依次从上空掉落,落下后又弹起,直至“滚出”屏幕。

  效果如图:        

  这个案例的具体效果就是:点击开始运动,纸牌会从右上角掉落下来,之后弹起,运动的速度会逐渐减慢,直到越出屏幕后,全部纸牌消失,在右上角会重新出现一张纸牌,继续动作,一再往复。

  具体代码如下:

  1 <!DOCTYPE html>
  2 <html>
  3 <head lang="en">
  4     <meta charset="UTF-8">
  5     <title>掉落</title>
  6     <style>
  7         body{
  8             overflow: hidden;
  9             background: greenyellow;
 10         }
 11         div{
 12             width: 71px;
 13             height: 95px;
 14             position: absolute;
 15             top: 10px;
 16         }
 17     </style>
 18 </head>
 19 <body>
 20     <input id="btn" type="button" value="开始运动">
 21     <div id="box" class="box">
 22         <img src="images/A.jpg" width="71" height="95">
 23     </div>
 24 </body>
 25 </html>
 26 <script>
 27     //点击按钮,扑克片重复下落
 28     window.onload = function(){
 29         var oBtn = document.getElementById("btn");
 30         var oBox = document.getElementById("box");
 31
 32         //初始扑克牌位置,在可视区的右上角
 33         oBox.style.top = 10 + "px";
 34         oBox.style.left=document.documentElement.clientWidth - oBox.offsetWidth + "px";
 35
 36         //随机数
 37         function rnd(m,n){
 38             return parseInt(Math.random()*(m-n)+n);
 39         }
 40
 41         //下落碰撞的运动框架
 42         function addMove(){
 43             //初始扑克牌位置,仍在可视区的右上角
 44             oBox.style.left=document.documentElement.clientWidth - oBox.offsetWidth + "px";
 45             oBox.style.top = 10 + "px";
 46
 47             //初始左右移动的初始速度
 48             var iSpeedX = -rnd(6,20);
 49             var iSpeedY = rnd(6,20);
 50             var timer = null;
 51
 52             clearInterval(timer);
 53             timer = setInterval(function(){
 54                 iSpeedY += 3; //速度逐渐加快
 55                 var l = oBox.offsetLeft + iSpeedX;
 56                 var t = oBox.offsetTop + iSpeedY;
 57
 58                 //当扑克牌碰撞到可视区上部或底部时,速度要发生相应的变化
 59                 if(t>=document.documentElement.clientHeight - oBox.offsetHeight){ //当扑克牌碰撞底部一次
 60                     iSpeedY *= -0.8;  //速度降为原来的80%,并且变向
 61                     t=document.documentElement.clientHeight - oBox.offsetHeight
 62                 }else if(t<=0){ //当扑克牌碰撞顶部一次
 63                     iSpeedY *= -1; //速度变向
 64                     t=0;
 65                 }
 66
 67                 //当速度的绝对值小于1时,直接为0
 68                 if(Math.abs(iSpeedY)<1){
 69                     iSpeedY = 0;
 70                 }
 71
 72                 //赋值扑克牌的新位置
 73                 oBox.style.left = l + "px";
 74                 oBox.style.top = t + "px";
 75
 76                 //随时克隆扑克牌,在扑克牌移动的过程中留下克隆出来的信息
 77                 var oNewBox = oBox.cloneNode(true);
 78                 oNewBox.setAttribute("index","new"); //通过setAttribute区分克隆出来的元素和最初的元素,为了接下来的删除做准备
 79                 oNewBox.style.background = "green";
 80                 oNewBox.style.left = l + "px";
 81                 oNewBox.style.top = t + "px";
 82                 document.body.insertBefore(oNewBox,oBox); //新科隆的扑克牌插在之前,否则会盖住原来的移动
 83
 84                 //当扑克牌移动出可视区的时候,运动停止
 85                 if(oBox.offsetLeft < -oBox.offsetWidth){
 86                     iSpeedX = 0;
 87                     clearInterval(timer);
 88
 89                     //将克隆出来的元素全部删除,只保留最初的扑克牌
 90                     var aBox = document.getElementsByTagName("div");
 91                     for(var i=0;i<aBox.length;i++){
 92                         if(aBox[i].getAttribute("index") == "new"){  //删除index=new的元素,即克隆出来的扑克牌,保留最初的扑克牌
 93                             document.body.removeChild(aBox[i]);
 94                             i--; //元素删除后会影响i值,所以需要i--
 95                         }
 96                     }
 97                     addMove();
 98                 }
 99             },30)
100         }
101
102         oBtn.onclick = function(){
103             addMove();
104         }
105     }
106 </script>
时间: 2024-07-29 17:32:50

js运动框架之掉落的扑克牌(重心、弹起效果)的相关文章

带无缝滚动的轮播图(含JS运动框架)

今天学习了一下轮播图的写作,想到前一阵学过的无缝滚动得思想,所以就把轮播与滚动结合了一下.不过我的代码的神逻辑我自己都不敢恭维,在没网没参照的情况下,只能硬着头皮往下写,希望跟大家共勉吧. js运动框架的代码如下: 1 //获取样式 2 function getStyle(obj,attr){ 3 if(obj.currentStyle){ 4 return obj.currentStyle[attr]; 5 }else{ 6 return getComputedStyle(obj,false)

js运动框架逐渐递进版

运动,其实就是在一段时间内改变left.right.width.height.opactiy的值,到达目的地之后停止. 现在按照以下步骤来进行我们的运动框架的封装: 匀速运动. 缓冲运动. 多物体运动. 任意值变化. 链式运动. 同时运动 (第一部分):匀速运动 运动基础 思考:如何让div动起来?如下: 设置元素为绝对定位,只有绝对定位后,left,top等值才生效. 定时器的使用(动态改变值),这里使用setInterval()每隔指定的时间执行代码. 计时器setInterval(函数,交

js 运动框架及实例

<!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> <title>运动框架</title> &l

js运动框架完成块的宽高透明度及颜色的渐变

了解了运动框架完成块元素的宽高和透明度的变化的原理,我想着写一个颜色的变化来练习一下,不想写了很长时间才写出来,跟各位分享一下. 颜色的变化是通过三元素渐变的方式完成的,通过构造json,使当前的颜色与目标颜色进行对比,实现渐变的过程. 代码如下: 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title>

JS运动框架

本人也是菜鸟一枚,从网上搜索了很久,封装备注了一套运动框架,加强大家对此的理解,希望多多提议. getId:function(elemId){ return document.getElementById(elemId); }, getStyle:function(obj,attr){ return obj.currentStyle?obj.currentStyle[attr]:getComputedStyle(obj, false)[attr]; }, startMove:function(o

带无缝滚动的轮播图(含JS运动框架)-简洁版

昨天写的神逻辑,今天终于解决,经过大家的商讨,终于研究出来一套简单的代码!!! js代码如下: 1 <script> 2 window.onload = function() { 3 var oWrap = document.getElementById("wrap"); 4 var oBox = document.getElementById("box"); 5 var aBox = oBox.getElementsByTagName("li

js运动框架tween

<!DOCTYPE html> <html> <head> <title>myAnimate</title> <style> *{ margin: 0; padding: 0; list-style: none; } #abc{ position: absolute; top: 50px; left: 50px; width: 100px; height: 100px; background-color: #ff4500; } <

js 运动框架

/** * 使用offsetLeft,需注意margin的使用 * offsetLeft = margin-left + left; * offsetWidth= padding + border + width; * * @author Lonve */ function getStyle(elem,attr){ var result = null; result = elem.currentStyle?elem.currentStyle[attr]:getComputedStyle(elem

JS运动学习笔记 -- 任意值的运动框架(高/宽度,背景颜色,文本内容,透明度等)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>任意值的运动框架</title> <style> div { float: left; width: 200px; height: 200px; margin: 20px; background-color: yellow; border: 1p