【JavaScript】用原生js来实现元素的缓冲运动

news/2024/7/19 14:39:04 标签: js

缓冲运动

缓冲运动是指,运动物体的速度由快到慢,逐渐停止。

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #div1 {width: 200px; height: 200px; background-color: #ccc; position: absolute; top: 50px; left: 0;}
    </style>
</head>

<body>
    <input type="button" value="开始运动" onclick="startMove()">
    <div id="div1"></div>
    <hr>
    <ol>
        <li>速度与距离目标位置的大小成正比</li>
    </ol>
    <script>
        var timer = null //存放定时器的返回值,用于关闭定时器
        var speed = 0
        function startMove() {
            var oDiv = document.getElementById('div1');
            clearInterval(timer)
            setInterval(function(){
                var speed = (300 - oDiv.offsetLeft)/10 //分母越大,速度越小
                speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed) //保证速度始终为整数
                oDiv.style.left = oDiv.offsetLeft + speed + 'px'
                console.log(oDiv.offsetLeft,speed)
            }, 30)
        }
    </script>
</body>

Math方法

    <script>
        alert(Math.ceil(291.99)) //向上取整 292 
        alert(Math.ceil(-291.1)) //向上取整 -291
        alert(Math.floor(3.99)) //向下取整 3
        alert(Math.floor(-3.99)) //向下取整 -4
        alert(Math.abs(-6)) //绝对值 6
        alert(Math.abs(6)) //绝对值 6
        alert(Math.round(3.2)) //四舍五入 3
        alert(Math.round(-3.6)) //四舍五入 4
    </script>

实例1、屏幕右侧悬浮框(右下角)

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #div1 {width: 200px; height: 200px; background-color: #ccc; position: absolute; bottom: 0; right: 0;}
    </style>
</head>

<body style="height: 2000px;">
    <div id="div1"></div>
    <script>
        
        window.onscroll = function(){
            var oDiv = document.getElementById('div1')
            var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; //解决兼容性
            //oDiv.style.top = document.documentElement.clientHeight - oDiv.offsetHeight + scrollTop + 'px'
            startMove(document.documentElement.clientHeight - oDiv.offsetHeight + scrollTop) //可是区域的高度 - 元素高度 + 滚动的高度
        }
        var timer = null;
        function startMove(iTarget){
            var oDiv = document.getElementById('div1');
            clearInterval(timer);
            timer = setInterval(function(){
                var speed = (iTarget - oDiv.offsetTop) / 8
                speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed)
                if(oDiv.offsetTop == iTarget){
                    clearInterval(timer)
                }else{
                    oDiv.style.top = oDiv.offsetTop + speed + 'px'
                }
            }, 30)
        }
    </script>
</body>

实例2、对联悬浮框(垂直居中)

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #div1 {width: 200px; height: 200px; background-color: #ccc; position: absolute; bottom: 0; right: 0;}
    </style>
</head>

<body style="height: 2000px;">
    <div id="div1"></div>
    <script>
        window.onscroll = function(){
            var oDiv = document.getElementById('div1')
            var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; //解决兼容性
            //oDiv.style.top = (document.documentElement.clientHeight - oDiv.offsetHeight) / 2 + scrollTop  + 'px'
            startMove(parseInt((document.documentElement.clientHeight - oDiv.offsetHeight) / 2 + scrollTop)) //(可是区域的高度 - 元素高度) / 2 + 滚动的高度
        }  //要将目标位置取整,否则会出现元素抖动的问题
        var timer = null;
        function startMove(iTarget){
            var oDiv = document.getElementById('div1');
            clearInterval(timer);
            timer = setInterval(function(){
                var speed = (iTarget - oDiv.offsetTop) / 8
                speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed)
                if(oDiv.offsetTop == iTarget){
                    clearInterval(timer)
                }else{
                    oDiv.style.top = oDiv.offsetTop + speed + 'px'
                }
            }, 30)
        }
    </script>
</body>

实例3、匀速运动的停止

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #div1 {width: 200px; height: 200px; background-color: #ccc; position: absolute; top: 50px; left: 0;}
</head>

