vue3中web前端JS动画案例(一)

 上述案例主要使用定时器,和绝对定位产生动画

 

<script setup>
import { ref, onMounted, watch } from 'vue'
// ----------------------- 01 js 动画介绍---------------------
// 1、匀速运动
// 2、缓动运动(常见)
// 3、透明度运动
// 4、多物体运动
// 5、多值动画

// 6、自己的动画框架
// css3属性的transition 和 animation 可以实现运动

// ------------------------ 02 简单运动 ------------------------
// 简单动画存在问题:1、处理边界 2、定时器的管理
const dom = ref(null)
let num = ref(0)
let timer = null
const play = () => {
  // 先关闭定时器,再开启定时器,防止定时器累加,导致物体加快
  clearInterval(timer)
  // 让物体运动起来(定时器)
  timer = setInterval(() => {
    // num.value++
    // dom.value.style.left = num.value + 'px'
    if (dom.value.offsetLeft === 500) {
      // clearInterval(timer)
      dom.value.style.left = 0 + 'px'
      // return
    } else {
      dom.value.style.left = dom.value.offsetLeft + 5 + 'px'
    }

    // 使用return或者else 都可以
    // dom.value.style.left = dom.value.offsetLeft + 5 + 'px'
  }, 30);
}
const Pause = () => {
  clearInterval(timer)
}

// ----------------------- 03 侧边栏效果------------------
const boxDom = ref(null)
let isShow = ref(true)
const pull = () => {
  if (isShow.value) {
    isShow.value = false
  } else {
    isShow.value = true
  }
  boxDom.value.style.left = 0
}
const hide = () => {
  if (!isShow.value) {
    isShow.value = true
  } else {
    isShow.value = false
  }
  boxDom.value.style.left = -200 + 'px'
}

// 缓动动画 0 ~ 200 公式:加速度 = (结束值 - 起始值) / 缓动系数 加速度由慢到快
const boxDom1 = ref(null)
window.onload = () => {
  let target = 0
  let target1 = -200
  boxDom1.value.onmouseover = () => { showAimation(boxDom1.value, target) }
  boxDom1.value.onmouseout = () => { showAimation(boxDom1.value, target1) }

  // ----------------- 04 透明度动画 --------------------
  // 鼠标移入移出
  boxDom3.value.onmouseover = () => {
    opacityAnimation(boxDom3.value, 100)
  }
  boxDom3.value.onmouseout = () => {
    opacityAnimation(boxDom3.value, 30)
  }
}

// 缓动动画 0 ~ 200 公式:加速度 = (结束值 - 起始值) / 缓动系数 加速度由慢到快
let timer1 = null
const showAimation = (dom, end) => {
  clearInterval(timer1)
  timer1 = setInterval(() => {
    let speed = (end - dom.offsetLeft) / 10 // 如果速度大于0,向上取整,否则向下取整 
    speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed) // 判断是否到达目标点 
    if (dom.offsetLeft === end) {
      clearInterval(timer1)
      return
    }
    dom.style.left = dom.offsetLeft + speed + 'px'
  }, 30);
}

// 04 透明度动画
const boxDom3 = ref(null)
let alpha = 30
let speed = 0
let timer2 = null

const opacityAnimation = (dom, endAlpha) => {
  clearInterval(timer2)
  timer2 = setInterval(() => {
    // 求透明度的变化速度
    speed = endAlpha > alpha ? 5 : -5

    // 边界的处理
    if (alpha === endAlpha) {
      clearInterval(timer2)
      return
    }
    // 改变当前的alpha的值
    alpha += speed
    // 改变当前的透明度
    dom.style.opacity = alpha / 100
    dom.style.filter = 'alpha(opacity=' + alpha + ')'
  }, 30);
}

// 上下跳动循环播放
const circle = ref(null)
let timer3 = null
const circlePlay = () => {
  clearInterval(timer3)
  let direction = 1; // 初始方向:1 表示向下,-1 表示向上

  timer3 = setInterval(() => {
    if (circle.value.offsetTop > 100) {
      console.log(circle.value.offsetTop, '--circle.value.offsetTop--');
      direction = -1; // 到达底部,改变方向为向上
    } else if (circle.value.offsetTop <= 50) {
      direction = 1; // 到达顶部,改变方向为向下
    }
    // 根据方向调整移动方式
    circle.value.style.top = circle.value.offsetTop + (1 * direction) + 'px';
  }, 30);
}

const circlePause = () => {
  clearInterval(timer3)
}


onMounted(() => {
})
</script>

