【Material-UI】Floating Action Button (FAB) 详解:动画效果 (Animation)

news2024/12/27 12:36:11

文章目录

    • 一、FAB 按钮的动画概述
      • 1. 默认动画效果
      • 2. 多屏幕横向切换时的动画
    • 二、FAB 动画效果的实现
      • 1. 代码示例:跨标签页的 FAB 动画
      • 2. 代码解析
      • 3. 多个 FAB 的切换
    • 三、动画效果的最佳实践
    • 四、总结

在现代网页设计中,动画不仅提升了用户界面的动态感,还增强了用户的交互体验。Material-UI 作为一款流行的 React 组件库,提供了丰富的动画效果,使得组件的使用更加生动自然。本文将详细介绍 Material-UI 中 Floating Action Button (FAB) 的动画效果配置,帮助开发者更好地理解和应用这些功能,为用户带来更出色的体验。

一、FAB 按钮的动画概述

1. 默认动画效果

在 Material-UI 中,Floating Action Button(FAB)作为一种重要的操作按钮,通常会随着页面的加载或切换以扩展的方式动态出现在屏幕上。这种扩展效果通过 Material Design 的视觉语言传达出按钮的重要性和可操作性。

2. 多屏幕横向切换时的动画

在某些应用场景中,FAB 可能需要跨越多个横向屏幕(例如带有标签页的界面)进行切换。在这种情况下,如果按钮的操作发生变化,FAB 应该短暂消失,然后以新的操作动画重新出现,以避免用户的混淆和误操作。

二、FAB 动画效果的实现

Material-UI 提供了 Zoom 过渡效果,专门用于实现 FAB 按钮的动画效果。在 FAB 切换时,通过控制动画的触发时间,可以使旧的 FAB 动画结束后,再开始新的 FAB 动画。这种处理方式可以避免动画的重叠,提升用户体验。

1. 代码示例:跨标签页的 FAB 动画

下面的代码示例展示了如何在多个标签页之间切换时,使用 Zoom 过渡效果来实现 FAB 按钮的动画效果:

import * as React from 'react';
import PropTypes from 'prop-types';
import SwipeableViews from 'react-swipeable-views';
import { useTheme } from '@mui/material/styles';
import AppBar from '@mui/material/AppBar';
import Tabs from '@mui/material/Tabs';
import Tab from '@mui/material/Tab';
import Typography from '@mui/material/Typography';
import Zoom from '@mui/material/Zoom';
import Fab from '@mui/material/Fab';
import AddIcon from '@mui/icons-material/Add';
import EditIcon from '@mui/icons-material/Edit';
import UpIcon from '@mui/icons-material/KeyboardArrowUp';
import { green } from '@mui/material/colors';
import Box from '@mui/material/Box';

function TabPanel(props) {
  const { children, value, index, ...other } = props;

  return (
    <Typography
      component="div"
      role="tabpanel"
      hidden={value !== index}
      id={`action-tabpanel-${index}`}
      aria-labelledby={`action-tab-${index}`}
      {...other}
    >
      {value === index && <Box sx={{ p: 3 }}>{children}</Box>}
    </Typography>
  );
}

TabPanel.propTypes = {
  children: PropTypes.node,
  index: PropTypes.number.isRequired,
  value: PropTypes.number.isRequired,
};

function a11yProps(index) {
  return {
    id: `action-tab-${index}`,
    'aria-controls': `action-tabpanel-${index}`,
  };
}

const fabStyle = {
  position: 'absolute',
  bottom: 16,
  right: 16,
};

const fabGreenStyle = {
  color: 'common.white',
  bgcolor: green[500],
  '&:hover': {
    bgcolor: green[600],
  },
};

