一步步教你弹性框架-中篇

HTML5学堂:本文继续为大家讲解弹性框架,在前一篇文章当中,我们实现了最基本的来回运动,在本文当中我们将基于前者,继续书写我们的代码。主要包括缓冲效果、有摩擦力的运动以及计时器的清除三个部分。在本文之后也将能够实现基本的弹性动画效果。

第三步 将运动处理成缓冲效果

缓冲效果其实是与速度相关的,在我们课程中的动画框架中其实也讲过——速度 = (目标值 - 当前值) / 步长。此处我们就不再做详细讲解了,直接上代码:

var btn = document.getElementById("btn");    // 获取控制按钮
var move = document.getElementById("move");    // 获取运动块
var timer = null;    // 初始化一个计时器
var speed = 0;    // 初始化一个速度
var startVal = parseInt(getStyle(move, "marginLeft"));    // 获取初始位置
var targetVal = 600;    // new~! 新增一个变量,用于存储目标值
 
btn.onclick = function () {
    timer = setInterval(function(){
        speed += (targetVal - startVal) / 40;
 
        startVal += speed;
        move.innerHTML = "速度:" + speed + "\n当前位置:" + startVal;    // 测试用代码-便于理解
        move.style.marginLeft = startVal + "px";    // 通过修改marginLeft实现块向右运动
    }, 24);
}

当前的效果:

之所以采用缓冲运动,就是让运动呈现先慢后快再慢的视觉效果。

PS:对于基本结构与样式代码,在我们前一篇文章——一步步教你弹性运动框架(上)中有书写,可直接点击查看。

第四步 运动的摩擦力?

在实现缓冲之后,最核心的一点就是如何让速度在当前这种“先慢后快再慢”的效果上,还要越来越慢。换到我们生活当中,其实就相当于是一个物体在地面运动,必然会存在摩擦力。这种摩擦力怎么实现出来呢?

听上去好像很难的样子,自己在最初思考这个问题的时候其实也是有些纳闷,不过当想到方法的时候,突然就恍然大悟了~方法很简单——将速度乘以一个小于1的数字~~~

所以,只需要为获取到的speed再执行一句代码即可

var btn = document.getElementById("btn");    // 获取控制按钮
var move = document.getElementById("move");    // 获取运动块
var timer = null;    // 初始化一个计时器
var speed = 0;    // 初始化一个速度
var startVal = parseInt(getStyle(move, "marginLeft"));    // 获取初始位置
var targetVal = 600;    // new~! 新增一个变量,用于存储目标值
 
btn.onclick = function () {
    timer = setInterval(function(){
        speed += (targetVal - startVal) / 40;
        speed *= 0.95;
        startVal += speed;
        move.innerHTML = "速度:" + speed + "\n当前位置:" + startVal;    // 测试用代码-便于理解
        move.style.marginLeft = startVal + "px";    // 通过修改marginLeft实现块向右运动
    }, 24);
}

PS:增加的代码是“speed *= 0.95;”

当前的效果:

已经出现回弹的效果了,果断离成功不远喽~~~

第五步 计时器还是要清除的

从上面的效果中也能看出,计时器是一直没有停下来的~

关于清除条件的确是需要思考一下滴~是不是当前值等于终点值呢?果断不是(反弹的效果会在前几次运动时经过终点值)。那,是不是速度为0呢?貌似也不是(最左端和最右端也是速度为0)。但是,我们将这两个条件结合起来貌似就可以了~同时满足如下两个条件:1、速度达到某个值;2、终点值与当前位置的差值也达到某个值。

需要增加如下代码

if (Math.abs(speed) < 1 && Math.abs(startVal - targetVal) < 1) {
    clearInterval(timer);
    startVal = targetVal;
};

解释一下上面的代码,当速度值绝对值小于1且当前位置距离终点位置小于1的时候,我们把计时器清除掉,并将目标值赋值给当前值。这个部分的操作,能够防止出现抖动现象,防止误差叠加-属性值的取整问题。这个时候我们就能发现,计时器最终被清除掉了。

