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

让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基于Location实现访问Url、重定向及刷新页面的方法分析

    让我详细讲解一下 “JS基于Location实现访问Url、重定向及刷新页面的方法分析” 的完整攻略。 什么是 Location 对象? Location 对象代表了当前窗口中当前文档的URL,还提供了与URL相关的信息和一些导航功能。它是window对象下的属性,所以可以通过 window.location 或者 location 来访问。 访问URL 获…

    JavaScript 2023年5月28日
    00
  • JavaScript将字符串转换为整数的方法

    JavaScript中将字符串转换成整数的方法有多种,以下是其中的四种方法。 1. parseFloat方法 parseFloat方法将字符串解析成浮点数,如果字符串开头部分可以解析成浮点数的话,就返回该浮点数,否则返回NaN。 let str = "1234.567"; let num = parseFloat(str); consol…

    JavaScript 2023年5月28日
    00
  • javascript中href和replace的比较(详解)

    JavaScript中href和replace的比较(详解) 在JavaScript中,href和replace方法都可以用来改变当前页面的URL地址,但它们有着不同的用法和效果。本文将详细介绍这两种方法的差异并提供相关示例,以帮助读者更好地理解。 href方法 使用href方法可以通过在当前窗口中打开新的URL地址。该操作会导致当前页面的所有状态丢失,包括…

    JavaScript 2023年6月11日
    00
  • 动态读取JSON解析键值对的方法

    我来详细讲解“动态读取JSON解析键值对的方法”的完整攻略,具体分为以下几个步骤: 1. 获取JSON数据 首先,需要获取JSON数据,可以通过HTTP请求来获取。例如,使用JavaScript中的fetch方法进行请求,代码如下: fetch(‘https://example.com/data.json’) .then(response => res…

    JavaScript 2023年5月27日
    00
  • JS判断指定dom元素是否在屏幕内的方法实例

    JS判断指定dom元素是否在屏幕内的方法实例可以通过以下步骤来完成: 1. 获取屏幕高度和滚动距离 使用window.innerHeight属性获取屏幕高度,使用window.scrollY属性获取页面滚动的距离,代码如下: const screenHeight = window.innerHeight; const scrollDistance = win…

    JavaScript 2023年6月10日
    00
  • 简单介绍JavaScript中字符串创建的基本方法

    来详细讲解一下JavaScript中字符串创建的基本方法。 字符串创建的基本方法 在JavaScript中,我们可以使用以下三种方式来创建字符串: 1. 直接量方式 使用直接量方式,也就是直接在代码中给出字符串的值,可以通过以下三种方式创建字符串: 单引号方式 let str1 = ‘这是一个字符串。’; 双引号方式 let str2 = "这也是…

    JavaScript 2023年5月28日
    00
  • javascript学习笔记(八)正则表达式

    JavaScript学习笔记(八)正则表达式 什么是正则表达式? 正则表达式是一种高级的文本匹配工具,它允许您通过定制化的模式来识别文本中的特定字符和模式。使用正则表达式可以快速,简单地从大量的文本或数据中提取信息,这是数据分析、数据挖掘等领域中必备的技能。 正则表达式语法 正则表达式是由文本字符和特殊字符构成的文本模式。下面是一些基本的正则表达式语法: ^…

    JavaScript 2023年5月19日
    00
  • JavaScript调用客户端的可执行文件(示例代码)

    在JavaScript中可以使用一些特殊的API来操作客户端的可执行文件,这些API被称作Web API。其中有一个重要的API就是利用浏览器的插件对象来运行客户端的可执行文件。下面给出基于Chrome浏览器和IE浏览器的实现方式。 Chrome浏览器操作客户端的可执行文件 1. 首先需要编写一个简单的插件 插件的主要功能就是用于连接客户端与浏览器,使得浏览…

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