在我们日常生活中运动就是必不可少的部分,走路、跑步、打篮球等。在网页交互设计上运动也是必不可少的部分,创建的网站交互设计运动模块有轮播图,下拉菜单,还有各种炫酷的游戏效果都跟运动密切相关。所以很重要,所以不废话了,先来分析一下运动这个功能的几个核心组成部分吧。

一、运动功能的核心组成部分:

  • 位置变化:

    1.位置从一个位置到达另一个位置;

    2.位置变化有可视的变化过程;

    3.位置变化具有可控的方向性;

  • 速度变化:

    1.运动的速度是可变的;

    2.运动的是可控的,比如暂停,减速,加速,继续运动

  • 大小透明度变化(相对位置来说处于静态的运动):

     1.宽高及阴影的变化;

    2.透明度或者背景颜色图片的变化。

  • 可移植性(即一种运动功能可以适应不同场景,在主体功能不变的情况下可以设置一些样式差异):

    1.比如运动体的大小可以实现初始化;

    2.可以设置一些视觉差异效果(比如轮播图有幻灯片模式,轮转模式,类3D效果)

    3.UI设定模式与自定义(比如轮播图的按钮形状)

上面的分析中,又以位置变化和速度变化为运动功能的主要核心功能,接下来我们就通过一系列的运动示例来理解和实现运动功能。

二、匀速运动:

匀速运动是运动功能中最基本的运动功能,只需要将要移动的元素从一个位置移动到另一个位置,速度不变,将移动距离分成若干个片段,并将每个片段移动之间设置微弱的时间间隔,以达到视觉上的移动效果。

这里有一个需要注意的点:

1.移动元素需要给元素设置绝对定位或者相对定位,不然设置left和right位置不会发生变化。以下是示例的HTML和CSS代码:

  1. //html
  2. <div></div>
  3. <span></span>
  4. <button id="bit">run</button>
  5.  
  6. //css
  7. div{
  8. position: absolute;
  9. left: 0px;/*向右移动*/
  10. /* left: 600px; *//*向左移动*/
  11. top: 0px;
  12. width: 100px;
  13. height: 100px;
  14. background: red;
  15. }
  16. span{
  17. position: absolute;
  18. left: 300px;
  19. top: 1px;
  20. width: 1px;
  21. height: 100px;
  22. background-color: #000;
  23. }
  24. button{
  25. margin-top: 150px;
  26. height: 25px;
  27. width: 35px;
  28. }

2.要指定运动的起点和终点,不然运动会无限循环执行下去。在示例中,起点位置有css样式设定固定值,用DOM对象的的offsetLeft属性来获取元素距离浏览器左侧的距离,并且每执行一次移动之前都要判断距离目标位置的差值是否大于一次移动的距离,如果小于要移动的距离直接设置到达终点,结束运动。

  1. //通过标签名获取第一个div元素节点对象
  2. var oDiv=document.getElementsByTagName("div")[0];
  3. //通过id获取button节点对象
  4. var oBut=document.getElementById("bit");
  5. //创建一个定时器变量初始为空
  6. var timer=null;
  7. //通过button点击事件触发运动函数
  8. oBut.onclick=function(){
  9. startMove(oDiv);
  10. }
  11. //执行匀速运动的方法startMove,参数obj为运动的体的document节点对象
  12. function startMove(obj){
  13. //启动定时器前,关闭之前开启的定时器
  14. clearInterval(timer);
  15. //初始化一个变量,用于设置运动速度
  16. var iSpeed;
  17. //处理业务逻辑
  18. //运动体大于距离目标点300时(这里是span标签的右侧零像素),运动体往左运动,反之则往右运动
  19. if(obj.offsetLeft>300){
  20. iSpeed= -8;
  21. }else{
  22. iSpeed= 8;
  23. }
  24. //定义定时器
  25. timer = setInterval(function (){
  26. //Math.ads()取当前位置与一单位移动距离的绝对值
  27. //当前位置比一单位移动距离小时,直接设置运动体到终点,并结束定时器
  28. //....................大时,执行运动运算
  29. if(Math.abs(300-obj.offsetLeft)<Math.abs(iSpeed)){
  30. clearInterval(timer);
  31. obj.style.left='300px';
  32. }else{
  33. obj.style.left=obj.offsetLeft+iSpeed+'px';
  34. }
  35. },30);
  36. }

