基于CSS3、原生JS、Vue3.0技术各自实现序列帧动画效果

简介: 这篇文章展示了如何使用纯CSS3、原生JavaScript以及Vue 3.0技术来实现序列帧动画效果,并通过代码示例和动画效果展示了每种方法的实现过程和最终效果。

还记得序列帧技术在2018年的时候很火的,那时做H5很吃香的...

那么在此记录一下用纯CSS3、原生JS、Vue3.0,这3种方式来设计几个例子。需要自己去找一下雪碧图哦,比如阿里云、腾讯云官网有很多雪碧图的~

1、使用纯CSS3方式实现

<template>
  <div class="machine">
    <div class="machine-box" :class="sign ? 'machine-running' : ''" @click="handleMachineRunningClick">
    </div>
  </div>
</template>

<script>
import {
   
    ref } from 'vue';

export default {
   
   
  name: 'machineComponent',
  setup() {
   
   

    let sign = ref(false);

    function handleMachineRunningClick() {
   
   
      sign.value = true;
    }

    return {
   
   sign, handleMachineRunningClick}
  }
}
</script>

<style scoped>
  .machine {
   
   
    width: 250px;
    height: 250px;
    margin: 100px auto 0 auto;
    border-radius: 250px;
    box-shadow: 0px 0px 5px #888;
  }

  .machine .machine-box {
   
   
    width: 64px;
    height: 64px;
    margin: 0 auto;
    cursor: pointer;
    background-position: 0 0;
    background-size: 100%;
    transform: translateY(93px);
    background-image: url('./machine.png');
  }

  .machine .machine-running {
   
   
    animation: startingRun 1s steps(1, start) infinite;
  }
</style>

<style>
  @keyframes startingRun {
   
   
    0% {
   
   
      background-position: 0 64px;
    }
    5% {
   
   
      background-position: 0 128px;
    }
    10% {
   
   
      background-position: 0 192px;
    }
    15% {
   
   
      background-position: 0 256px;
    }
    20% {
   
   
      background-position: 0 320px;
    }
    25% {
   
   
      background-position: 0 384px;
    }
    30% {
   
   
      background-position: 0 448px;
    }
    35% {
   
   
      background-position: 0 512px;
    }
    40% {
   
   
      background-position: 0 576px;
    }
    45% {
   
   
      background-position: 0 640px;
    }
    50% {
   
   
      background-position: 0 704px;
    }
    55% {
   
   
      background-position: 0 768px;
    }
    60% {
   
   
      background-position: 0 768px;
    }
    65% {
   
   
      background-position: 0 832px;
    }
    70% {
   
   
      background-position: 0 896px;
    }
    75% {
   
   
      background-position: 0 960px;
    }
    80% {
   
   
      background-position: 0 1024px;
    }
    85% {
   
   
      background-position: 0 1088px;
    }
    90% {
   
   
      background-position: 0 1152px;
    }
    95% {
   
   
      background-position: 0 1216px;
    }
    100%{
   
   
      background-position: 0 1280px;
    }
  }
</style>

效果:~

2、使用原生JS方式实现(在阿里云官网右键JS源码找到的^^)

<!DOCTYPE html>
<html>
<head>
    <title>使用原生JS方式实现序列帧动画</title>
    <style type="text/css">
          .machine {
    
    
            width: 250px;
            height: 250px;
            margin: 100px auto 0 auto;
            border-radius: 250px;
            box-shadow: 0px 0px 5px #888;
          }

        .machine .machine-box {
    
    
            width: 64px;
            height: 64px;
            margin: 0 auto;
            cursor: pointer;
            background-position: 0 0;
            background-size: 100%;
            transform: translateY(93px);
            background-image: url('./player.png');
        }
    </style>
</head>

<body>
    <div class="machine">
        <div class="machine-box"></div>
    </div>
</body>

<script type="text/javascript">

    let count = 0;
    let enterTimer;
    let leaveTimer;

    var o = document.getElementsByClassName("machine-box")[0];

    o.onmouseover = function() {
    
    
          clearInterval(leaveTimer),
          enterTimer = setInterval(function() {
    
    
        if (count < 20 && 64 * count < 1344) {
    
    
              count++;
              document.getElementsByClassName("machine-box")[0].style.backgroundPositionY = -64 * count + "px";
        } else {
    
    
              clearInterval(enterTimer)
        }
      }, 30);
    };

    o.onmouseout = function() {
    
    
          clearInterval(enterTimer),
          leaveTimer = setInterval(function() {
    
    
        if (count > 0 && 64 * count > 0) {
    
    
              count--;
              document.getElementsByClassName("machine-box")[0].style.backgroundPositionY = -64 * count + "px"
        } else {
    
    
              clearInterval(leaveTimer)
        }
      }, 30);
    };
</script>
</html>

效果:~

3、使用Vue3.0方式实现

<template>
  <div class="machine">
    <span>{
   
   {
   
    offsetHeight }}</span>
    <div
      class="machine-box"
      :style="'background-position: 0 ' + offsetHeight + 'px'"
      @mouseenter.stop.prevent="handleMouseEnter"
      @mouseleave.stop.prevent="handleMouseLeave">
    </div>
  </div>
</template>

<script>
import {
   
    ref } from 'vue';

