1、运动中的边界处理(让其在一个指定区域内运动)

当元素的offsetLeft值超出一定距离或达到一个我们想要设置的边界值时,停止计时器。

 var timer;
timer = setInterval(function(){//计时器
if(obox.offsetLeft>=200){//判断的条件
clearInterval(timer);
}else{[
obox.style.left = obox.offsetLeft+10+"px";//每30毫秒我们走的步长
}
},30)//以毫秒为单位,设置多少毫秒计时器走一次。

 tip:为什么是30毫秒呢?

    因为电影播放每秒24帧,人眼就识别不出卡顿了,但是对于电脑来说,处理速度相对较快,需要每秒30帧以上才会显得流畅,如果计算机的性能不是很好,你写了30毫秒,DOM也不定能真的30毫秒执行一次。
2、重力回弹运动
加速效果:增加重力值,随着定时器的执行,重力增大
 
回弹效果:当抵达目标位置时,将速度改为负值
 
回弹减速:将速度改变为负值的同时,除以2减半

		var oball = document.getElementById("ball");
var speed = 5; //步长
var g = 1; //重力
var index = 0; //计时器的计数器
var timer = null; //计时器
var maxTop = 300 - oball.offsetHeight; timer = setInterval(function(){
index++;
if(index%5 == 0){
speed += g;
}
if(maxTop-oball.offsetTop<speed){
// clearInterval(timer);
speed = -Math.round(speed*0.7);
oball.style.top = maxTop + "px";
if(Math.abs(speed) <= 1){
clearInterval(timer);
}
console.log(speed);
}else{
oball.style.top = oball.offsetTop + speed + "px"
}
},30) // 判断最后剩下的距离<步长的时候
// 停!
// 手动到终点
//打车

 3、抛物线运动

                var oball = document.getElementById("ball");
var speed = 5; //Y轴步长
var g = 1; //Y轴的重力
var index = 0; //计时器的计数器
var timer = null; //计时器
var maxTop = 300 - oball.offsetHeight; //Y轴的最大值
var left = 20; //x轴的步长
var maxLeft = 1000 - oball.offsetWidth; //X轴的最大值 timer = setInterval(function(){
//计时器的计数器
index++;
//每五次增加重力
if(index%5 == 0){
speed += g;
}
//判断最后一步的距离,不足一步了,打车差点到终点的时候,下车结束行程
if(maxTop-oball.offsetTop < speed){
//让小球在Y轴回弹,同时每次回弹损耗0.3
speed = -Math.round(speed*0.7);
//强制到终点
oball.style.top = maxTop + "px";
//当速度不足1,清除没用的计时器
if(Math.abs(speed) <= 1){
clearInterval(timer);
}
}else{
//正常设置运动元素的位置
oball.style.left = oball.offsetLeft + left + "px";
oball.style.top = oball.offsetTop + speed + "px";
}
//让小球在X轴的右边回弹
if(maxLeft - oball.offsetLeft < left){
left = -left;
}
//让小球在X轴的左边回弹
if(oball.offsetLeft < 0){
left = -left;
}
},30) // 判断最后剩下的距离<步长的时候
// 停!
// 手动到终点
//打车
4.透明度的变换
          其实就是获取样式的透明度,然后改变数值
		var obox = document.getElementById("box")
var speed = 10;
var iNow = 20;
var timer = null; obox.onmouseover = function(){
clearInterval(timer);
timer = setInterval(function(){
if(iNow == 100){
clearInterval(timer)
}else{
iNow += speed
obox.style.opacity = iNow /100;
}
},30)
}
obox.onmouseout = function(){
clearInterval(timer);
timer = setInterval(function(){
if(iNow == 20){
clearInterval(timer);
}else{
iNow -= speed
obox.style.opacity = iNow /100;
}
},30)
}

5、缓冲运动

		var oBtn = document.getElementById("btn");
