当前位置: 首页 > news >正文

Flip动画的实现示例demo

Flip动画的实现示例demo

    • 文章说明
    • 核心代码
    • 效果展示
    • Flip动画工具类的封装

文章说明

文章主要为了学习flip动画的实现思路,并且采用此示例效果来理解该实现思路的含义

参考渡一前端袁老师的讲解视频

核心代码

采用简单的y轴变化的动画效果为示例

<!DOCTYPE html>
<html lang="zh-cn"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.container {margin: auto;margin-top: 100px;width: 100px;div {height: 30px;line-height: 30px;margin: 10px 0;background-color: chocolate;border-radius: 10px;color: #ffffff;text-align: center;}}</style>
</head><body><div class="container"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div></div><button onclick="randomFlip()">点击flip</button><script>function getElemConfig(container, children, first, last) {const elemFirst = container.children[first];const elemLast = container.children[last];const destElem = children[last];destElem.style.transform = `translateY(${elemLast.getBoundingClientRect().y - elemFirst.getBoundingClientRect().y}px)`;return destElem;}function play(destElem) {setTimeout(() => {for (let i = 0; i < destElem.length; i++) {destElem[i].style.transition = "transform 1s";destElem[i].style.removeProperty("transform");}}, 100);}function randomFlip() {const numbers = [];const container = document.getElementsByClassName("container")[0];const children = [];for (let i = 0; i < container.children.length; i++) {numbers.push(i);children.push(container.children[i].cloneNode(true));}const result = derange(numbers);const destElem = [];for (let i = 0; i < result.length; i++) {destElem.push(getElemConfig(container, children, i, result[i]));}container.innerHTML = "";for (let i = 0; i < destElem.length; i++) {container.appendChild(destElem[i]);}play(destElem);}function derange(array) {let derangedArray = array.slice();let i = derangedArray.length;while (i > 0) {let j = Math.floor(Math.random() * i);while (j === i || derangedArray[i] === derangedArray[j]) {j = Math.floor(Math.random() * i);}[derangedArray[i - 1], derangedArray[j]] = [derangedArray[j], derangedArray[i - 1]];i--;}return derangedArray;}</script>
</body></html>

效果展示

在这里插入图片描述

采用translateY进行 transform 动画
在这里插入图片描述

Gif展示
在这里插入图片描述

Flip动画工具类的封装

在实现拖拽排序示例时,我在参考的学习视频中看到有关于Flip动画功能进行了封装,我于是自己研究了一下,封装了该工具,工具类如下

class Flip {children = null;delay = 0;constructor(children, delay = 1) {this.children = children;this.calculatePos();this.delay = delay;}calculatePos(name = "first") {const children = this.children;for (let i = 0; i < children.length; i++) {children[i][name] = children[i].getBoundingClientRect();}}play() {this.calculatePos("last");const children = this.children;for (let i = 0; i < children.length; i++) {const first = children[i]["first"];const last = children[i]["last"];if (first.x !== last.x || first.y !== last.y) {children[i].style.transform = `translateY(${first.y - last.y}px) translateX(${first.x - last.x}px)`;setTimeout(() => {children[i].style.transition = `transform ${this.delay}s`;children[i].style.removeProperty("transform");setTimeout(() => {children[i].style.removeProperty("transition");this.calculatePos();}, this.delay * 1000);}, 0);}}}
}

关于拖拽排序和该工具类的使用,可参考这篇文章–拖拽排序

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • mysql的zip解压缩版安装
  • 常见的限流算法
  • hnust 湖科大 毕业实习常见问题30问(2021 年7月,V0.9)
  • django orm增删改查操作
  • 从零到一:构建你的第一个AI项目(实战教程)
  • 【算法】差分思想:强大的算法技巧
  • Parallels Desktop 20 for Mac中文版发布了?会哪些新功能
  • uniapp 做一个查看图片的组件,图片可缩放移动
  • 基于C++的成绩管理系统
  • 828华为云征文 | 使用Flexus云服务器X实例部署GLPI资产管理系统
  • 基于python+django+vue的外卖管理系统
  • 【python设计模式1】面向对象设计原则
  • 基于springboot+vue+uniapp的驾校报名小程序
  • 工厂模式,策略模式,代理模式,单例模式在项目中的应用
  • 大语言模型之ICL(上下文学习) - In-Context Learning Creates Task Vectors
  • [译]CSS 居中(Center)方法大合集
  • Android组件 - 收藏集 - 掘金
  • Angular Elements 及其运作原理
  • angular组件开发
  • ES6系列(二)变量的解构赋值
  • Flex布局到底解决了什么问题
  • HashMap ConcurrentHashMap
  • JavaScript实现分页效果
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • sessionStorage和localStorage
  • 爱情 北京女病人
  • 警报:线上事故之CountDownLatch的威力
  • 两列自适应布局方案整理
  • 前端面试之闭包
  • 协程
  • No resource identifier found for attribute,RxJava之zip操作符
  • MPAndroidChart 教程:Y轴 YAxis
  • ​secrets --- 生成管理密码的安全随机数​
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • #Z2294. 打印树的直径
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (06)Hive——正则表达式
  • (160)时序收敛--->(10)时序收敛十
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (二)windows配置JDK环境
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (函数)颠倒字符串顺序(C语言)
  • (力扣)循环队列的实现与详解(C语言)
  • (南京观海微电子)——COF介绍
  • (四)React组件、useState、组件样式
  • (学习日记)2024.01.09
  • (一)Dubbo快速入门、介绍、使用
  • (转)大型网站架构演变和知识体系
  • (转载)虚函数剖析
  • .NET 8.0 中有哪些新的变化?
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .Net插件开发开源框架