<template>
  <div class="main">
    <div class="card-body">
      <!-- 02 简单运动 -->
      <button id="btn" @click="play">Play</button>
      <button id="btn" @click="Pause">Pause</button>
      <div class="info" ref="dom">dom简单运动</div>
    </div>
    <!-- 03 侧边栏效果 -->
    <div id="box" ref="boxDom">
      box侧边栏效果 过渡动画
      <span @click="pull" v-if="isShow">拉开</span>
      <span @click="hide" v-if="!isShow">收起</span>
    </div>
    <!-- 03 侧边栏效果 缓动动画 -->
    <div id="box1" ref="boxDom1">
      box1侧边栏效果 缓动动画
      <span>拉开</span>
    </div>
    <div>
      <div style="display: flex;">
        <button id="btn" @click="circlePlay">Play</button>
        <button id="btn" @click="circlePause">Pause</button>
      </div>
      <!-- 上下循环跳动效果 -->
      <div id="box2">
        box2上下循环跳动效果
        <span ref="circle">跳</span>
      </div>
    </div>

    <!-- 04 透明度动画 -->
    <div id="box3" ref="boxDom3">
      box3透明度动画
    </div>
  </div>


</template>

<style scoped lang="less">
.main {
  display: flex;
  flex-direction: column;

  #btn {
    width: 80px;
    height: 40px;
    border: 1px solid #000;
    background-color: #829fff;
  }

  .card-body {
    position: relative;
    height: 240px;

    .info {
      position: absolute;
      left: 0;
      top: 40px;
      width: 200px;
      height: 200px;
      background-color: pink;
    }
  }

  // 03 侧边栏效果 过渡效果
  #box {
    position: relative;
    left: -200px;
    transition: all 0.3s; // 过渡效果
    width: 200px;
    height: 200px;
    background-color: rgb(255, 244, 150);

    span {
      position: absolute;
      right: -40px;
      top: 50%;
      transform: translateY(-50%);
      width: 40px;
      height: 60px;
      text-align: center;
      line-height: 60px;
      background-color: black;
      color: floralwhite;
      cursor: pointer;
    }
  }

  // 03 侧边栏效果 缓动动画
  #box1 {
    position: relative;
    left: -200px;
    width: 200px;
    height: 200px;
    background-color: rgb(150, 192, 255);

    span {
      position: absolute;
      right: -40px;
      top: 50%;
      transform: translateY(-50%);
      width: 40px;
      height: 60px;
      text-align: center;
      line-height: 60px;
      background-color: black;
      color: floralwhite;
      cursor: pointer;
    }
  }

  // 上下跳动动画
  #box2 {
    position: relative;
    width: 200px;
    height: 200px;
    background-color: rgb(150, 192, 255);

    span {
      position: absolute;
      left: 50%;
      top: 50%;
      transform: translate(-50%, -50%);
      width: 50px;
      height: 50px;
      border-radius: 50%;
      text-align: center;
      line-height: 50px;
      background-color: black;
      color: floralwhite;
      cursor: pointer;
    }
  }

  // 04 透明度动画
  #box3 {
    width: 200px;
    height: 200px;
    background-color: red;
    color: #fff;
    opacity: 0.3;
    // 支持ie8以下浏览器
    filter: alpha(opacity=30);
  }
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/554487.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

抖店底层逻辑,关于5个“为什么”的答案~

我是王路飞。 很多人对抖店的底层逻辑有一种抗拒心态&#xff0c;不想学习和了解。 认为做抖店不就是开店卖货嘛&#xff0c;什么火、什么有热度卖什么就好了&#xff0c;了解那么多“理论知识”有什么用呢&#xff1f; 但往往正是这些基础理论&#xff0c;底层逻辑&#xf…

Linux系统一键安装DataEase结合内网穿透实现公网访问本地WebUI界面

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

PMM2 MySQL监控管理工具

目录 1. PMM介绍 2. 安装PMM服务端 2.1 安装docker 2.1.1 下载docker 2.1.2 上传docker包 2.1.3 启动守护进程 2.1.4 查看docker状态 2.2 安装PMM 2.2.1 下载镜像 2.2.2 load镜像 2.2.3 查看镜像 2.2.4 创建容器 2.2.5 运行镜像 2.2.6 验证PMM服务器 2.2.7 删除…

MySQL行格式(row format)

MySQL行格式&#xff08;row format&#xff09; 表的行格式决定了其行的物理存储方式&#xff0c;这反过来又会影响查询和 DML 操作的性能。随着单个磁盘页面容纳更多行&#xff0c;查询和索引查找可以更快地工作&#xff0c;缓冲池中需要的高速缓存内存更少&#xff0c;写出…

【进阶六】Python实现SDVRPTW常见求解算法——离散粒子群算法(DPSO)

基于python语言&#xff0c;采用经典离散粒子群算法&#xff08;DPSO&#xff09;对 带硬时间窗的需求拆分车辆路径规划问题&#xff08;SDVRPTW&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整2.1 需求拆分2.2 需求拆分后的服务时长取值问题 3. 求解结果4. …

.netcore+vue新生分班系统的设计与实现

.netcore vue新生分班系统的设计与实现说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于.net core架构和mysql数据库vue 东北石油大学新生分班系统的设计与实现 功能模块&#xff1a; 登录 注册学生 忘记密码 系统首顶 个…

