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日

相关文章

  • 基于jQuery实现的菜单切换效果

    下面是关于”基于jQuery实现的菜单切换效果”的详细攻略: 构建菜单 首先需要构建一个菜单的页面结构,通常使用HTML语言实现。比如以下例子: <div class="menu"> <ul> <li><a href="#" data-target=".page1&q…

    css 2023年6月11日
    00
  • css高度塌陷问题的解决方案

    CSS高度塌陷问题的解决方案 CSS高度塌陷(又称为Margin Collapse)是指在垂直方向上相邻的两个块级元素的外边距(margin)会发生重叠,导致两个元素的总外边距高度比单个元素的外边距高度要小。 出现高度塌陷问题的常见场景包括: 父元素包含多个子元素,其中至少一个子元素存在margin-top和父元素的边界重叠; 相邻的兄弟元素中,上一个元素的…

    css 2023年6月10日
    00
  • css background-position 用法详细图文介绍

    CSS background-position 用法详细图文介绍 什么是 background-position CSS 的 background-position 属性用于设置元素背景图像的起始位置。 默认情况下,背景图片从元素的左上角开始,然后向下和向右延伸,而 background-position 属性允许您更改该行为,从而影响背景图像占用的空间。 …

    css 2023年6月9日
    00
  • varnish 配置文件分享(sens杨 注释)

    下面是关于“varnish 配置文件分享(sens杨 注释)”的完整攻略。 1. 简介 Varnish是一种高性能HTTP反向代理缓存服务器,其设计目标是通过提高Web服务器的速度来显著提高网站的性能。Varnish的性能与配置文件的正确性和优化程度息息相关,因此,一个好的Varnish配置文件是基本保证,可以让Web服务器获得最佳性能。本篇攻略将分享sen…

    css 2023年6月9日
    00
  • 单击按钮显示隐藏子菜单经典案例

    单击按钮显示隐藏子菜单经典案例攻略 1. 简介 在网页设计中,隐藏式菜单已经不再是新鲜事物,无论是电商网站还是普通网站,都有隐藏式菜单的应用。本文将详细讲解如何设计一个单击按钮显示隐藏子菜单的经典案例,并提供两条示例说明。 2. 设计思路 本案例的设计思路是:通过单击按钮,切换控制子菜单的显示和隐藏。具体实现思路如下: 2.1 在页面中添加一个按钮,用于控制…

    css 2023年6月10日
    00
  • 利用css设置元素垂直居中的解决方法汇总

    下面我将详细讲解如何利用 CSS 设置元素垂直居中的解决方法汇总。 什么是垂直居中 在 CSS 中,垂直居中指的是将一个元素在垂直方向上居中对齐。垂直居中比较常用的场景包括父元素和子元素高度不一致、子元素固定高度等。 方法一:利用 flexbox 利用 Flexbox 布局可以非常简单地实现垂直居中。首先需要设定父元素的 display 属性为 flex,然…

    css 2023年6月10日
    00
  • 网络爬虫案例解析

    网络爬虫案例解析 网络爬虫是一种自动化获取互联网信息的技术,可以帮助我们从互联网上获取大量的有用信息。本文将详细讲解网络爬虫的完整攻略,包含以下步骤: 确定爬取目标 分析目标网站结构 编写网络爬虫程序 存储数据 反爬虫处理 确定爬取目标 在开始编写网络爬虫程序之前,需要确定爬取目标。可以选择一些常见的目标,比如新闻网站、电商平台、社交媒体等。也可以选择一些特…

    css 2023年6月9日
    00
  • 全面总结使用CSS实现水平垂直居中效果的方法

    全面总结使用CSS实现水平垂直居中效果的方法 实现一个元素在容器中水平垂直居中一直是前端开发过程中需要面对的一个难题,这里将总结一些常见的方法。 方法一:使用flex布局实现 flex布局可以很方便的实现一个元素在容器中居中,下面是实现水平垂直居中效果的代码: .container { display: flex; justify-content: cent…

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