让div运动起来 js实现缓动效果

yizhihongxing

让div运动起来并实现缓动效果是Web开发中常见的需求之一。JS可以实现动态控制DOM节点的属性值,通过操作CSS属性的变化来实现节点的平移、缩放、旋转等动画效果,同时还可以结合缓动算法,使得CSS属性的变化更加平滑、自然。以下是一些实现div缓动效果的攻略和示例:

1.缓动算法介绍

在实现缓动效果时,使用缓动算法可以让CSS属性的变化更加自然、平缓,提升动画的质量和用户体验。缓动算法是指根据某个物体的移动距离和时间差,计算出合适的加速度来使物体的移动呈现出渐变性。

例如,我们常用的Tween.js库中封装了多个缓动算法,如线性缓动、二次缓动、三次缓动、四次缓动、正弦缓动、指数缓动等。不同的缓动算法可以满足不同的需求,选择合适的缓动算法可以让动效更加符合人类行为规律,视觉效果更佳。

2.实现缓动动画的核心代码

在实现缓动动画时,我们需要做到以下几点:

  • 获取节点初始位置、目标位置
  • 计算出节点应该移动的距离和时间差
  • 基于缓动算法,根据时间比例计算出当前的加速度值
  • 更新节点的CSS属性,实现动画效果

核心代码如下所示:

//获取节点样式
function getStyle(node,styleName) { 
    var styleValue="";
    if(node.style[styleName]){
        styleValue=node.style[styleName];
    }else if(node.currentStyle){ 
        styleValue=node.currentStyle[styleName];
    }else if(document.defaultView && document.defaultView.getComputedStyle){
        styleName=styleName.replace(/([A-Z])/g,'-$1');
        styleName=styleName.toLowerCase();
        var nodeList=document.defaultView.getComputedStyle(node,null);
        if(nodeList){
            styleValue=nodeList.getPropertyValue(styleName);
        }
    }
    return styleValue;
}

//缓动函数,返回当前时间下应移动的距离
function easeIn(startPos,endPos,t,duration) {
    var dis=endPos-startPos;
    return dis*(t/duration)*t+startPos;  //缓动算法的实现
}

//更新节点的CSS属性
function render(node,attr,value) {
    node.style[attr]=value+"px";
}

//缓动动画的实现
function animate(node,attr,endPos,duration) { 
    clearInterval(node.timer);
    var startPos=parseInt(getStyle(node,attr));
    var t=0;
    node.timer=setInterval(function() {
        t+=50;
        if(t>=duration){
            t=duration;
            clearInterval(node.timer);
        }
        var currentValue=easeIn(startPos,endPos,t,duration);
        render(node,attr,currentValue);
    },50);
}

3.示例一:应用缓动算法实现图片轮播动画

我们可以通过缓动算法实现图片轮播的动画效果,下面是示例代码:

<style>
    #wrap {
        position: relative;
        height: 200px;
        overflow: hidden;
    }
    #imgList {
        position: absolute;
        width: 1500px;
        height: 200px;
        left: 0;
        top: 0;
    }
    #imgList img {
        width: 500px;
        height: 200px;
        float: left;
    }
    #prevBtn, #nextBtn {
        position: absolute;
        width: 50px;
        height: 50px;
        background-color: white;
        top: 75px;
        opacity: 0.7;
        z-index: 999;
        cursor: pointer;
    }
    #prevBtn:hover, #nextBtn:hover {
        opacity: 1;
        background-color: yellow;
    }
    #prevBtn {
        left: 0;
    }
    #nextBtn {
        right: 0;
    }
</style>
<div id="wrap">
    <div id="imgList">
        <img src="./images/0.jpg" alt="0">
        <img src="./images/1.jpg" alt="1">
        <img src="./images/2.jpg" alt="2">
        <img src="./images/3.jpg" alt="3">
        <img src="./images/4.jpg" alt="4">
    </div>
    <div id="prevBtn">&lt;</div>
    <div id="nextBtn">&gt;</div>
</div>
<script>
    var wrap=document.getElementById("wrap");
    var imgList=document.getElementById("imgList");
    var prevBtn=document.getElementById("prevBtn");
    var nextBtn=document.getElementById("nextBtn");
    var currentIndex=0;
    var imgWidth=500;
    var duration=500;
    var easingFunction=TWEEN.Easing.Quadratic.Out; //缓动函数
    prevBtn.onclick=function() {
        currentIndex--;
        if(currentIndex<0){
            currentIndex=4;
            imgList.style.left=-2500; //循环轮播
        }
        var targetPos=-currentIndex*500;
        animate(imgList,"left",targetPos,duration,easingFunction);
    };
    nextBtn.onclick=function() {
        currentIndex++;
        if(currentIndex>4){
            currentIndex=0;
            imgList.style.left=0; //循环轮播
        }
        var targetPos=-currentIndex*500;
        animate(imgList,"left",targetPos,duration,easingFunction);
    };
</script>

4.示例二:应用缓动算法实现音量控制动画

我们可以通过缓动算法实现音量控制的动画效果,下面是示例代码:

<style>
    #volumeSlider {
        position: relative;
        width: 200px;
        height: 10px;
        background-color: gray;
        cursor: pointer;
    }
    #volumeSlider #thumb {
        position: absolute;
        width: 20px;
        height: 20px;
        background-color: white;
        border-radius: 50%;
        top: -5px;
        left: 0;
    }