export default {
   
   
  name: 'machineComponent',
  setup() {
   
   
    // 响应式设置偏移高度初始化为0
    let offsetHeight = ref(0);

    // 运算符初始化为加号,因为开始时的偏移高度为0,只能增加
    let operator = 'add';

    // 鼠标进入事件定时器
    let enterTimer;

    // 鼠标离开事件定时器
    let leaveTimer;

    /**
     * 增加背景图片的偏移高度
     */
    function loopComputeOffsetHeight() {
   
   
      if (operator == 'add') {
   
   
        offsetHeight.value += 64;
        if (offsetHeight.value >= 1344) {
   
   
          operator = 'reduce';
        }
      } else {
   
   
        if (offsetHeight.value > 0) {
   
   
          offsetHeight.value -= 64;
          if (offsetHeight.value <= 0) {
   
   
            operator = 'add';
          }
        }
      }
      console.log(operator, offsetHeight.value);
    }

    /**
     * 减少背景图片的偏移高度
     */
    function reduceOffsetHeight() {
   
   
      if (offsetHeight.value > 0) {
   
   
        offsetHeight.value -= 64;
        if (offsetHeight.value <= 0) {
   
   
          clearInterval(leaveTimer)
          operator = 'add';
        }
        console.log(offsetHeight.value);
      }
    }

    /**
     * 鼠标进入事件
     */
    function handleMouseEnter() {
   
   
      clearInterval(leaveTimer);
      enterTimer = setInterval(loopComputeOffsetHeight, 50);
    }

    /**
     * 鼠标离开事件
     */
    function handleMouseLeave() {
   
   
      clearInterval(enterTimer);
      leaveTimer = setInterval(reduceOffsetHeight, 50);
    }

    return {
   
   offsetHeight, handleMouseEnter, handleMouseLeave}
  }
}
</script>

<style scoped>
  .machine {
   
   
    width: 250px;
    height: 250px;
    position: relative;
    text-align: center;
    margin: 100px auto 0 auto;
    border-radius: 250px;
    box-shadow: 0px 0px 5px #ddd;
  }

  .machine span {
   
   
    position: absolute;
    position: absolute;
    margin: auto;
    left: 0;
    right: 0;
    top: 50px;
    bottom: auto;
  }

  .machine .machine-box {
   
   
    width: 64px;
    height: 64px;
    margin: 0 auto;
    background-position: 0 0;
    background-size: 100%;
    transform: translateY(93px);
    background-image: url('./machine.png');
    cursor: pointer;
  }
</style>

效果:~

目录
相关文章
|
前端开发 JavaScript
CSS 过渡和动画
CSS过渡和动画是用于为网页元素添加动态效果的两种重要技术
791 143
|
自然语言处理 前端开发 JavaScript
用 通义灵码 一键生成“水波纹按钮”,连 CSS 动画都不用自己写了!
通义灵码是一款智能编程辅助工具,它可以根据自然语言指令自动生成高质量的代码。例如,只需输入“生成一个按钮,点击时带水波纹动画,模拟 Material Ripple 效果”,它就能生成具备完整交互逻辑、CSS 动画和良好性能的按钮组件。不仅如此,它还支持拓展功能,如长按触发提示、添加图标等,并能自动优化样式适配不同场景。通过通义灵码,开发者可以大幅提升效率,专注于创意实现,而不必纠结于繁琐的代码细节。
|
JavaScript 前端开发 IDE
TypeScript vs. JavaScript:技术对比与核心差异解析
TypeScript 作为 JavaScript 的超集,通过静态类型系统、编译时错误检测和强大的工具链支持,显著提升代码质量与可维护性,尤其适用于中大型项目和团队协作。相较之下,JavaScript 更灵活,适合快速原型开发。本文从类型系统、错误检测、工具支持等多维度对比两者差异,并提供技术选型建议,助力开发者合理选择。
1864 1
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
Animation属性 css3为Animation动画提供的几个属性如下: 属性名 属性值 animation-name 指定动画名称,该属性指定一个已有的关键帧定义。 animation-duration 指定动画持续时间。 animation-timing-funtion 指定动画变化速度。 animation-delay 指定动画延迟多长时间才开始执行。 animation-iteration-count 指定动画的循环执行次数。 animation:这是一个复合属性。
712 3
|
监控 JavaScript 前端开发
JavaScript加密与解密技术:Hook技术应用案例分析
以上案例展示了如何利用JavaScript Hook技术结合强大且广泛采纳标准化算法(如AES),无缝地集成进Web应用程序以增强通信安全性。此种方法不仅能够确保敏感信息得到有效保护,并且由于它们操作适度透明、无需重构已存在代码基础架构而具备较高实际可行性及易操作性。
464 11
|
存储 前端开发 JavaScript
仿真银行app下载安装, 银行卡虚拟余额制作app,用html+css+js实现逼真娱乐工具
这是一个简单的银行账户模拟器项目,用于学习前端开发基础。用户可进行存款、取款操作,所有数据存储于浏览器内存中
|
监控 算法 JavaScript
基于 JavaScript 图算法的局域网网络访问控制模型构建及局域网禁止上网软件的技术实现路径研究
本文探讨局域网网络访问控制软件的技术框架,将其核心功能映射为图论模型,通过节点与边表示终端设备及访问关系。以JavaScript实现DFS算法,模拟访问权限判断,优化动态策略更新与多层级访问控制。结合流量监控数据,提升网络安全响应能力,为企业自主研发提供理论支持,推动智能化演进,助力数字化管理。
419 4
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
835 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
css3 svg制作404页面动画效果HTML源码
css3 svg制作404页面动画效果HTML源码
378 34
html+js+css实现的建筑方块立体数字时钟源码
html+js+css实现的建筑方块立体数字时钟源码
794 33

热门文章

最新文章

  • 1
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    712
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    568
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    574
  • 4
    (CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
    346
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    662
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    841
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    1646
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    396
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    1361
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    672