Motion的布局动画的基础使用

前言

大家好,我是 Motion Vue 的作者。作为 framer-motion 的忠实粉丝,我一直非常欣赏它优雅的 API 设计和极致的动画体验。本文想和大家简单分享下 Motionlayout animation 基础用法和实战技巧,希望能给你带来启发,也欢迎大家关注 Motion VueVue 生态的实现与探索。


布局动画基础

什么是布局动画?

在 Framer Motion 中,只需给 motion 组件加上 layout 属性,就能让它在不同布局之间平滑过渡,这就是布局动画。

布局(layout)指什么?

  • 位置相关:如 CSS 的 flexpositiongrid
  • 尺寸相关:如 widthheight
  • 列表中元素的整体位置(比如排序/重排)

普通的 initialanimate 不能实现布局动画,必须用 layout

示例:

vue 复制代码
<template>
    <motion.div layout :style="{ justifySelf: position }" />
</template>

可以看到我们每次进行布局变化,带有layout 属性会让组件从上一个布局平滑过渡到新布局,否则会瞬移。

布局动画让 UI 交互更自然,尤其适合列表增删、排序等场景,配合 AnimatePresence 效果更佳。

自定义布局动画过度效果

你可以通过以下方式自定义布局动画过度效果

vue 复制代码
<motion.div
 layout
 :transition="{
   layout: {
     duration: 1.5,
   },
 }"
/>

修复布局动画borderRadius的失真问题

有时布局动画会导致如 borderRadius属性在过渡时出现失真。解决方法:

  • 这些属性用内联 style 明确指定
vue 复制代码
<motion.div
  layout
  :style="{ borderRadius: expanded ? '20px' : '150px' }"
/>

注意:用 CSS 变量设置 borderRadius 无法避免失真,必须用具体值。

layout 属性的更多用法

layout 不只是布尔值,还可以:

  • layout="position":只平滑过渡位置,尺寸变化瞬间完成
  • layout="size":只平滑过渡尺寸,位置变化瞬间完成 适合需要分别控制位置/尺寸动画的场景。

布局动画元素被拉伸压扁怎么解决

有时,由于布局动画的作用,调整大小的组件的内容可能会被 压扁拉伸。如果你在制作布局动画时发现这种情况,只需将布局属性设置为 position,就有可能解决这个问题。

下面是这种情况的一个例子:

  • 删除水平列表中的项目将影响每个组件的大小。默认情况下,您会注意到当物品被删除时,组件会稍微挤压。
  • 将内容放在motion组件下,并将layout属性设置为position

共享布局动画

不同于前面介绍的布局动画(基于同一组件的布局样式变化进行过渡转换),共享布局动画是在具有相同layoutId属性的不同组件进行动画。我们来看下下面这个例子:

vue 复制代码
<template>
 <div class="list">
   <div
     v-for="item in items"
     :key="item"
     class="item"
     @click="selected = item"
     tabindex="0"
   >
     <div>Item {{ item }}</div>
         <Arrow
           v-if="item === selected"
           layoutId="arrow"
           :style="{
             height: '24px',
             color: '#5686F5',
             transform: 'rotate(-90deg)'
           }"
         />
   </div>
 </div>
</template>

// Arrow组件
<template>
   <Motion 
       layoutId="arrow" 
       :style="{ height: '24px', color: '#5686F5', transform: 'rotate(-90deg)' }"
    />
</template>

当两个组件共享相同的 layoutId 时, Motion 会自动在它们之间创建过渡动画。在这个例子中:

  • 每个列表项都有一个可选的箭头指示器
  • 箭头组件使用 layoutId="arrow" 来标识
  • 当用户点击不同的列表项时,箭头会平滑地从一个位置移动到另一个位置

总结

以上就是关于motion布局动画的一些基础使用。

对布局动画感兴趣的同学可以查看以下文档。

或者加入Motion Vue的discord频道,可以问我关于Motion Vue的使用问题。或者提提建议,我需要听到更多来自Vue社区的反馈。

相关文档

相关推荐
passerby60619 分钟前
完成前端时间处理的另一块版图
前端·github·web components
掘了16 分钟前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅19 分钟前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅41 分钟前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅1 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment1 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅1 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊1 小时前
jwt介绍
前端
爱敲代码的小鱼2 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax
吹牛不交税2 小时前
admin.net-v2 框架使用笔记-netcore8.0/10.0版
vue.js·.netcore