</style>
<div id="volumeSlider">
    <div id="thumb"></div>
</div>
<script>
    var volumeSlider=document.getElementById("volumeSlider");
    var thumb=document.getElementById("thumb");
    var startPos=0; //初始值为0
    var endPos=180; //最大值为180
    var duration=500;
    var easingFunction=TWEEN.Easing.Quadratic.Out; //缓动函数
    var currentValue=startPos;
    thumb.onmousedown=function(event) { //添加鼠标按下事件
        var startX=event.clientX;
        var left=parseInt(getStyle(thumb,"left"));
        var current=target=startX-left;
        var dis=endPos-startPos;
        document.onmousemove=function(event) { //添加鼠标移动事件
            current=event.clientX-startX;
            target=startX-left+current;
            if(target<0){
                target=0; //防止拖出范围
            }
            if(target>180){
                target=180; //防止拖出范围
            }
            currentValue=easeIn(startPos,endPos,target,duration); //根据时间比例计算出当前的加速度值
            render(thumb,"left",currentValue); //更新节点的CSS属性
            event.preventDefault();
        };
        document.onmouseup=function() { //添加鼠标抬起事件
            document.onmousemove=null;
            document.onmouseup=null;
        };
    };
</script>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:让div运动起来 js实现缓动效果 - Python技术站

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

相关文章

  • js中的面向对象之对象常见创建方法详解

    JS中的面向对象之对象常见创建方法详解 1. 对象字面量 对象字面量是创建对象的一种简单方法,它是用一对花括号{}括起来的数据结构,其中包含一个或多个属性和属性值,属性名和属性值用冒号:”分隔,多个属性之间用逗号,`分隔。 示例代码: let student = { name: ‘Tom’, age: 20, gender: ‘male’, sayHi: f…

    JavaScript 2023年5月27日
    00
  • JavaScript中运算符与数组扩展详细讲解

    JavaScript中运算符与数组扩展详细讲解 运算符 1. 条件三元运算符(? :) 条件三元运算符可以看作是if语句的简化版,它的语法结构为:条件表达式 ? 表达式1 : 表达式2。- 如果条件表达式的结果为true,那么返回值为表达式1;- 如果条件表达式的结果为false,那么返回值为表达式2。 示例代码: function checkAge(age…

    JavaScript 2023年5月18日
    00
  • js中关于new Object时传参的一些细节分析

    JS中通过new Object()方式创建对象时,可以传入一个参数来初始化对象属性。本文将介绍new Object()时传入参数的一些细节。 1. new Object()传入一个空对象 当new Object()传入一个空对象时,返回的对象与直接使用对象字面量创建对象的效果一样。 const obj1 = new Object({}); const obj…

    JavaScript 2023年6月10日
    00
  • javascript事件绑定学习要点

    当我们需要对网页中的某些元素进行交互操作时,Javascript 中常用的方法是事件绑定。下面是学习 Javascript 事件绑定时需要掌握的要点: 1. 什么是事件绑定? 事件绑定(Event binding) 是指为特定的事件类型和元素绑定一个事件处理器,当特定事件在特定元素上发生时,事件处理器会被自动调用。 2. 事件绑定的方法 Javascript…

    JavaScript 2023年6月10日
    00
  • javascript 跨浏览器开发经验总结(五) js 事件

    JavaScript 跨浏览器开发经验总结(五)JS 事件 简介 JavaScript 事件是 Web 开发中最常见的技术之一。通过事件,Web 应用程序可以在文档中生成动态交互效果。但是,Web 浏览器之间的事件处理存在很多差异,因此需要跨浏览器开发经验。 本文将提供有关 JavaScript 事件的跨浏览器开发经验,以帮助您优化 Web 应用程序的性能并…

    JavaScript 2023年5月18日
    00
  • 初步了解javascript面向对象

    当初步了解 JavaScript 面向对象时,可以按照以下步骤进行: 1. 理解对象的概念及创建对象的基本方法 在 JavaScript 中,对象是指一组属性的集合,属性可以是简单的值、函数和其他属性等。 创建对象有多种方法,可以使用对象字面量、构造函数、Object.create() 等方式,具体可以参考下面的示例: 对象字面量 使用对象字面量创建对象,可…

    JavaScript 2023年5月27日
    00
  • jquery validate和jquery form 插件组合实现验证表单后AJAX提交

    下面我将为您详细讲解如何使用jquery validate和jquery form插件完成验证表单后的AJAX提交。 步骤一:引入jQuery及相关插件 首先,在页面中引入jQuery和相关插件文件,这里需要演示的插件是jquery validate和jquery form,引用代码如下: <script src="https://code.…

    JavaScript 2023年6月10日
    00
  • 前端代码安全与混淆

    作者:京东零售 周明亮 一、友商网页分析 1.1 亚马逊 亚马逊商详地址:https://www.amazon.com/OtterBox-Commuter-Case-iPhone-Packaging 所有交互事件在页面初始化时,不进行下发,等待通过 js 请求后下发 具体点击事件js内容 采用自执行方式,防止代码格式化。【无法调用 Chrome 自带的代码格…

    JavaScript 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部