var oBox = document.getElementById("box");
oBtn.onclick = function(){
move(500);
}
var timer = null;
function move(target){
// 1. 关闭开启定时器;
clearInterval(timer);
timer = setInterval(function(){
//2.计算速度;
var speed = (target - oBox.offsetLeft) / 10;
// if(speed > 0){
// speed = Math.ceil(speed);
// }else{
// speed = Math.floor(speed);
// }
// 速度取整判断;
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);//三目运算,代码更简介、明朗。
//console.log(speed,oBox.offsetLeft);
// 3. 终止运动;
if(target == oBox.offsetLeft){
clearInterval(timer);
}else{
oBox.style.left = oBox.offsetLeft + speed + "px";
}
}, 30);
}

6、平时我们在页面上所看到的鼠标滑动实现悬浮的一个效果

css和html解构:
<style>
#div1{
width: 60px;
height: 100px;
position: absolute;
right: 0;
bottom: 0;
background: #b7b7b7;
}
body{
height: 3000px;
}
input{
position: fixed;
right: 0;
top: 0;
}
</style>
<body>
<div id='div1'></div>
<input type="text" id='txt1'>
</body>
js解构:
<script>
window.onscroll=function(){
var oDiv=document.getElementById('div1');
var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
move(Math.round((document.documentElement.clientHeight-oDiv.offsetHeight)/2+scrollTop))
}
var timer=null;
function move(target){
var oDiv=document.getElementById('div1');
clearInterval(timer);
timer=setInterval(function(){
var speed=(target-oDiv.offsetTop)/10;
speed=speed>0?Math.ceil(speed):Math.floor(speed);
if(oDiv.offsetTop==target){
clearInterval(timer)
}else{
document.title=target;
document.getElementById('txt1').value=oDiv.offsetTop
oDiv.style.top=oDiv.offsetTop+speed+'px';
}
},30)
}

7.多元素缓冲运动函数封装(写的一个运动函数的封装)

function move(ele,json,callback){
clearInterval(ele.t);
ele.t = setInterval(() => {
var onoff = true;
for(var i in json){
var iNow = parseInt(getStyle(ele,i));
var speed = (json[i] - iNow)/6;
speed = speed<0 ? Math.floor(speed) : Math.ceil(speed);
if(iNow != json[i]){
onoff = false;
}
ele.style[i] = iNow + speed + "px";
}
if(onoff){
clearInterval(ele.t);
callback && callback();
}
}, 30);
}

8、圆周运动

		var center = 200;
var speed = 10;
var target = 360;
var r = 200;
var iNow = 0;
var t;
document.onclick = function (){
clearInterval(t);
setInterval(function(){
if(iNow == target){
clearInterval(t);
}else {
iNow += speed;
var div = document.createElement("div");
div.className = "box";
document.body.appendChild(div);
div.style.left = Math.cos( Math.PI/180*iNow ) * r + center + "px";
div.style.top = Math.sin( Math.PI/180*iNow ) * r + center + "px";
}
},30)
}

8-1案例(利用上面7的封装函数和圆周运动,实现一个烟花的效果,会用到另外一个获取随机数和随机颜色的封装代码一起放在连同css、html、js和整个html都放在下面,供大家到自己编辑器上查看效果)