export default function FloatingActionButtonZoom() {
  const theme = useTheme();
  const [value, setValue] = React.useState(0);

  const handleChange = (event, newValue) => {
    setValue(newValue);
  };

  const handleChangeIndex = (index) => {
    setValue(index);
  };

  const transitionDuration = {
    enter: theme.transitions.duration.enteringScreen,
    exit: theme.transitions.duration.leavingScreen,
  };

  const fabs = [
    {
      color: 'primary',
      sx: fabStyle,
      icon: <AddIcon />,
      label: 'Add',
    },
    {
      color: 'secondary',
      sx: fabStyle,
      icon: <EditIcon />,
      label: 'Edit',
    },
    {
      color: 'inherit',
      sx: { ...fabStyle, ...fabGreenStyle },
      icon: <UpIcon />,
      label: 'Expand',
    },
  ];

  return (
    <Box
      sx={{
        bgcolor: 'background.paper',
        width: 500,
        position: 'relative',
        minHeight: 200,
      }}
    >
      <AppBar position="static" color="default">
        <Tabs
          value={value}
          onChange={handleChange}
          indicatorColor="primary"
          textColor="primary"
          variant="fullWidth"
          aria-label="action tabs example"
        >
          <Tab label="Item One" {...a11yProps(0)} />
          <Tab label="Item Two" {...a11yProps(1)} />
          <Tab label="Item Three" {...a11yProps(2)} />
        </Tabs>
      </AppBar>
      <SwipeableViews
        axis={theme.direction === 'rtl' ? 'x-reverse' : 'x'}
        index={value}
        onChangeIndex={handleChangeIndex}
      >
        <TabPanel value={value} index={0} dir={theme.direction}>
          Item One
        </TabPanel>
        <TabPanel value={value} index={1} dir={theme.direction}>
          Item Two
        </TabPanel>
        <TabPanel value={value} index={2} dir={theme.direction}>
          Item Three
        </TabPanel>
      </SwipeableViews>
      {fabs.map((fab, index) => (
        <Zoom
          key={fab.color}
          in={value === index}
          timeout={transitionDuration}
          style={{
            transitionDelay: `${value === index ? transitionDuration.exit : 0}ms`,
          }}
          unmountOnExit
        >
          <Fab sx={fab.sx} aria-label={fab.label} color={fab.color}>
            {fab.icon}
          </Fab>
        </Zoom>
      ))}
    </Box>
  );
}

2. 代码解析

在这个示例中,我们通过 TabsSwipeableViews 组件实现了多个标签页之间的切换。每个标签页对应不同的操作,因此 FAB 按钮在切换时需要执行不同的动画。

  • Zoom 过渡效果Zoom 是 Material-UI 中的一个动画组件,用于实现 FAB 按钮的缩放效果。通过控制 in 属性,可以决定按钮是否显示,同时通过 timeout 属性来设置动画的时长。
  • transitionDuration:通过 theme.transitions.duration 获取进入和退出屏幕的动画时长,确保动画过渡平滑自然。
  • transitionDelay:为了避免新旧按钮动画的重叠,我们通过 transitionDelay 设置了进入动画的延迟,使得上一按钮的退出动画完成后,新按钮的动画才开始。

3. 多个 FAB 的切换

在这个例子中,我们有三个不同的 FAB 按钮,每个按钮代表了一个操作:添加(Add)、编辑(Edit)和扩展(Expand)。在切换标签页时,相应的 FAB 按钮也会随之变化。这种设计不仅直观,还能让用户清楚知道当前标签页的主要操作是什么。

三、动画效果的最佳实践

在设计 FAB 的动画效果时,以下几个最佳实践可以帮助你优化用户体验:

  1. 避免动画重叠:如同上述示例,通过设置动画的 transitionDelay,确保每个动画独立运行,避免因动画重叠而造成的视觉混乱。
  2. 使用合适的动画时长:动画的进入和退出时长应该与整体的 UI 风格一致,过长或过短的动画时间都会影响用户体验。Material-UI 提供的默认动画时长通常已足够,开发者可以根据需求微调。
  3. 考虑用户的交互频率:对于高频操作的按钮,动画效果应当简洁快速,以免增加用户的操作时间。而对于低频操作,动画可以适当复杂,以增强视觉效果。

