JS运动相关知识点小结(附弹性运动示例)

JS运动相关知识点小结(附弹性运动示例)

引言

随着Web应用越来越复杂,动画效果也逐渐成为Web开发中不可或缺的一部分,而JavaScript正是实现这些动画效果的关键。本文主要介绍JS运动相关的知识点,并通过附带的弹性运动示例来帮助读者更好地掌握这些知识点。

目录

  • 基础知识
  • 运动方式
  • 缓动函数
  • 弹性运动

基础知识

获取元素位置

在进行JS运动时,首先需要获取元素的位置信息。常见的有以下几种:

  • 获取元素相对于文档的位置

通过元素的 offsetLeft 和 offsetTop 属性可以获取元素相对于文档左上角的位置信息。

示例代码:

var ele = document.getElementById("box");
var offsetX = ele.offsetLeft;
var offsetY = ele.offsetTop;
  • 获取元素相对于父元素的位置

通过元素的 offsetParent 和 offsetTop 属性可以获取元素相对于其父元素左上角的位置信息。

示例代码:

var parentEle = document.getElementById("parentBox");
var ele = document.getElementById("box");
var offsetX = ele.offsetLeft - parentEle.offsetLeft;
var offsetY = ele.offsetTop - parentEle.offsetTop;

获取元素大小

在进行JS运动时,还需要获取元素的大小信息。常见的有以下几种:

  • 获取元素宽度和高度

通过元素的 offsetWidth 和 offsetHeight 属性可以获取元素的宽度和高度。

示例代码:

var ele = document.getElementById("box");
var width = ele.offsetWidth;
var height = ele.offsetHeight;
  • 获取元素自身宽度和高度

通过元素的 clientWidth 和 clientHeight 属性可以获取元素自身的宽度和高度(不包括边框和滚动条)。

示例代码:

var ele = document.getElementById("box");
var width = ele.clientWidth;
var height = ele.clientHeight;

运动方式

在JS中,常见的运动方式有以下三种:

  • setInterval

通过 setInterval 函数来定时执行某个函数,从而实现动画效果。每隔一定时间间隔执行一次,直到达到目标状态。

示例代码:

var ele = document.getElementById("box");
var targetX = 100;
var targetY = 200;

var timer = setInterval(function() {
    var curX = ele.offsetLeft;
    var curY = ele.offsetTop;
    var speedX = (targetX - curX) / 10;
    var speedY = (targetY - curY) / 10;
    ele.style.left = curX + speedX + "px";
    ele.style.top = curY + speedY + "px";
    if (curX == targetX && curY == targetY) {
        clearInterval(timer);
    }
}, 20);
  • requestAnimationFrame

通过 requestAnimationFrame 函数来执行某个动画效果,其实现原理和 setInterval 相似,但会根据浏览器性能自动调整帧率,更加流畅。

示例代码:

var ele = document.getElementById("box");
var targetX = 100;
var targetY = 200;

function move() {
    var curX = ele.offsetLeft;
    var curY = ele.offsetTop;
    var speedX = (targetX - curX) / 10;
    var speedY = (targetY - curY) / 10;
    ele.style.left = curX + speedX + "px";
    ele.style.top = curY + speedY + "px";
    if (Math.abs(targetX - curX) <= 1 && Math.abs(targetY - curY) <= 1) {
        ele.style.left = targetX + "px";
        ele.style.top = targetY + "px";
    } else {
        requestAnimationFrame(move);
    }
}
requestAnimationFrame(move);
  • transition

通过 CSS 的 transition 属性来实现动画效果。设置好需要动画的 CSS 属性和动画时间后,浏览器将自动处理动画效果。

示例代码:

#box {
    width: 100px;
    height: 100px;
    background-color: red;
    transition: all 1s;
}
#box:hover {
    transform: translateX(100px);
}

缓动函数