fatal error C1001: An internal error has occurred in the compiler

VS2008驱动项目A&#xff0c;集成一个Wzarid生成的驱动LIB项目B&#xff0c;在编译64位驱动时,出现以下错误&#xff1a; 1>------ Build started: Project: xxxx, Configuration: Release x64 ------ 1>Linking... 1>fatal error C1001: An internal error has occu…

AI时代下,普通人能怎么做?

AI玩法千千万&#xff0c;你已经知道了多少呢&#xff1f;是否已经实践起来&#xff1f; 大家好&#xff0c;我是程序员影子 | 全网同名 一名致力于帮助更多朋友快速入门编程的程序猿 今天&#xff0c;我将以小白入门的视角带着大家了解一下目前火热的AI实践玩法&#xff1b…

SQL --索引

索引 INDEX 伪列 伪装起来的列&#xff0c;不容易被看见&#xff0c;要特意查询才能看见 ROWNUM&#xff1a; 是对查询结果自动生成的一组连续的自然数序号。 SELECT emp.*,ROWNUM FROM emp例题&#xff1a;查询emp表中&#xff0c;前三个员工 SELECT * FROM * from emp w…

工业控制(ICS)---MMS

MMS 工控领域的TCP协议&#xff0c;有时wireshark会将response包解析为tcp协议&#xff0c;影响做题&#xff0c;如果筛选mms时出现连续request包&#xff0c;考虑wireshark解析错误&#xff0c;将筛选条件删除手动看一下 initiate&#xff08;可以理解为握手&#xff09; i…

QQ浏览器模仿Arc,推垂直工作栏引领新体验潮流|TodayAI

之前在硅谷大受欢迎的AI浏览器Arc一经推出就立即引起了广泛关注&#xff0c;Arc自称不仅仅是一款浏览器&#xff0c;而且还是一个“与互联网同规模的平台”。如今&#xff0c;中国的QQ浏览器也想借Arc的热潮之势&#xff0c;同样采用了类似Arc的垂直工作栏&#xff0c;声称能够…

【总结】jdk安装配置后,执行报错java: error while loading shared libraries: libjli.so

目录 问题现象排查分析解决方法 问题现象 安装jdk后&#xff0c;配置好了环境变量&#xff0c;但执行java -vesion命令时&#xff0c;报错。 java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory 看起来这个…

就业分析丨云计算数通双认证学员,入职海外年薪50W

扫码联系誉天猎头部&#xff0c;可享高薪岗位内推、职业规划岗前测评等服务 誉天&#xff0c;我的职业启航之地 大家好&#xff0c;我是誉天学员万*,回想起那段为梦想而奋斗的日子&#xff0c;我的心中充满了感慨。誉天在行业内一直深受好评&#xff0c;在我心中播下了技能的种…

14.多态(多态的构成条件、虚函数的重写、抽象类也就是纯虚函数的类、虚函数表、单继承和多继承的虚函数表)

1.多态的概念 ​ 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 举个例子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&#xff1b;…

java动态代理--JDK代理

1.概述 JDK动态代理&#xff1a;只能代理实现了接口的类&#xff0c;代理对象是实现了目标对象所有接口的代理类 使用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来创建代理对象&#xff0c;工作通过反射机制完成。 2.实现接口InvocationHandler …

目标检测——防护装备数据集

一、重要性及意义 防护装备中的头盔和背心检测具有至关重要的重要性和深远的意义&#xff0c;主要体现在以下几个方面&#xff1a; 首先&#xff0c;它们对于保护工作人员的人身安全起着至关重要的作用。在各类工作环境中&#xff0c;尤其是那些涉及高空作业、机械操作或交通…

windows10 VS2017 grpc1.48.0环境配置

本文介绍在Windows10 下使用Visual Studio 2017编译gRPC 1.48.0并配置开发环境&#xff0c;以及开发、配置一个简单的c服务端以及客户端。&#xff08;过程令人头疼&#xff0c;参阅了大量博客&#xff0c;实际操作都存在问题&#xff0c;整理一下&#xff0c;希望对后来者有帮…

每日一练

这是一道牛客的dd爱框框的题 题目解析: 就是求大于x的最短子序列 我的思路:是滑动窗口 public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextInt()) { // 注意 while 处理多个 caseint n in.…

基于springboot实现信息化在线教学平台设计【项目源码+论文说明】计算机毕业设计

基于springboot实现信息化在线教学平台设计演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了信息化在线教学平台的开发全过程。通过分析信息化在线教学平台管理的不足&#xff0c;创建了一个计算机管理信息…

时序分解 | Matlab实现TVF-EMD时变滤波器的经验模态分解信号分量可视化

时序分解 | Matlab实现TVF-EMD时变滤波器的经验模态分解信号分量可视化 目录 时序分解 | Matlab实现TVF-EMD时变滤波器的经验模态分解信号分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现TVF-EMD(时变滤波器的经验模态分解)可直接替换 Matlab语言 1.…