简单运动的封装

先从最简单的封装开始,慢慢的使其更丰富,更实用。

还是上一篇博文的代码,在此不作细说。

需求:点击按钮,让元素匀速运动。

<!DOCTYPE html>
<html lang="zh">
<head>
<title></title>
<style>
#d1 {
width: 100px;
height: 100px;
background-color: red;
position: absolute;
top:100px;
left:200px;
}
</style>
</head>
<body>
<button id="btn">点击移动</button>
<div id="d1"></div>
</body>
</html>

对js中的运动函数进行简单的封装

<script>
//获取标签
let oBtn = document.getElementById("btn");
let oDiv = document.getElementById("d1");
// 声明一个变量用来储存计时器
let iTimer = null; oBtn.onclick = function(){
// 调用函数
startMove();
};
// 封装函数
function startMove(){
clearInterval(iTimer);
iTimer = setInterval(function(){
if(oDiv.offsetLeft ===500){
clearInterval(iTimer);
}else{
oDiv.style.left = oDiv.offsetLeft + 10 + "px";
}
},30);
}

封装函数其实就是讲多个函数中相同的部分提前出来,将其放在一个函数中,使用的时候可以之间调用。作用是增加代码的利用率,提高开发效率。

为了使封装的函数可以得到更广泛的使用,我们需要把一些运动过程中需要发生变化的部分通过传参的方式进行更改。

下面以网页中常见的 分享到 为例进行详细说明

默认状态:

鼠标悬浮在元素上:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style>
#div1 {
width: 100px;
height: 200px;
background:red;
position: absolute;
left: -100px;
top: 200px;
}
#div2 {
width: 30px;
height: 70px;
background: black;
position:absolute;
right:-30px;
top: 70px;;
color:#fff;
text-align: center;
}
</style>
</head>
<body>
<div id="div1">
<div id="div2">分享到</div>
</div>
</body>
</html>

利用上面封装的函数,加以修改之后直接在本案例中使用

<script>
// 将其复制成两个,分别用于鼠标悬浮时和鼠标移除时
//悬浮时向右移动
function startMove1(){
clearInterval(iTimer);
iTimer = setInterval(function(){
if(oDiv1.offsetLeft ===0){
clearInterval(iTimer);
}else{
oDiv1.style.left = oDiv1.offsetLeft + 10 + "px";
}
},30);
}
// 移除元素时恢复默认状态
function startMove2(){
clearInterval(iTimer);
iTimer = setInterval(function(){
if(oDiv1.offsetLeft ===-100){
clearInterval(iTimer);
}else{
oDiv1.style.left = oDiv1.offsetLeft - 10 + "px";
}
},30);
} // 首先获取两个元素
let oDiv1 = document.getElementById('div1');
let oDiv2 = document.getElementById('div2');
let iTimer = null;
// 给为父级的div绑定mouseover 和 mouseout事件
oDiv1.onmouseover = function() {
// 调用
startMove1();
};
oDiv1.onmouseout = function() {
// 调用
startMove2() // 鼠标移出,让div隐藏
};
</script>

但是,上述案例中封装的函数使用起来并不方便,下面将其优化一下。

将共同点保留,不同点用形参代替,在调用时根据需求传入不同的值。整理后js代码如下:

/**参数的含义:
* oDom:作用点(发生运动的元素)
* iTarget:目标值(需要移动到达的位置)
* iSpead:移动的速度(每一次移动量)
*/
function startMove(oDom,iTarget,iSpead){
clearInterval(iTimer);
iTimer = setInterval(function(){
if(oDom.offsetLeft ===iTarget){
clearInterval(iTimer);
}else{
oDom.style.left = oDom.offsetLeft + iSpead + "px";
}
},30);
} let oDiv1 = document.getElementById('div1');
let oDiv2 = document.getElementById('div2');
let iTimer = null;
oDiv1.onmouseover = function() {
startMove(oDiv1,0,10);
};
oDiv1.onmouseout = function() {
startMove(oDiv1,-100,-10) // 鼠标移出,让div隐藏
};

上述代码中,将函数操作的元素提前出来,变成了函数的形参,这样就可以让此函数针对任意的元素。

但是注意,目标值iTarget必须为速度iSpead的整数倍。否则停止条件无法满足,运动就会一直进行。

最新文章

  1. ASP.NET MVC搭建项目后台UI框架—8、将View中选择的数据行中的部分数据传入到Controller中
  2. Node+Express+node-mysql 实战于演习 全套mysql(增删改查)
  3. 对偶理论、拉格朗日对偶问题、LP线性规划对偶性质
  4. mui记录
  5. git 删除错误提交的commit
  6. iOS - UITouch
  7. swat主流域文件(file.cio)参数详解——引自http://blog.sciencenet.cn/blog-922140-710636.html
  8. Netsharp快速入门(之5) 基础档案(之D 实体建模 生成实体代码、同步数据库、配置插件运行时)
  9. cf590B Chip &#39;n Dale Rescue Rangers
  10. RobotFramwork安装报错name &#39;execfile&#39; is not defined
  11. qnx spi 学习笔记
  12. 让Mac 可以使用mysql -u用户直接连接数据库
  13. AWS EC2 使用root账户密码登陆
  14. POJ 3415 Common Substrings 【长度不小于 K 的公共子串的个数】
  15. 【TP3.2】TP3.2下实现ajax分页(原创+亲测可用)
  16. AndroidUI设计 之 图片浏览器
  17. 最新Windows下c++读写锁SRWLock介绍
  18. Django 综合篇
  19. 玩转Git之初识Git
  20. shell基础--字符串和变量的操作

热门文章

  1. time_wait状态如何处理和建议
  2. PHPstorm 运行时出现 Not Fount 解决办法
  3. 关于简单递归在python3中的实现
  4. angular8 + redux 管理状态
  5. Chrome 开发工具之 Application
  6. gin-jwt对API进行权限控制
  7. CodeForces 311 B Cats Transport 斜率优化DP
  8. hdu 1078 FatMouse and Cheese(简单记忆化搜索)
  9. hadoop之数据倾斜
  10. 为什么spark中只有ALS