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日

相关文章

  • layui按条件隐藏表格列的实例

    下面是针对“layui按条件隐藏表格列的实例”的完整攻略: 需求背景 有时候我们需要按照条件隐藏表格中的某几列,比如说当表格中的某些列没有数据时,我们就需要将这些列隐藏起来,以免影响表格的美观性和用户体验。而layui是一款非常实用的前端UI框架,拥有很多便捷的表格API,因此本文将介绍如何利用layui实现按条件隐藏表格列的功能。 实现步骤 步骤一:准备工…

    css 2023年6月10日
    00
  • CSS3实现多背景展示效果通过CSS3定位多张背景

    CSS3提供了一个非常便捷的方式,可以在一个元素上添加多个背景图片,并通过定位来控制它们的位置、大小和重叠程度。下面,我们详细讲解如何使用CSS3实现多背景展示效果,并通过代码示例来进行说明。 1. CSS3实现多背景展示效果的基本原理 使用CSS3实现多背景效果的原理非常简单,只需在一个元素的background属性中,使用逗号分隔多个背景图片的url,并…

    css 2023年6月9日
    00
  • CSS清除浮动常用方法小结

    CSS清除浮动常用方法小结 什么是浮动? 浮动是指元素脱离文档流,沿着父元素的左边或右边浮动。浮动元素(float元素)既可以在文字周围排列,也可以在其它块元素的周围排列。 为什么要清除浮动? 浮动元素会影响元素的高度,导致父元素无法自适应高度。因此,我们需要清除浮动来解决这个问题。 清除浮动的方法 父元素使用clearfix clearfix 是一种清除浮…

    css 2023年6月10日
    00
  • HTMl中标签中li横向排列的实现示例

    HTML中的 标签默认为垂直排列,如果需要横向排列,可以通过CSS样式进行控制。下面将介绍两种常用的方法。 方法一:使用display:inline-block属性 可以将每个 标签设置为inline-block属性,使每个标签都在同一行中显示。同时还要设置父元素的样式为text-align:center,使每个标签居中。 示例代码: <style&g…

    css 2023年6月9日
    00
  • CSS运用阿里巴巴矢量库快速在对应位置加上好看的图标效果(实例代码)

    CSS运用阿里巴巴矢量库快速在对应位置加上好看的图标效果是一种常用的前端开发技巧。这里我们将介绍具体的操作步骤,包括: 引入阿里巴巴矢量库 选择合适的图标 添加样式到html元素上 下面展示两条具体的示例操作: 示例1:添加箭头图标 1. 引入阿里巴巴矢量库 在head标签中添加如下代码: <link rel="stylesheet&quot…

    css 2023年6月9日
    00
  • css实现简易报警灯的示例代码

    下面是关于如何使用CSS实现简易报警灯的完整攻略: 1. 确定报警灯的基本要素 在着手编写CSS代码之前,需要先明确报警灯的基本要素,如灯的颜色、灯亮着的时间、灯亮的方式等,这可以根据实际需要进行调整。 2. 使用CSS transition属性来创建闪烁效果 CSS中的transition属性可以用来实现过渡效果,比如实现报警灯的闪烁效果就可以使用该属性。…

    css 2023年6月10日
    00
  • CSS教程,让网页对搜索引擎更友好

    下面是“CSS教程,让网页对搜索引擎更友好”的完整攻略。 一、为什么CSS可以优化网页对搜索引擎友好 CSS作为网页设计中的重要组成部分,不仅可以帮助网页实现美观的效果,同时也可以优化网页对搜索引擎的友好度。 具体来说,CSS可以通过以下方式来优化网页对搜索引擎友好: 分离HTML和CSS代码,使得搜索引擎更容易读取和理解网页内容。 使用CSS控制网页布局和…

    css 2023年6月9日
    00
  • 深入剖析CSS变形transform(3d)

    深入剖析CSS变形transform(3d) 什么是Transform Transform 是 CSS3 中非常强大的一个属性。它可以让我们对元素进行各种变形操作,例如平移、旋转、缩放、扭曲等等,同时它也支持 3D 移动和变形。 Transform 的使用 Transform 属性包括很多个子属性,常用的有 translate、rotate、scale、sk…

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