四、总结

Material-UI 的 Floating Action Button (FAB) 组件不仅在视觉上吸引眼球,通过精心设计的动画效果,还能够提升用户的操作体验。在多屏幕或多标签页应用中,适当的动画设计可以有效减少用户的操作混淆,提高界面的易用性和美观度。通过本文的详细解析和代码示例,希望你能更好地理解并应用 FAB 的动画效果,为你的应用程序增添一抹生动的色彩。

推荐:

  • JavaScript
  • react
  • vue

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React+AntDesign做一个日历,展示节假日,节气,并且在某几个时间上添加活动备注

直接贴效果图😄 首先日历是用的AntDesign提供的Calendar组件,这个组件还是蛮强大的,可以自定义头部时间下拉;渲染每个时间段,或者重置时间段内容,玩的空间是很大的 直接贴代码,结尾最后我会将开发中遇到的问题贴出来解答一下 第一步:下载js-calendar-converter添加…

SpringBoot集成日志框架

SpringBoot集成日志框架 Java生态体系日志框架介绍 简介 在Java生态体系中&#xff0c;围绕着日志&#xff0c;有很多成熟的解决方案。关于日志输出&#xff0c;主要有两类工具。 一类是日志框架&#xff08;Log4j、Logback&#xff09;&#xff0c;主要用来进行日志的输出的…

Unity 使用 NewtonSoft Json插件报错

JsonReaderException: Unexpected character encountered while parsing value: . Path , line 0, position 0. 通过断点发现&#xff0c;头有一串ZWNBSP&#xff0c;这个是BOM格式的JSON。在文件下看不到。 解决方法&#xff1a;改编码格式&#xff0c;Remove BOM.

Linux信号的概念信号的产生

前言 我们前面已经对进程已做了介绍&#xff01;知道进程具有独立性&#xff0c;但在运行起来后可能会"放飞自我"&#xff0c;即不受控制的执行&#xff0c;这就会导致系统崩溃等问题&#xff0c;非常不利于管理。因此OS需要一种机制来协调和控制进程的运行&#xf…

【C++】拓扑排序(BFS)

目录 拓扑排序介绍 有向无环图 如何解决这类问题 课程表 算法思路 代码实现 课程表2 算法思路 代码实现 火星词典 代码实现 拓扑排序介绍 有向无环图 入度&#xff1a;指向活动节点的箭头个数&#xff1b; 出度&#xff1a;从活动节点出去指向别的节点的箭头个数。…

交互式实时距离测量-单目测距-社交距离检测

使用说明 使用鼠标点击两个目标框要删除在距离计算过程中绘制的点&#xff0c;你可以使用鼠标右键点击。这会清除所有已绘制的点 使用 Ultralytics YOLOv8 进行距离计算 距离计算是在指定空间内测量两个物体之间间隙的基本概念。在 Ultralytics YOLOv8 的情况下&#xff0c;通…

React学习-初始化react项目

目标: reactv18&#xff1a;->1.核心的22中api2路由3.数据状态管理&#xff1a;redux项目&#xff1a; 1.b端业务闭环:登录方案、权限设计、用户管理方案、业务功能、系统架构设计、路由设计流程闭环&#xff1a;开发环境、生产环境、测试环境、代码规范、分支管理规范、项…

SpringBoot整合knife4j配置使用直接拷贝即可(快速入门超详细版)

1. SpringBoor整合Knife4j添加maven 1.1 第一种maven <!--添加Knife4j依赖--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.5.0</ver…

Unity新输入系统 之 PlayerInput(真正的最后封装部分)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 首先你应该了解新输入系统的基本单位和输入配置文件 Unity新输入系统 之 InputAction&#xff08;输入配置文件最基本的…

6 款最佳付费和免费 iPhone 解锁应用和软件