3.看代码14行、30行代码clearInterval(timer)两处关闭定时器,setInterval()是每间隔多长时间执行一次,30行大家都通常能理解,当执行到终点时就关闭定时器。14行代码可能会有点懵,为什么在启动运动之前要关闭定时器呢?原因是如果出现多次触发运动启动时,会开启多个定时器叠加执行(具体知识点是闭包和定时器[模拟出来的]多线程),多个定时器叠加就相当于开倍速了,像实例中是点击触发运动,如果不管之前的定时器就出发运动,没点击一次就会有一次速度叠加。

4.最后既然要封装功能就要让代码具备复用性,所以可见将示例中的匀速移动函数提取出来,除了传入指定运动元素外,还需要用参数指定运动的终点位置和运动速度。

  1. //匀速运动算法
  2. function startMove(dom,target,iSpeed){
  3. clearInterval(timer);
  4. if(dom.offsetLeft>target){
  5. iSpeed= -1 * iSpeed;
  6. }else{
  7. iSpeed= 1 * iSpeed;
  8. }
  9. timer = setInterval(function (){
  10. if(Math.abs(target-dom.offsetLeft)<Math.abs(iSpeed)){
  11. clearInterval(timer);
  12. dom.style.left = target+'px';
  13. }else{
  14. dom.style.left=dom.offsetLeft+iSpeed+'px';
  15. }
  16. },30);
  17. }
  18. //参数:要运动的元素,运动到指定位置,运动的速度
  19. //注意1:需要在调用方法的作用域上声明timer变量
  20. //注意2:示例代码指定位置只有距离浏览器左侧的距离,如果是复杂的运动功能,可以将target封装成一个位置对象,还包括距离浏览器上边距、元素的大小,元素的透明度

后续博客持续更新,最后封装一个轮播图插件,当然这也不是最后的终点,学无止境,生命不息,挑战自我。