在运动的过程中,需要对运动的速度进行控制。常见的方式是使用缓动函数来实现,常见的缓动函数有以下几种:

  • 线性缓动函数

速度恒定,实现简单,但缺乏流畅感。

function linear(t, b, c, d) {
    return c * t / d + b;
}
  • 平方缓动函数

速度逐渐增加,动画开始时缓慢,后面加速。

function quadraticEaseIn(t, b, c, d) {
    return c * (t /= d) * t + b;
}
function quadraticEaseOut(t, b, c, d) {
    return -c * (t /= d) * (t - 2) + b;
}
function quadraticEaseInOut(t, b, c, d) {
    if ((t /= d / 2) < 1) return c / 2 * t * t + b;
    return -c / 2 * ((--t) * (t - 2) - 1) + b;
}
  • 指数缓动函数

速度逐渐增加,动画开始时缓慢,后面加速。

function expoEaseIn(t, b, c, d) {
    return (t == 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b - c * 0.001;
}
function expoEaseOut(t, b, c, d) {
    return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;
}
function expoEaseInOut(t, b, c, d) {
    if (t == 0) return b;
    if (t == d) return b + c;
    if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b;
    return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;
}
  • 弹性缓动函数

模拟弹性运动的效果,动画结束后会产生弹跳回震动的效果。

function elasticEaseIn(t, b, c, d) {
    var s = 1.70158; 
    var p = 0; 
    var a = c; 
    if (t == 0) return b;  
    if ((t /= d) == 1) return b + c;  
    if (!p) p = d * 0.3;  
    if (a < Math.abs(c)) { 
        a = c; 
        var s = p / 4; 
    } else {
        var s = p / (2 * Math.PI) * Math.asin(c / a); 
    }
    return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
}
function elasticEaseOut(t, b, c, d) {
    var s = 1.70158; 
    var p = 0; 
    var a = c; 
    if (t == 0) return b;   
    if ((t /= d) == 1) return b + c;  
    if (!p) p = d * 0.3; 
    if (a < Math.abs(c)) { 
        a = c; 
        var s = p / 4; 
    } else {
        var s = p / (2 * Math.PI) * Math.asin(c / a); 
    }
    return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;
}
function elasticEaseInOut(t, b, c, d) {
    var s = 1.70158; 
    var p = 0; 
    var a = c; 
    if (t == 0) return b;  
    if ((t /= d / 2) == 2) return b + c;  
    if (!p) var p = d * (0.3 * 1.5); 
    if (a < Math.abs(c)) { 
        var a = c; 
        var s = p / 4; 
    } else {
        var s = p / (2 * Math.PI) * Math.asin(c / a); 
    }
    if (t < 1) return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
    return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * 0.5 + c + b;
}

弹性运动

弹性运动是指,运动到达目标时,元素不是立即停止,而是从目标位置继续运动一段距离,然后“反弹”回来,再次超过目标后,又会“反弹”回来。具体实现可以借助缓动函数来模拟。

示例代码:

var ele = document.getElementById("ball");
var targetX = 500;
var targetY = 150;
var times = 0;
var speedX = 0;
var speedY = 0;

function move() {
    var curX = ele.offsetLeft;
    var curY = ele.offsetTop;
    var distanceX = targetX - curX;
    var distanceY = targetY - curY;
    speedX += distanceX * 0.3;
    speedY += distanceY * 0.3;
    speedX *= 0.8;
    speedY *= 0.8;
    ele.style.left = curX + speedX + "px";
    ele.style.top = curY + speedY + "px";
    times++;
    if (times < 100) {
        requestAnimationFrame(move);
    }
}
requestAnimationFrame(move);

以上就是对JS运动相关知识点的小结和弹性运动示例的介绍。希望通过本文的学习,能够对JS运动有更深入的了解,从而更好地实现Web开发中的动画效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS运动相关知识点小结(附弹性运动示例) - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • CSS样式表与格式布局详解

    CSS样式表与格式布局详解 CSS(Cascading Style Sheets)是一种用于控制网页样式和布局的语言。本攻略将详细讲解CSS样式表的基本语法、选择器、盒模型、格式布局、浮动、定位、响应式设计等内容。 CSS样式表的基本语法 CSS样式表由选择器和声明块组成。选择器用于选择应用样式的HTML元素,声明块由一组属性和值组成,用于定义元素的样式。例…

    css 2023年5月18日
    00
  • Yii使用CLinkPager分页实例详解

    Yii使用CLinkPager分页实例详解 在Yii框架中,分页是一个常用的功能。Yii提供了许多类来帮助我们轻松实现分页功能,其中最常用的是CLinkPager类。在这篇文章中,我们将详细讲解如何使用CLinkPager类来实现分页功能。 一、安装与配置 首先,我们需要在composer.json文件中添加yiisoft/yii的依赖,执行composer…

    css 2023年6月9日
    00
  • IE8 滤镜效果filter:alpha(opacity=20);IE下失效出现黑色

    下面是关于“IE8 滤镜效果filter:alpha(opacity=20);IE下失效出现黑色”的完整攻略。 背景说明 在IE8及以下的浏览器中,为了实现透明效果,我们需要使用filter:alpha(opacity=20)这个CSS样式。但是,有时候在IE下面实现透明效果时会出现黑色的背景,这是由于IE8滤镜效果的特性引起的。 解决方法 1. 加back…

    css 2023年6月11日
    00
  • jquery获取css的color值返回RGB的方法

    要获取一个元素的CSS中的color值返回RGB的方法,可以使用jQuery中的css()方法和rgb2hex()函数。 具体的步骤如下: 1.使用jQuery选择器选择需要获取CSS的元素。 例如,要获取id为‘myDiv’的元素的CSS中的color值,可以使用以下代码: var color = $(‘#myDiv’).css(‘color’); 2.获…

    css 2023年6月9日
    00
  • 巧用 CSS3的webkit-box-reflect 倒影实现各类动效

    下面就为您详细讲解“巧用 CSS3的webkit-box-reflect 倒影实现各类动效”的完整攻略。 什么是CSS3的webkit-box-reflect CSS3的webkit-box-reflect是一种CSS3的属性,可以在盒子(box)下面添加一个倒影。它是Webkit浏览器的私有属性,只能在Webkit内核的浏览器中使用,比如Chrome和Sa…

    css 2023年6月11日
    00
  • JQuery animate动画应用示例

    下面是详细的jQuery animate动画应用示例攻略: 1. 简介 在网页设计中,常常需要使用到动画效果来吸引用户的注意力,使用户体验更加生动。而jQuery的animate()函数能够实现简单方便的动画效果,包括位置变化、尺寸变化、透明度、背景色等等。本文将介绍如何使用jQuery的animate()函数来实现动画效果,并提供两个使用示例。 2. 基本…

    css 2023年6月9日
    00
  • photoshop制作出时尚耐看的深蓝色网站导航效果

    下面是Photoshop制作出时尚耐看的深蓝色网站导航效果的完整攻略: 一、准备工作 打开Photoshop软件,创建一个新的文件,设置文件宽度为1200像素,高度为500像素,背景色为白色。 进入工具栏,选择矩形工具,选中填充颜色为#2e3d49(深蓝色),新建一个矩形,大小设置为1200×80像素,居中放置在新建文件的顶部。 二、制作导航背景效果 选择新…

    css 2023年6月10日
    00
  • 使用jQuery实现的掷色子游戏动画效果

    使用jQuery实现掷色子游戏动画效果的攻略步骤如下: 1. 引入jQuery 在HTML文件head标签中引入jQuery文件。可以从官网下载(https://jquery.com/)或使用CDN。 <head> <script src="https://code.jquery.com/jquery-3.6.0.min.js&q…

    css 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部