JS 引导动画

前言

引导动画是程序在某一时刻播放的动画,通常用于向用户介绍程序的功能和特点。

实现效果

在这里插入图片描述

实现方式

引导动画的实现方式有很多种,这里我使用的是 CSS 的 clip-path 属性。

技术选型

这里我为什么要选择 clip-path 属性而不是 mask 属性呢?因为我试了下 mask 好像只能在上层加个半透明背景,虽然它可以通过 CSS 的渐变实现绘制出某个元素的位置上方的背景为透明色,但是这个背景仍然是全屏覆盖的,还是会遮挡下方元素的点击等操作。
后来我试了下将下方被遮挡的元素完全复制到背景上方,这样就能实现元素不被遮挡的效果了,但是点击等事件并不能复制过来,所以最后我选择了 clip-path 属性。

从背景中抠出一块矩形区域的 CSS 代码如下:

mask: {
    display: none,
    transition: all 1s,
    width: 100vw,
    height: 100vh,
    background: rgba(0, 0, 0, 0.5),
    position: absolute,
    top: 0,
    left: 0,
    clipPath: polygon(0% 0%, 0% 100%, 200px /* x坐标的最小值 */ 100%,
        200px 100px, /* 左上角坐标 */
        400px 100px, /* 右上角坐标 */
        400px 200px, /* 右下角坐标 */
        200px 200px, /* 左下角坐标 */
    200px /* x坐标的最小值 */ 100%, 100% 100%, 100% 0%),
}

实现步骤

  1. js 创建创建背景层和提示文字层,并赋予样式
  2. js 动态计算每一步骤的坐标,并更新背景层的样式
  3. js 监听每一步骤的点击事件,并更新背景层的样式
  4. js 监听每一步骤的动画结束事件,并更新背景层的样式,跳转到下一步骤,并播放下一步骤的动画,最后隐藏背景层及提示文字层

技术难点

因为 img 元素是异步加载的,所以需要异步等待 img 元素加载完成后再进行计算,所以我将 img 的 onload 事件封装成了异步函数,并使用 await 来同步操作,但这样的话在外层也需要使用 await 来进行等待。所以我使用了执行器队列来解决这一问题。即在外部调用某个函数时将该函数放入队列中,最后使用循环来依次按先后顺序执行队列中的函数。

安装及使用

npm i guide-anime

这样在使用时就可以直接这样写:

const guider = Guide();
guider.setOptions({
  steps: [
    {
      element: "#vite",
    },
    {
      element: "#vue",
    },
  ],
});
guider.start();

总结

我已经将这个库封装成一个 npm 包,并添加更多的功能,比如自动计算每一步骤的坐标,以及自动播放每一步骤的动画等。

具体使用请参考 guide-anime

此项目的开发让我对前端有了更深的理解,我将继续钻研前端工程化方面的知识。

参考

  • 使用 CSS 渐变
  • 奇妙的 CSS MASK
  • clip-path
  • clip-path 在线生成器

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

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

相关文章

SpringbootWeb案例

准备工作 需求说明 部门管理 部门管理功能开发包括:查询部门列表、删除部门、新增部门、修改部门   员工管理功能开发包括:查询员工列表(分页、条件)、删除员工、新增员工、修改员工 环境搭建 环境搭建步骤:1. 准备数据库表(dept、emp)…

ubuntu 安装 kvmQemu no active connection to install on

更新 apt sudo apt update检查虚拟化是否开启 0 不开,其余数字表示开启,开不开都可以,不开性能弱,只能跑 x86 系统 egrep -c (vmx|svm) /proc/cpuinfo安装 sudo apt install -y qemu-kvm virt-manager libvirt-daemon-system virt…

2.3作业

写一个shell脚本判断用户输入的是否是数字

我要成为嵌入式高手之2月3日Linux高编第一天!!