原生JavaScript运动功能系列(一):运动功能剖析与匀速运动实现的更多相关文章

  1. jQuery学习之路(7)- 用原生JavaScript实现jQuery的某些简单功能

    ▓▓▓▓▓▓ 大致介绍 学习了妙味,用原生的JavaScript实现jQuery中的某些部分功能 定义自己的函数库lQuery ▓▓▓▓▓▓ $()选择器的实现 jQuery是面向对象的,所以自己编写 ...

  2. 原生JavaScript实现页面回到顶部的功能

    /*如果想实现点击一个按钮让滚动条回到最顶部的功能,首先可能就会想到它是从底部位置移动到顶部的位置 它是一个运动的过程,只要知道当前位置(current Position)和想要到达的位置(targe ...

  3. 原生javascript实现 下拉框搜索功能

    由于业务需求,要实现 一个下拉框搜索功能.这个下拉功能和百度的还是有点区别的,百度的是时时与服务器交互的,而这个只是模拟.技术点在于实现 了搜索功能. 未搜索前如下图: 搜索后: <!DOCTY ...

  4. 原生JavaScript实战之搜索框筛选功能

    成品图如下所示: 先搭建HTML结构: <div class="wrapper"> <div class="sWrapper"> < ...

  5. 你可能不需要 jQuery!使用原生 JavaScript 进行开发

    很多的 JavaScript 开发人员,包括我在内,都很喜欢 jQuery.因为它的简单,因为它有很多丰富的插件可供使用,和其它优秀的工具一样,jQuery 让我们开发人员能够更轻松的开发网站和 We ...

  6. 原生 JavaScript 代码和Jquery实现对比

    下面就带大家一起看看在 IE 浏览器环境中如果使用原生 JavaScript 代码实现 jQuery 中的功能.如果你打算自己开发一个小的基础框架,可以好好参考一下这些代码的实现. 本文转载:http ...

  7. 原生JavaScript运动功能系列(五):定时定点运动

    原生JavaScript运动功能系列(一):运动功能剖析与匀速运动实现 原生JavaScript运动功能系列(二):缓冲运动 原生JavaScript运动功能系列(三):多物体多值运动 原生JavaS ...

  8. 原生JavaScript运动功能系列(四):多物体多值链式运动

    原生JavaScript运动功能系列(一):运动功能剖析与匀速运动实现 原生JavaScript运动功能系列(二):缓冲运动 原生JavaScript运动功能系列(三):多物体多值运动 多物体多值链式 ...

  9. 原生JavaScript运动功能系列(二):缓冲运动

    匀速运动实现回顾 缓冲运动剖析 示例实现 方法提取 匀速运动实现回顾及缓冲运动剖析: 在这个系列的上一篇博客中原生JavaScript运动功能系列(一):运动功能剖析与匀速运动实现就运动的核心功能组成 ...

随机推荐

  1. 微信小程序API 文档快速参考索引

    内容那么多,这个页面到底做了什么? 第一:解决微信文档APi文档使用不便: 第二:解决了内容搜索与索引:—— 最好是写成全文索引文档,但是比较需要时间,而且更新是一件麻烦的事:所以以下是直接 连接官网 ...

  2. LOJ2557. 「CTSC2018」组合数问题

    LOJ2557. 「CTSC2018」组合数问题 这道题是我第一道自己做完的题答题.考场上面我只拿了41分,完全没有经验.现在才发现其实掌握了大概的思路还是不难. 首先模拟退火,通过了1,2,6,9, ...

  3. 前端之Android入门(3):MVC模式(上)

    很多Android的入门书籍,在前面介绍完布局后就会逐个介绍组件,然后开始编写组件使用的例子.每每到此时小伙伴们都可能会有些疑问:是否应该先啃完一本<Java编程思想>学点 Java 知识 ...

  4. 【CF734F】Anton and School(构造)

    [CF734F]Anton and School(构造) 题面 Codeforces 洛谷 题解 算是一道\(easy\)? 发现\((a\&b)+(a|b)=a+b\). 那么根据给定条件我 ...

  5. 【BZOJ3215/3216】[ZJOI2013]话旧/话旧2(组合数学,动态规划)

    [BZOJ3215/3216][ZJOI2013]话旧/话旧2(组合数学,动态规划) 题面 BZOJ3215 BZOJ3216 题解 先解决\(3216\),求的是最小值为\(0\). 因为起点就是\ ...

  6. 「SCOI2015」小凸玩密室 解题报告

    「SCOI2015」小凸玩密室 虽然有心里在想一些奇奇怪怪的事情的原因,不过还是写太久了.. 不过这个题本身也挺厉害的 注意第一个被点亮的是任意选的,我最开始压根没注意到 \(dp_{i,j}\)代表 ...

  7. 【lua】lua安装学习

    Lua 是用标准C语言编写并以源代码形式开放的一种轻量小巧的脚本语言,设计目的是为了嵌入应用程序中,为应用程序提供灵活的扩展和定制功能. lua官网 http://www.lua.org/ 安装lua ...

  8. ACM-ICPC 2018 南京赛区网络预赛 L题(分层最短路)

    题目链接:https://nanti.jisuanke.com/t/31001 题目大意:给出一个含有n个点m条边的带权有向图,求1号顶点到n号顶点的最短路,可以使<=k条任意边的权值变为0. ...

  9. Arch Linux下Visual Stdio Code在格式化C代码时报错

    libtinfo.so.5: cannot open shared object file: No such file or directory Arch Linux下Visual Stdio Cod ...

  10. tyvj/joyoi 1305 最大子序和

    带了一个转化的单调队列裸题. 转化为前缀和相减即可. 有一点需要注意:从0开始入队而不是1,因为要统计第一个. (从网上找的对拍程序,结果别人写错了) /** freopen("in.in& ...