当前的完整JavaScript代码

var btn = document.getElementById("btn");    // 获取控制按钮
var move = document.getElementById("move");    // 获取运动块
var timer = null;    // 初始化一个计时器
var speed = 0;    // 初始化一个速度
var startVal = parseInt(getStyle(move, "marginLeft"));    // 获取初始位置
var targetVal = 600;    // new~! 新增一个变量,用于存储目标值
 
btn.onclick = function () {
    timer = setInterval(function(){
        speed += (targetVal - startVal) / 40;
        speed *= 0.95;
        startVal += speed;
 
        if (Math.abs(speed) < 1 && Math.abs(startVal - targetVal) < 1) {
            clearInterval(timer);
            startVal = targetVal;
        };
 
        move.innerHTML = "速度:" + speed + "\n当前位置:" + startVal;    // 测试用代码-便于理解
        move.style.marginLeft = startVal + "px";    // 通过修改marginLeft实现块向右运动
    }, 24);
}

到此,我们能够其实已经实现了基本的弹性框架功能,唯一不足的就在于我们的代码扩展性不够好,在下一篇文章当中,我们将会完成弹性运动框架的收尾工作 —— 完善优化,提升扩展性。

原文发布于微信公众号 - HTML5学堂(h5course-com)

原文发表时间:2016-01-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CDA数据分析师

技能 | 如何使用Excel数据分析工具进行多元回归分析

使用Excel数据分析工具进行多元回归分析与简单的回归估算分析方法基本相同。但是由于有些电脑在安装办公软件时并未加载数据分析工具,所以从加载开始说起(以Exce...

3988
来自专栏向治洪

自定义Interpolator

nterpolator这个东西很难进行翻译,直译过来的话是补间器的意思,它的主要作用是可以控制动画的变化速率,比如去实现一种非线性运动的动画效果。那么什么叫做非...

2187
来自专栏数据小魔方

sparklines迷你图系列4——Evolution(Area)

今天接着分享Evolution图表类型中的Area图表。 其实就是我们常见的区域图(或者叫面积图),它与折线图(昨天讲到的)都是用来呈现时间序列中的趋势走向和波...

2834
来自专栏落影的专栏

视频直播与虚拟现实的渲染 - OpenGL ES

这是一篇OpenGL ES的学习笔记,介绍图像绘制里面用到的概念,学习OpenGL ES的基础知识备忘录。 教程 OpenGLES入门教程1-Tutorial0...

2968
来自专栏hightopo

基于HTML5和WebGL的3D网络拓扑结构图

2443
来自专栏数据小魔方

R语言可视化——REmapB函数

今天跟大家介绍一个REmap包的新函数——REmapB。 它是REmap包中诸多组函数中的一位,功能上要强大于之前介绍的REmap函数,不仅可以完成REmap函...

1.3K4
来自专栏天天P图攻城狮

iOS GPUImage源码解读(一)

最近在不断学习、使用的过程中,有了更深刻的理解,特来写一篇源码解读的文章详细介绍下核心代码的具体实现。

3K12
来自专栏前端说吧

echarts - 特殊需求实现代码汇总之【线图】篇

继7月24的echarts-柱图配置汇总后,echarts特殊配置连载第四篇 之 线图终于也被我这个懒家伙放出来了!

2363
来自专栏HT

基于HTML5和WebGL的3D网络拓扑结构图

现在,3D模型已经用于各种不同的领域。在医疗行业使用它们制作器官的精确模型;电影行业将它们用于活动的人物、物体以及现实电影;视频游戏产业将它们作为计算机与视频游...

5115
来自专栏数据小魔方

风向玫瑰图

今天要跟大家分享的图表是——风向玫瑰图! 听起来就能大概猜出来这种图表长啥样,就是很类似气象图表中的那种代表风向的方位图。 以下是本案例图表所用到的原始数据以及...

3974

扫码关注云+社区

领取腾讯云代金券