学习框架 一、IO编程 多任务编程(进程、线程) 网络编程 数据库编程 二、数据结构 学习笔记 Linux软件编程: 一. Linux 1、Linux: 操作系统的内核,真正的操作系统叫Ubuntu、Redhat、CentOS..... 内核(纯c实现的代码…

pdmodel从动态模型转成静态onnx

1.下载项目 git clone https://github.com/jiangjiajun/PaddleUtils.git 2.新建两个新的文件夹 第一个文件夹放两个必要文件 第二个文件夹可以设置为空,用来存放转换后的模型 如图: 3.在终端运行 python paddle/paddle_infer_shape.py --model_dir …

DevOps落地笔记-10|环境管理:交付测试环境的迅猛方法

上一讲我主要介绍在开发过程中如何处理应用程序在不同环境的配置问题,通过有效管理应用程序的配置,最终实现一包到底。不同的环境不仅会带来应用程序本身的配置管理问题,环境本身的创建、管理、一致性等问题也需要解决。环境管理的问题也是我…

在jetbrains IDEA/Pycharm/Android Studio中安装官方rust插件,开始rust编程

在idea插件市场搜索rust:JetBrains Marketplace ,就可以找到rust插件: jetbrains官方rust插件地址:[Deprecated] Rust - IntelliJ IDEs Plugin | Marketplace 直接在idea中搜索rust好像是搜不到的: 需要在这个插件市场…

Nginx简单阐述及安装配置

目录 一.什么是Nginx 二.Nginx优缺点 1.优点 2.缺点 三.正向代理与反向代理 1.正向代理 2.反向代理 四.安装配置 1.添加Nginx官方yum源 2.使用yum安装Nginx 3.配置防火墙 4.启动后效果 一.什么是Nginx Nginx(“engine x”)是一个高性能的HTTP…

Python3 交叉编译 numpy pandas scipy scikit-learn

1. 概述 由于需要将Python3.7 和一些软件包交叉编译到 armv7 平台硬件,如果是arm64位的系统,很多包都有预编译好的版本,可直接下载。本文主要在基于 crossenv(https://github.com/benfogle/crossenv)环境下交叉编译。 2. 编译环境搭建 创建…

自编C++题目——水龙头

预估难度 简单 题目描述 有个水龙头,其中有一些坏了的(用表示),还有一些能用的(用表示),那么有多少个能用的? 输入格式 第一行:整数,表示水龙头的个数&a…

SpringBoot 解决 getReader() has already been called for this request

一、getReader()问题分析 1、获取请求参数的方式 对于 GET 请求和 POST 表单请求,参数都是包含在 URL 查询字符串中的,因此在拦截器中都可以通过使用 request.getParameter(“paramName”)来获取这些参数。 对于 POST JSON 请求,参数通常包…

【Vue】mvc,mvp,mvvm 的区别

总结: MVC : view 视图层依靠 model 来进行更新渲染,当数据发生改变时。第一步: 通知 controller 进行更新,然后第二步 controller 再通知 model 进行更新。最后 model 才将 view 更新 , 这样大量的逻辑以及更新操作,都需要在con…

2024.2.3每日一题

LeetCode 石子游戏 VII 1690. 石子游戏 VII - 力扣(LeetCode) 题目描述 石子游戏中,爱丽丝和鲍勃轮流进行自己的回合,爱丽丝先开始 。 有 n 块石子排成一排。每个玩家的回合中,可以从行中 移除 最左边的石头或最右…

【已更新】2024美赛C题代码教学思路数据处理数学建模分析Momentum in Tennis

问题一完整的代码已给出,预计2号晚上或者3号凌晨全部给出。 代码逻辑如下: C题第一问要求我们开发一个模型,捕捉得分时的比赛流程,并将其应用于一场或多场比赛。你的模型应该确定哪名球员在比赛的特定时间表现得更好,…

C系列-动态内存管理

🌈个人主页: 会编程的果子君 ​💫个人格言:“成为自己未来的主人~” 目录 为什么要有动态内存分配 malloc和free malloc free calloc和realloc calloc realloc 常见的动态内存的错误 对NULL指针的解引用操作 ​编辑 对动态开辟空间的越界访问…

Three.js学习3:第一个Three.js页面

一、一图看懂Three.js 坐标 这个没什么好说的,只是需要注意颜色。在 Three.js 提供的编辑器中,各种物体的坐标也这样的色彩: 红色:x 轴 绿色:y 轴 蓝色:z 轴 Three.js 提供的编辑器可以在本地 Three.js …

python算法与数据结构(搜索算法和拓扑排序算法)---广度优先搜索和拓扑排序

广度优先搜索BFS 定义&基本内容 广度优先是按照层次由近及远的进行搜索,在当前层次所有可及节点都搜索完毕后才会继续往下搜索,其本质就是寻找从起点到终点的最短路程。 树的广度优先搜索 树的广度优先遍历,可以看成是层序遍历。 访问…

java数据结构与算法刷题-----LeetCode15. 三数之和

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 解题思路 和LeetCode1.两数之和一样,但是这道题边界条件更多。…

基于协同过滤的个性化电影推荐系统分析设计python+flask

本系统为用户而设计制作个性化电影推荐管理,旨在实现个性化电影推荐智能化、现代化管理。本个性化电影推荐自动化系统的开发和研制的最终目的是将个性化电影推荐的运作模式从手工记录数据转变为网络信息查询管理,从而为现代管理人员的使用提供更多的便利…

2401Idea用GradleKotlin编译Java控制台中文出乱码解决

解决方法 解决方法1 在项目 build.gradle.kts 文件中加入 tasks.withType<JavaCompile> {options.encoding "UTF-8" } tasks.withType<JavaExec> {systemProperty("file.encoding", "utf-8") }经测试, 只加 tasks.withType<…