让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日

相关文章

  • Firefox返回时Iframe的显示Bug的解决方法

    问题描述: 在使用Firefox浏览器返回上一页时,页面中的Iframe可能不显示内容。这是由于Firefox浏览器的缓存机制,导致Iframe的内容没有被正确加载。这种问题在其他浏览器中并不常见。 解决方案: 解决这个问题的方法是在每次Iframe加载时,强制浏览器重新获取Iframe的内容。这可以通过向Iframe的URL添加随机参数来实现。当URL中的…

    JavaScript 2023年6月11日
    00
  • js实现网页防止被iframe框架嵌套及几种location.href的区别

    下面我将详细讲解”JS实现网页防止被iframe框架嵌套及几种location.href的区别”的完整攻略。 JS实现网页防止被iframe框架嵌套 在编写网页时,我们可能希望页面不能被嵌套在iframe框架中,以避免网页的被其他网站直接嵌套到其它站点的页面上,从而保证网站数据的安全性和用户体验。为了实现网页的防止被iframe框架嵌套,我们可以使用以下方法…

    JavaScript 2023年6月11日
    00
  • javascript demo 基本技巧

    首先,我们要了解何谓 JavaScript Demo,这其实是一种基于 JavaScript 语言开发的小型互动演示,它可以运行在浏览器端或 Node.js 等环境中,用于展示和演示某项特定功能或效果。 下面,我将分享一些 JavaScript Demo 开发的基本技巧,帮助大家更好地开发出功能强大且易维护的演示程序。 好的 JavaScript Demo …

    JavaScript 2023年5月27日
    00
  • Javascript核心读书有感之表达式和运算符

    Javascript核心读书有感之表达式和运算符攻略 表达式和运算符的基本概念 在Javascript中,表达式是由变量、常量、运算符和函数调用等元素组成的组合,用于计算一个值。而运算符则是表达式中完成具体计算的部分。 运算符的分类 Javascript中的运算符可以分为以下几类: 算术运算符 用于数值运算,包括加减乘除、取余等,如:+、-、*、/、%。 示…

    JavaScript 2023年6月11日
    00
  • jquery ajax post提交数据乱码

    下面是详细的攻略: 一、问题描述 当使用 jQuery 的 AJAX 功能来提交表单数据时,有时会出现提交的中文乱码的问题。问题表现为:在后台处理接收到的数据的时候,中文字符会被解析为乱码,这给我们的开发和调试带来了不必要的麻烦。 二、问题分析 出现该问题的原因是因为,提交数据时如果没有指定编码方式,浏览器会使用当前页面的默认编码方式,而当前页面的编码方式不…

    JavaScript 2023年5月19日
    00
  • Express框架req res对象使用详解

    下面是关于“Express框架req res对象使用详解”的完整攻略。 1. HTTP请求(req)对象 Express框架提供了一个request对象(通常缩写为 req),作为每个请求的入口点,它包含了HTTP请求的属性和方法。 1.1 请求路径 req.path属性可用于获取请求的路径,例如: app.get(‘/users/:id’, functio…

    JavaScript 2023年6月11日
    00
  • JSP入门教程之客户端验证、常用输出方式及JSTL基本用法

    JSP入门教程之客户端验证、常用输出方式及JSTL基本用法 客户端验证 在前端页面中,通过Javascript可以实现客户端的表单验证功能。一般来说,我们需要为表单的submit按钮绑定一个函数,通过该函数来实现表单的验证。下面是一个简单的JSP页面,其中输入框中的内容需要进行非空校验: <%@ page language="java&quo…

    JavaScript 2023年5月28日
    00
  • javascript中数组与对象的使用方法区别

    JavaScript 中数组和对象都是非常重要的数据类型,它们在编程中有着非常广泛和重要的应用。接下来,我将为您讲解 JavaScript 中数组与对象的使用方法区别,以及它们的应用。我将分以下三个部分详细讲解。 定义和声明 在JavaScript中,定义数组使用方括号[],例如: let arr = [1, 2, 3]; 而定义对象使用大括号{},例如: …

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