<body>
    <input type="button" value="开始运动" onclick="startMove(100)">
    <div id="div1"></div>
    <script>
        var timer = null //存放定时器的返回值,用于关闭定时器
        function startMove(iTarget) {
            var oDiv = document.getElementById('div1')
            clearInterval(timer) //原则1、在开始运动之前,关闭已有定时器
            timer = setInterval(function () {
                var speed = 0
                if(oDiv.offsetLeft > iTarget){ //通过目标位置和当前位置判断 speed 的正负
                    speed = -7 //如果当前位置比目标位置大 speed 为负
                }else{
                    speed = 7 //反之为正
                }
                if (Math.abs(iTarget - oDiv.offsetLeft) <= 7) { //目标位置和 offsetLeft 之间的间距小于 speed,就认为已达到目标位置
                    clearInterval(timer)
                    oDiv.style.left = iTarget + 'px' // 设置直接达到目标位置
                } else {
                    oDiv.style.left = oDiv.offsetLeft + speed + 'px'
                }
            }, 30)
        }
    </script>
</body>

 


http://www.niftyadmin.cn/n/497434.html

相关文章

JS监听关闭浏览器事件

Onunload与Onbeforeunload Onunload&#xff0c;onbeforeunload都是在刷新或关闭时调用&#xff0c;可以在脚本中通过window.onunload 来指定或者在里指定。区别在于onbeforeunload在onunload之前执行&#xff0c;它还可以阻止onunload的执 行。 Onbeforeunload也是在页面刷新…

Nginx与django+uwsgi成功勾搭的始末(上)

先说明一下本人的环境&#xff1a;Uwsgi版本&#xff1a;2.0.14(yum install安装&#xff09;django版本&#xff1a;1.10.6&#xff08;pip install安装&#xff09;python版本&#xff1a;2.7.5(阿里云 centos 7自带&#xff09;nginx版本&#xff1a;1.10.2&#xff08;yum …

最简单实用的MongoDB安装教程:在CentOS中使用 yum 安装MongoDB及服务器端配置详解

&#xfeff;&#xfeff;一、准备工作&#xff1a; 运行yum命令查看MongoDB的包信息 [rootvm ~]# yum info mongo-10gen &#xff08;提示没有相关匹配的信息&#xff0c;&#xff09; 说明你的centos系统中的yum源不包含MongoDB的相关资源&#xff0c;所以要在使用yum命令安装…

Windows下安装Oracle12C(二)

一、安装Oracle参考 Windows下安装Oracle12C&#xff08;一&#xff09;二、新建用户1. 安装完成后&#xff0c;启动SQLPlus&#xff0c;然后输入内置的用户名和密码用户名&#xff1a;sys 密码&#xff1a;as sysdba2. 正常登陆后输入如下代码&#xff0c;注意分号不能缺失&a…

检测远程主机上的某个端口是否开启——telnet命令

为什么80%的码农都做不了架构师&#xff1f;>>> 要测试远程主机上的某个端口是否开启&#xff0c;无需使用太复杂的工作&#xff0c;windows下就自带了工具&#xff0c;那就是telnet。ping命令是不能检测端口,只能检测你和相应IP是否能连通。 1 安装telnet。win7下…

【JavaScript】原生js实现多个元素运动、一套运动框架改变任意样式

多个元素运动 注意&#xff1a;多个元素&#xff0c;定时器需要多个。 <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>d…

CentOS yum安装sun Java jre jdk和openjdk

&#xfeff;&#xfeff;在Linux下的tty终端下&#xff0c;安装sun jre&#xff0c;但是去Oracle安装&#xff0c;下载居然还要登录&#xff0c;使用cookie&#xff0c;没办法。直接到http://www.java.com/下载了。 说明&#xff1a;如果使用yum install 安装软件&#xff0c;…

Java 之 装饰者模式

2019独角兽企业重金招聘Python工程师标准>>> 本章可以成为 “给爱用继承的人一个全新的设计眼界”。我们即将再度探讨继承滥用的问题。并在会在本章中学到如何使用对象组合的方式&#xff0c;做到运行时装饰类。为何&#xff1f;一旦你熟悉了装饰的技巧。你将能够在…