基于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>

效果:~

目录
相关文章
|
10天前
|
JavaScript 前端开发 中间件
探索后端技术:Node.js与Express框架的完美融合
【10月更文挑战第7天】 在当今数字化时代,Web应用已成为日常生活不可或缺的一部分。本文将深入探讨后端技术的两大重要角色——Node.js和Express框架,分析它们如何通过其独特的特性和优势,为现代Web开发提供强大支持。我们将从Node.js的非阻塞I/O和事件驱动机制,到Express框架的简洁路由和中间件特性,全面解析它们的工作原理及应用场景。此外,本文还将分享一些实际开发中的小技巧,帮助你更有效地利用这些技术构建高效、可扩展的Web应用。无论你是刚入门的新手,还是经验丰富的开发者,相信这篇文章都能为你带来新的启发和思考。
|
11天前
|
JavaScript 前端开发 API
探索后端技术:Node.js的优势和实际应用
【10月更文挑战第6天】 在当今数字化时代,后端开发是任何成功软件应用的关键组成部分。本文将深入探讨一种流行的后端技术——Node.js,通过分析其核心优势和实际应用案例,揭示其在现代软件开发中的重要性和潜力。
48 2
|
18天前
|
机器学习/深度学习 前端开发 JavaScript
|
22小时前
|
前端开发 JavaScript 安全
JavaScript前端开发技术
JavaScript(简称JS)是一种广泛使用的脚本语言,特别在前端开发领域,它几乎成为了网页开发的标配。从简单的表单验证到复杂的单页应用(SPA),JavaScript都扮演着不可或缺的角色。
10 3
|
4天前
|
前端开发 JavaScript API
探索 CSS Houdini:轻松构建酷炫的 3D 卡片翻转动画
本文通过构建一个 3D 翻卡动画深入探讨了 CSS Houdini 的强大功能,展示了如何通过 Worklets、自定义属性、Paint API 等扩展 CSS 的能力,实现高度灵活的动画效果。文章首先介绍了 Houdini 的核心概念与 API,并通过构建一个动态星空背景、圆形进度条以及交互式 3D 翻卡动画的实际示例,展示了如何利用 CSS Houdini 赋予网页设计更多创造力。最后,还演示了如何将这种 3D 翻卡效果集成到公司网站中,提升用户体验。CSS Houdini 的创新能力为网页设计带来了前所未有的灵活性,推动了前端开发迈向新的高度。
12 0
探索 CSS Houdini:轻松构建酷炫的 3D 卡片翻转动画
|
17天前
|
缓存 前端开发 JavaScript
探索JavaScript的现代前端技术:从基础到进阶
探索JavaScript的现代前端技术:从基础到进阶
29 1
|
6天前
|
前端开发 开发者 UED
CSS不同技术的探讨
【10月更文挑战第11天】 CSS不同技术的探讨
|
6天前
|
存储 前端开发 JavaScript
CSS:现代Web设计的不同技术
【10月更文挑战第11天】 CSS:现代Web设计的不同技术
|
6天前
|
前端开发 开发者 UED
CSS技术的演变与应用
【10月更文挑战第11天】CSS技术的演变与应用
|
1月前
|
前端开发 数据可视化 开发者
D3.js 内置的动画函数
D3.js 内置的动画函数