iPhone解锁应用程序是一种可以不受任何限制地移除 iOS 设备上不同类型锁的工具。iPhone 可能受锁屏密码、Apple ID 密码、屏幕使用时间密码、iCloud 激活锁、MDM 等保护。如果您忘记了密码&#xff0c;您将无法使用设备或无法完全访问您的 iPhone。幸运的是&#xff0c;有软件可…

跨平台控制神器Escrcpy,您的智能生活助手

Escrcpy 是一款基于 Scrcpy 开发的图形化安卓手机投屏控制软件&#xff0c;它允许用户将 Android 手机屏幕实时镜像到电脑上&#xff0c;并使用电脑的鼠标和键盘直接操作手机&#xff0c;实现了无线且高效的操控。这款软件是免费开源的&#xff0c;支持跨平台使用&#xff0c;包…

2024 年可免费下载的 6 款最佳 iOS 解锁软件

众所周知&#xff0c;如果所有者或其他人多次输入错误密码&#xff0c;iOS 会锁定并禁用 iPhone 或 iPad。Apple 推出了使用 iTunes/Finder、iCloud 或其他 iOS 设备解锁已禁用设备的方法。但是&#xff0c;每种方法都需要一些先决条件&#xff0c;例如 Apple 密码。在这种情况…

Unity使用代码生成ScriptableObject数据并赋值之后,重启数据就没有啦!

2024年8月14日早&#xff0c;因数据持续化存储&#xff0c;重启电脑后数据会丢失&#xff0c;而我找不到原因被领导质疑了&#xff0c;故写一片博客记录这个错误。 省流 使用在编辑器的play模式中为ScriptableObject赋值之后&#xff0c;需要使用 #if UNITY_EDITORUnityEdit…

GLCIC:全局和局部一致的图像补全

GLCIC&#xff1a;全局和局部一致的图像补全 前言相关介绍GLCIC 的工作原理核心思想主要组件训练目标 优点缺点总结 实验环境项目地址LinuxWindows 项目结构具体用法准备数据集进行训练进行测试 参考文献 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改…

四十一、大数据技术之Kafka3.x(4)

&#x1f33b;&#x1f33b; 目录 一、Kafka 消费者1.1 Kafka 消费方式1.2 Kafka 消费者工作流程1.2.1 消费者总体工作流程1.2.2 消费者组原理1.2.3 消费者重要参数 1.3 消费者 API1.3.1 独立消费者案例&#xff08;订阅主题&#xff09;1.3.2 独立消费者案例&#xff08;订阅分…

基于SpringBoot+Vue框架的租车管理系统

文章目录 一、项目介绍二、项目类型三、技术栈介绍1.客户端技术栈2.服务端技术栈 四、项目创新点五、项目功能介绍1.客户端功能2.服务端功能 六、项目的主要截图页面如下展示1.客户端展示2.服务端展示 七、项目源码 一、项目介绍 ​大家好&#xff0c;我是执手天涯&#xff0c;…

找出字符串中第一个匹配项的下标 | LeetCode-28 | KMP算法 | next数组 | Java详细注释

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f579;️KMP算法练习题 LeetCode链接&#xff1a;28. 找出字符串中第一个匹配项的下标 文章目录 1.题目描述&#x1f347;2.题解&#x1f349;2.1 暴力解法&a…

【树的遍历】

题目 代码 #include<bits/stdc.h> using namespace std;const int N 40;int in[N], pos[N]; //中序、后序 int idx[N]; //中序的值->索引 unordered_map<int, int> l, r; //根节点的左、右树根节点 int n; int build(int il, int ir, int pl, int pr) {int ro…

【2】MySQL相关概念

一.数据库相关概念 二.MySQL数据库

软件接口测试有多重要?专业软件测试公司接口测试流程分享

在当今软件开发的各个阶段&#xff0c;软件接口测试无疑是一个极其重要的环节。接口测试主要针对软件系统与外部环境之间的交互部分&#xff0c;包括API、Web服务、中间件等。在现代软件架构中&#xff0c;接口的稳定性和一致性直接关系到系统的整体性能和用户体验。因此&#…