tip:因为DOM运动,多为视觉上的效果,因为我刚接触博客园,视频改成的gif图也不懂怎么放上去,希望多谅解,下面烟花的效果html:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
.box{width: 80%;height: 600px;background-color: #000000;border: 5px solid red;position: relative;margin: 30px auto;overflow: hidden;}
.fire{width: 10px;height: 10px;position: absolute;bottom:0;}
.small-fire{width: 10px;height: 10px;border-radius: 50%;position: absolute;}
</style>
</head>
<body>
<div class="box"></div>
</body>
<!-- <script src="../move.js"></script> -->
<script type="text/javascript">
// ooa:
// 1创建主题烟花,设置样式
// 2开始运动,结束运动
// 3结束运动的时候创建小烟花,立即运动,结束运动
var obox = document.querySelector(".box");
obox.onclick = function (eve){
var e = eve || window.event;
new Fire({x:e.offsetX,y:e.offsetY,parent:this})
}
function Fire(op){
// 获取元素
this.x = op.x;
this.y = op.y;
this.div = op.parent;
// 创建主题烟花,设置样式
this.init();
}
Fire.prototype.init = function(){
// 创建烟花,设置样式
this.ele = document.createElement("div");
this.ele.className = "fire";
this.ele.style.left = this.x+"px";
this.ele.style.background = randomColor();
this.div.appendChild(this.ele);
// 开始运动,结束运动
this.animate();
}
Fire.prototype.animate = function(){
// 开始运动,结束运动
move(this.ele,{top:this.y},function(){
this.ele.remove()
this.createSmallFire();
}.bind(this))
// 运动结束的时候矿建小烟花,立即运动,结束运动
}
Fire.prototype.createSmallFire = function(){
// 运动结束的时候矿建小烟花,立即运动,结束运动
var num = random(10,20);
var r = random(100,200);
for(var i=0;i<num;i++){
let odiv = document.createElement("div");
odiv.className = "small-fire";
odiv.style.background = randomColor();
odiv.style.left = this.x+"px";
odiv.style.top = this.y+"px";
this.div.appendChild(odiv);
var l = parseInt(Math.cos( Math.PI/180 * (360/num * i)) * r) + this.x;
var t = parseInt(Math.sin( Math.PI/180 * (360/num * i)) * r) + this.y;
move(odiv,{
left:l,
top:t
},function(){
odiv.remove()
})
}
// 2.利用三角函数,计算出一个圆上面平均分布的点的坐标
// 注意三角函数的方法接收的是弧度:别忘记角度转弧度
} // 范围随机数
function random(max,min){
return Math.round(Math.random()*(max-min)+min);
} // 随机颜色
function randomColor(){
return "rgb("+random(0,255)+","+random(0,255)+","+random(0,255)+")";
} //多属性、多元素、回调函数运动的封装
function move(ele,json,callback){
clearInterval(ele.t);
ele.t = setInterval(() => {
var onoff = true;
for(var i in json){
var iNow = parseInt(getStyle(ele,i));
var speed = (json[i] - iNow)/6;
speed = speed<0 ? Math.floor(speed) : Math.ceil(speed);
if(iNow != json[i]){
onoff = false;
}
ele.style[i] = iNow + speed + "px";
}
if(onoff){
clearInterval(ele.t);
callback && callback();
}
}, 30);
} // 获取样式操作非行内的兼容
function getStyle(ele,attr){ //获取样式的操作非行内
var a = "";
if(ele.currentStyle){ //兼容ie
a = ele.currentStyle[attr];
}else{
a = getComputedStyle(ele,false)[attr]; //不兼容ie;但兼容正常浏览器;
}
return a;
}
</script>
</html>

  

DOM的高级操作-一种JS控制元素的视觉假象的更多相关文章

  1. JS控制元素的显示和隐藏

    利用来JS控制页面控件显示和隐藏有两种方法,两种方法分别利用HTML的style中的两个属性,两种方法的不同之处在于控件隐藏后是否还在页面上占空位. 方法一: document.getElementB ...

  2. js控制元素的显示与隐藏

    <body class="easyui-layout"> <div id = "centerId" data-options="re ...

  3. js控制元素隐藏和显示

    原生: 方法一: document.getElementById("idname").style.visibility="hidden"; document.g ...

  4. JS控制元素可见(显示)与不可见(隐藏)

    方法一: document.getElementById("id").style.visibility="hidden"; document.getElemen ...

  5. js控制日期选择框datetime-local和select的展开

    注: js控制元素展开不受元素css属性的限制,例如opacity,z-index等 1. 使用js控制日期选择框的展开 ios: document.querySelector(".targ ...

  6. 使用JS控制伪元素的几种方法

    一. 缘由: 本文源于在OSC社区中,有人提问如何用jq获取伪元素.我第一想法是强大的CSS Query应该可以获取伪元素吧. 然而事实上,CSS Query并不能.即我们不能通过$(":b ...

  7. 如何使用T-SQL备份还原数据库及c#如何调用执行? C#中索引器的作用和实现。 jquery控制元素的隐藏和显示的几种方法。 localStorage、sessionStorage用法总结 在AspNetCore中扩展Log系列 - 介绍开源类库的使用(一) span<T>之高性能字符串操作实测

    如何使用T-SQL备份还原数据库及c#如何调用执行? 准备材料:Microsoft SQL Server一部.需要还原的bak文件一只 一.备份 数据库备份语句:user master backup ...

  8. js 控制展开折叠 div html dom

    js 控制展开折叠 div    html dom <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ...

  9. DOM对象本身也是一个js对象,所以严格来说,并不是操作这个对象慢,而是说操作了这个对象后,会触发一些浏览器行为(转)

    一直都听说DOM很慢,要尽量少的去操作DOM,于是就想进一步去探究下为什么大家都会这样说,在网上学习了一些资料,这边整理出来. 首先,DOM对象本身也是一个js对象,所以严格来说,并不是操作这个对象慢 ...

随机推荐

  1. HTTP_5_通信数据转发程序:代理、网关、隧道

    HTTP通信时,除客户端和服务器之外,还有一些用于通信数据转发的应用程序,例如代理,网关,隧道.配合服务器工作. 代理 转发功能,客户端与服务器之间可有多个代理, 缓存代理:减少服务器压力,透明代理: ...

  2. Vue事件修饰符详解

    整体学习Vue时看到Vue文档中有事件修饰符的描述,但是看了之后并没有理解是什么意思,于是查阅了资料,现在记录下来与大家分享 先给大家画一个示意图理解一下冒泡和捕获 (1) .stop修饰符 请看如下 ...

  3. (读论文)推荐系统之ctr预估-NFM模型解析

    本系列的第六篇,一起读论文~ 本人才疏学浅,不足之处欢迎大家指出和交流. 今天要分享的是另一个Deep模型NFM(串行结构).NFM也是用FM+DNN来对问题建模的,相比于之前提到的Wide& ...

  4. 【iOS】Signing for "project_name" requires a development team. Select a development team in the project editor

    Xcode 8.3.2 运行 GitHub 上下载的代码时报了这个错. 解决方法: 单击工程名 --> Signing --> Team --> 选择对应的Account(如果没有A ...

  5. Nginx安装(详细版本)

    Nginx安装文档 前言: 最近,系统部署人员那边,让我们给写一个傻瓜式的Nginx安装过程.所以就有了这个文档,本着独乐乐不如众乐乐,就分享一下.我觉得对入门小白来说,有图,乃至运行过程图,是很重要 ...

  6. Asp.Net MVC SingleServiceResolver类剖析

    SingleServiceResolver一般用于类工厂创建和注入点接口留白.类工厂创建比如Controller控制依赖于此类的创建,注入点留白实质上是依赖注入所对外预留的接口. 以第二个特性为例. ...

  7. AUTOSAR学习之RTE - 基本概念

    1.什么是RTE? The Run-Time Environment (RTE) is at the heart of the AUTOSAR ECU architecture. The RTE is ...

  8. npm 一些有用的提示和技巧

    生成 package.json 我们通常执行 npm init,然后开始添加 npm 请求的信息. 但是,如果我们不关心所有这些信息,并且希望保留默认值,那么对于 npm 请求的每一条数据,我们都按 ...

  9. 【Java例题】5.3 线性表的使用

    3.线性表的使用.使用ArrayList模拟一个一维整数数组.数据由Random类随机产生.进行对输入的一个整数进行顺序查找.并进行冒泡排序. package chapter6; import jav ...

  10. java8(一)Lambda表达式

    其实很久前已经学习过了Lambda表达式,但是学习后没有多少使用的机会,久而久之也就忘记(惭愧).最近新的项目用的jdk8所以准备再学习一次,写下文章也是为了记录,方便以后再忘的时候,不用到处找资料( ...