美文网首页
js运动之一(匀速,折返,缓冲,加速)

js运动之一(匀速,折返,缓冲,加速)

作者: 江海大初学者 | 来源:发表于2017-09-07 22:48 被阅读0次

Hello,我是江工大初学者。今天要讲的是运动。
源码已上传至github, 需要的小伙伴可以去下载 https://github.com/17714574361/js-linear-motion_1
既然讲到运动,我们先看一个问题,物体运动原理是什么,知道吗,我知道你肯定不知道。物体的运动原理是:通过改变物体的位置,而发生移动变化。没错,就是这几个字。
那么我们怎样才能再代码中设置运动呢?我们要给运动的设置定位属性,然后通过设置left值、top值来改变物体运动的位置。
好的。我们先看怎么来一个匀速运动。

匀速运动

既然是匀速运动,我们先设置一个总路程,假设是600,当我们点击按钮的时候,我们先清除老的定时器(否则在运动的时候多次点击按钮就会加速运行,速度会越来越快),然后再开启一个新的定时器,间隔时间设置为50ms(你可以修改自己喜欢的时间间隔),然后我们再设置一个速度,每隔50ms走多少路程,这样每次50ms box的运动距离,即left值为box距离左边的距离+这个速度。当box运动到终点是要干嘛,还要继续运动吗?当然是不需要,这是我们只要将box的left值设为总路程即可,这样运动就停止了,然后在清除定时器。

html代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>匀速运动</title>
    <script src="utils.js"></script>
    <script src="linear.js"></script>
    <link rel="stylesheet" href="linear.css">
</head>

<body>
    <button id="start">start</button>
    <div id="box"></div>
</body>

</html>

css代码:

#box {
    width: 100px;
    height: 100px;
    background: seagreen;
    position: absolute;
    left: 0;
    top: 50px;
}

js代码:

window.onload = function () {
    let start = $("start");
    let box = $("box");

    //总路程
    const TOTAL_DISTANCE = 600;
    //速度,每50ms走多少路程
    const SPEED = 15;

    start.onclick = function () {
        //清除老的定时器,box.timer就是我们给box添加一个自定义属性
        clearInterval(box.timer);

        //开启一个新的定时器
        box.timer = setInterval(function () {
            box.style.left = box.offsetLeft + SPEED + "px";

            //如果box的left值大于总路程,则设置总路程,
            //并清除定时器,若不清除定时器,
            //就会一直运行此段代码,这样会减少性能;
            if (Number.parseInt(getStyle(box, "left")) > TOTAL_DISTANCE) {
                box.style.left = TOTAL_DISTANCE + "px";
                clearInterval(box.timer);
            }
        }, 50);
    }
}

//工具类↓↓↓
//获取id
function $(id) {
    return document.getElementById(id);
}

//获取样式,返回值是带px的字符串
function getStyle(element, attr) {
    return element.currentStyle ? element.currentStyle[attr] : getComputedStyle(element, null)[attr];
}

折返运动

折返运动就是往返运动,先运动到终点,再折回来起点,再运动到终点,这就是折返运动,整个思路更匀速运动来时一样的,先清除老的定时器,原因一样,再开启新的定时器。关键是核心代码,怎么才能折回来呢?在匀速运动的基础上,当运动到终点的时候,我们可以减去速度。直接看代码吧!这里的代码只是js代码不一样,其他和匀速运动一样,相同的工具类代码我也不贴了。

js代码:

window.onload = function () {
    let start = $("start");
    let box = $("box");

    //总路程
    const TOTAL_DISTANCE = 600;
    //速度
    let SPEED = 15;

    //最小路程,代码世界中可以为负数
    const MIN_DISTANCE = 0;

    start.onclick = function () {
        //清除老的定时器
        clearInterval(box.timer);
        box.timer = setInterval(function () {
            //设置速度
            box.style.left = box.offsetLeft + SPEED + "px";

            /** 当box距离左侧的距离 >= 总路程的时候,就把速度 * -1
             *  这样下一次就是减去这个速度
             *  box.offsetLeft不能写box的left值,写了left值后就会一直抖动
             *
            */
            if (box.offsetLeft >= TOTAL_DISTANCE) {
                SPEED *= -1;
            }
            //当box距离左侧距离 <= 最小距离是,就把速度 * -1
            //这样下一次就是加上这个速度
            if (box.offsetLeft <= MIN_DISTANCE) {
                SPEED *= -1;
            }
        }, 50);
    }
}

//此处将这个获得样式的方法改了下,返回结果为number类型的数值
function getStyle(element, attr) {
    let result = element.currentStyle ? element.currentStyle[attr] : getComputedStyle(element, null)[attr];
    return Number.parseInt(result);
}

缓冲运动

