网站首页 > 教程分享 正文
1. 基本介绍
AutoAnimate 是一个零配置的嵌入式动画实用程序,可为您的 Web 应用程序添加平滑的过渡。您可以将它与 React、Solid、Vue、Svelte 或任何其他 JavaScript 应用程序一起使用。 AutoAnimate 的目标是在不影响开发人员的实施时间或性能预算的情况下大幅改善应用程序的用户体验。
2. 和其他动画库的区别
之前的动画库基本都是开发者要在哪里加上动画,需要我们自己决定或者配置才行,而 AutoAnimate 可以帮助我们自动在整个应用添加合适的动画。 AutoAnimate 使用一行代码即可实现添加合适的动画,我们不需要在编写时列表组件时考虑到 AutoAnimate。
AutoAnimate 可以追溯应用到代码库中的任何标记,包括第 3 方代码 - 只需提供父 DOM 节点,然后让 AutoAnimate 完成剩下的工作。
3. 使用指南
3.1 安装
yarn add @formkit/auto-animate
or
npm install @formkit/auto-animate
3.2 用法
AutoAnimate 本质上是一个 autoAnimate 接受父元素的函数。自动动画将应用于父元素及其直接子元素。当发生以下三个事件之一时,会专门触发动画:
- 一个子级被添加到 DOM 中。
- DOM 中的子级被删除。
- 一个孩子在 DOM 中移动。
3.3 注意事项
使用其他类型的过渡仍然可以。例如,如果您仅使用 CSS 进行样式更改(例如悬停效果),则可以使用标准 CSS 过渡来进行此类样式调整。
- autoAnimate仅当添加、删除或移动父元素(您传递给的元素)的直接子元素时,才会触发动画。
- position: relative如果父元素是静态定位的,它会自动接收。编写样式时请记住这一点。
- 有时,Flexbox 布局不会立即调整其子布局的大小。具有属性的子级flex-grow: 1会在捕捉到其完整宽度之前等待周围的内容。AutoAnimate 在这些情况下效果不佳,但如果您为元素指定更明确的宽度,它应该会像魅力一样工作。
4. 原理介绍
4.1 IntersectionObserver
异步观察目标元素与祖先元素或具有顶级文档的视口的相交的变化。
function observePosition(el: Element) {
const oldObserver = intersections.get(el)
oldObserver?.disconnect()
let rect = coords.get(el)
let invocations = 0
const buffer = 5
if (!rect) {
rect = getCoords(el)
coords.set(el, rect)
}
const { offsetWidth, offsetHeight } = root
const rootMargins = [
rect.top - buffer,
offsetWidth - (rect.left + buffer + rect.width),
offsetHeight - (rect.top + buffer + rect.height),
rect.left - buffer,
]
const rootMargin = rootMargins
.map((px) =>`${-1 * Math.floor(px)}px`)
.join(" ")
const observer = new IntersectionObserver(
() => {
++invocations > 1 && updatePos(el)
},
{
root,
threshold: 1,
rootMargin,
}
)
observer.observe(el)
intersections.set(el, observer)
}
4.2 MutationObserver
监听DOM树的变化,比如增加、删除、移动等DOM操作。
function getElements(mutations: MutationRecord[]): Set<Element> | false {
const observedNodes = mutations.reduce((nodes: Node[], mutation) => {
return [
...nodes,
...Array.from(mutation.addedNodes),
...Array.from(mutation.removedNodes),
]
}, [])
// Short circuit if _only_ comment nodes are observed
const onlyCommentNodesObserved = observedNodes.every(
(node) => node.nodeName === "#comment"
)
if (onlyCommentNodesObserved) returnfalse
return mutations.reduce((elements: Set<Element> | false, mutation) => {
// Short circuit if we find a purposefully deleted node.
if (elements === false) returnfalse
if (mutation.target instanceof Element) {
target(mutation.target)
if (!elements.has(mutation.target)) {
elements.add(mutation.target)
for (let i = 0; i < mutation.target.children.length; i++) {
const child = mutation.target.children.item(i)
if (!child) continue
if (DEL in child) returnfalse
target(mutation.target, child)
elements.add(child)
}
}
if (mutation.removedNodes.length) {
for (let i = 0; i < mutation.removedNodes.length; i++) {
const child = mutation.removedNodes[i]
if (DEL in child) returnfalse
if (child instanceof Element) {
elements.add(child)
target(mutation.target, child)
siblings.set(child, [
mutation.previousSibling,
mutation.nextSibling,
])
}
}
}
}
return elements
}, newSet<Element>())
}
4.3 ResizeObserver
对 Element 的内容或边框或 SVGElement 的边框的尺寸的更改
if (typeofwindow !== "undefined") {
root = document.documentElement
mutations = new MutationObserver(handleMutations)
resize = new ResizeObserver(handleResizes)
resize.observe(root)
}
猜你喜欢
- 2024-10-12 javaScript-第三章(js第三章上机)
- 2024-10-12 前端面试题《BOM与DOM》(bom 前端)
- 2024-10-12 JavaScript之DOM(javascript下载安装电脑版)
- 2024-10-12 javaScript入门知识点(javascript初学者)
- 2024-10-12 某课Node.js工程师养成计划F享(教师师德修养专项培训实践研磨)
- 2024-10-12 「前端架构师30天快速掌握js22」之DOM对象
- 2024-10-12 2024阿里前端二面社招(阿里前端校招)
- 2024-10-12 DOM入门 - 节点结构(dom节点有哪些)
- 2024-10-12 HTML DOM 元素对象(html中的对象)
- 2024-10-12 详解模板注入漏洞(下)(模版注入漏洞)
你 发表评论:
欢迎- 最近发表
-
- 免费10年VPS-serv00服务器,注册与自动化保号
- Consul微服务注册中心使用指南
- 谷歌云代理商:注册谷歌云服务器需要准备哪些资料?
- steam账号注册不了/注册失败?好用的解决方法看这里
- 微服务架构中的服务注册与发现有哪些?Zookeeper、Eu
- # 从浅入深 学习 SpringCloud 微服务架构(三)注册中心 Eureka(1)
- 一文深入理解AP架构Nacos注册原理
- 群晖NAS本地搭建NVIDIA v-GPU License Server 授权许可服务器的教程
- IDEA 2024解决We could not validate your license XX
- 保障数据完整性:深入解析Oracle数据库的主键和外键约束
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)