什么是缓冲运动,缓冲运动就是由加速到减速就是缓冲运动,也叫减速运动。
缓冲运动的思路:我们依然需要总路程和速度,只不过此时的速度不一样,会发生变化,那么我们就要考虑怎样才能让速度发生变化,我们可以将总路程分为8段(你可以设置成你自己喜欢的段位),然后通过剩下的路程/8计算出速度,而且这里的速度还不一样,我们可以看图。

buffer1.png

当物体运动到A的位置时,剩下的路程restDistance/8 和 当物体运动到B的位置时,剩下的路程restDistance/8,可以发现当restDistance的值越小时,速度也越小,这样我们可以让速度越来越小。剩下的路程怎么算呢?剩下的路程restDistance = 总路程 - box.offsetLeft。好了,这样就解决了
html,css,工具类代码都一样,所以直接贴js代码

window.onload = function () {
    let start = $("start");
    let box = $("box");

    //总路程
    const TOTAL_DISTANCE = 600;

    start.onclick = function () {
        //清除老的定时器
        clearInterval(box.timer);
        //开启新的定时器
        box.timer = setInterval(function () {
            //获得当前box的left值
            let currentPosition = getStyle(box, "left");
            //速度=剩下的路程/8,8为8段
            let speed = (TOTAL_DISTANCE - currentPosition) / 8;
            box.style.left = box.offsetLeft + speed + "px";
            if (box.offsetLeft >= TOTAL_DISTANCE) {
                BOX.style.left = TOTAL_DISTANCE + "px";
                clearInterval(box.timer);
            }
        }, 50);
    }
}

加速运动

加速运动刚好与缓冲运动相反

buffer2.png

从图中可以发现,运动到A处时,物体A距离左侧的距离是offsetLeft,运动到B处时,物体B距离左侧距离是offsetLeft,速度就可以这么算,speed= offsetLeft / 8,这样就发现offsetLeft越大时,speed就越大,这样物体物体就可做加速运动了,但是有个问题,当offsetLeft<4时,物体时动不了的,这是js的精准度问题,所以至少要是4开始(我的代码写了5)

window.onload = function () {
    let start = $("start");
    let box = $("box");

    //总路程
    const TOTAL_DISTANCE = 600;

    start.onclick = function () {
        //清除老的定时器
        clearInterval(box.timer);
        //开启新的定时器
        box.timer = setInterval(function () {
            //获得当前box的left值
            let currentPosition = getStyle(box, "left");
            //速度=物体距离左侧的距离/8,8为8段,从0开始不起效,直到4开始有用
            let speed = (currentPosition + 4) / 8;
            box.style.left = box.offsetLeft + speed + "px";
            if (box.offsetLeft >= TOTAL_DISTANCE) {
                box.style.left = TOTAL_DISTANCE + "px";
                clearInterval(box.timer);
            }
        }, 50);
    }
}

今天就到这里,明天继续。

源码已上传至github, 需要的小伙伴可以去下载 https://github.com/17714574361/js-linear-motion_1

相关文章

  • js运动之一(匀速,折返,缓冲,加速)

    Hello,我是江工大初学者。今天要讲的是运动。源码已上传至github, 需要的小伙伴可以去下载 https:/...

  • js运动之二(封装等)

    昨天我们看过匀速,加速,缓冲,折返运动的实现方法,那么今天就来看看如何实现透明度的变化。透明度的变化跟之前的差不多...

  • jquery.easing.js 使用方法

    jquery.easing.js是一款jQuery动画效果插件,使用该插件可以实现直线匀速运功、变加速运动、缓冲等...

  • JavaScript 运动 03 —— 缓冲运动

    缓冲运动和匀速运动的区别 匀速运动:速度一直不变的运动缓冲运动:速度逐渐加快或者减慢的运动缓冲运动的速度处于不断的...

  • JavaScript——运动

    一、运动框架 二、匀速运动 三、缓冲运动

  • 侧边隐藏分享栏的简单Demo

    侧边隐藏分享栏 一、Html布局 二、Css样式 三、Js部分 speed一定的匀速运动 speed改变的缓冲运动

  • canvas-15 小球匀速度 + 加速度 + 弹性运动

    匀速度: 加速度: 弹性运动:

  • JS运动

    JS运动学习笔记。冲鸭!!!! 1. 匀速运动 2. 缓冲运动 物体的速度距离目标点越近,就越小;当到达目标点时,...

  • 如诗般的物理运动

    匀速直线运动 不骄不躁 从一而不终 匀加速直线运动...

  • js 缓冲运动

    缓冲运动就是运动的速度越来越慢,直到到达目标位置停止实现原理和上一篇文章淡入淡出相似,都是动态的修改某个值缓冲运动...

网友评论

      本文标题:js运动之一(匀速,折返,缓冲,加速)

      本文链接:https://www.haomeiwen.com/subject/khabjxtx.html