【Material-UI】复杂按钮 (Complex Button) 自定义详解
文章目录
- 一、ButtonBase 组件简介
- 二、实例讲解:创建复杂的图片按钮
- 1. 样式定义
- 2. 核心组件构建
- 3. 交互效果
- 三、高级自定义技巧
- 1. 响应式设计
- 2. 动态内容与动画
- 四、总结
在现代 Web 应用中,按钮不仅仅是一个点击交互元素,它们也承载着传递信息和引导用户操作的功能。Material-UI 提供了丰富的按钮组件,但有时我们需要更复杂、更具个性化的按钮。这时,Material-UI 的 ButtonBase 组件就派上用场了。本文将深入探讨如何使用 ButtonBase 构建复杂按钮,以及实现自定义交互效果的方法。
一、ButtonBase 组件简介
Material-UI 的 Text Buttons、Contained Buttons、Floating Action Buttons 和 Icon Buttons 等常见按钮,都是基于同一个底层组件——ButtonBase 构建的。ButtonBase 是一个较低级的基础组件,提供了按钮的核心交互逻辑,如点击、焦点、悬停等。我们可以利用 ButtonBase 来创建自定义的按钮风格和交互效果。
二、实例讲解:创建复杂的图片按钮
下面我们通过一个实例展示如何使用 ButtonBase 创建一个复杂的图片按钮集合。
1. 样式定义
我们首先定义了一些必要的样式,包括按钮的背景图像、遮罩效果、标题文本等。
import * as React from 'react';
import { styled } from '@mui/material/styles';
import Box from '@mui/material/Box';
import ButtonBase from '@mui/material/ButtonBase';
import Typography from '@mui/material/Typography';const images = [{url: '/static/images/buttons/breakfast.jpg',title: 'Breakfast',width: '40%',},{url: '/static/images/buttons/burgers.jpg',title: 'Burgers',width: '30%',},{url: '/static/images/buttons/camera.jpg',title: 'Camera',width: '30%',},
];const ImageButton = styled(ButtonBase)(({ theme }) => ({position: 'relative',height: 200,[theme.breakpoints.down('sm')]: {width: '100% !important',height: 100,},'&:hover, &.Mui-focusVisible': {zIndex: 1,'& .MuiImageBackdrop-root': {opacity: 0.15,},'& .MuiImageMarked-root': {opacity: 0,},'& .MuiTypography-root': {border: '4px solid currentColor',},},
}));const ImageSrc = styled('span')({position: 'absolute',left: 0,right: 0,top: 0,bottom: 0,backgroundSize: 'cover',backgroundPosition: 'center 40%',
});const Image = styled('span')(({ theme }) => ({position: 'absolute',left: 0,right: 0,top: 0,bottom: 0,display: 'flex',alignItems: 'center',justifyContent: 'center',color: theme.palette.common.white,
}));const ImageBackdrop = styled('span')(({ theme }) => ({position: 'absolute',left: 0,right: 0,top: 0,bottom: 0,backgroundColor: theme.palette.common.black,opacity: 0.4,transition: theme.transitions.create('opacity'),
}));const ImageMarked = styled('span')(({ theme }) => ({height: 3,width: 18,backgroundColor: theme.palette.common.white,position: 'absolute',bottom: -2,left: 'calc(50% - 9px)',transition: theme.transitions.create('opacity'),
}));
2. 核心组件构建
接下来,我们使用这些样式来构建按钮组件。在这里,我们使用 Box 组件来布局按钮,并通过 map 方法遍历图片数组,动态生成每个图片按钮。
export default function ButtonBaseDemo() {return (<Box sx={{ display: 'flex', flexWrap: 'wrap', minWidth: 300, width: '100%' }}>{images.map((image) => (<ImageButtonfocusRipplekey={image.title}style={{width: image.width,}}><ImageSrc style={{ backgroundImage: `url(${image.url})` }} /><ImageBackdrop className="MuiImageBackdrop-root" /><Image><Typographycomponent="span"variant="subtitle1"color="inherit"sx={{position: 'relative',p: 4,pt: 2,pb: (theme) => `calc(${theme.spacing(1)} + 6px)`,}}>{image.title}<ImageMarked className="MuiImageMarked-root" /></Typography></Image></ImageButton>))}</Box>);
}
3. 交互效果
通过 ImageButton 的样式定义,我们实现了一些交互效果:
- 悬停效果:当用户悬停在按钮上时,按钮的 z-index 提高,同时背景变暗,标题下方的标记线消失,标题文本的边框变得明显。
- 焦点效果:与悬停效果类似,当按钮获得焦点时(如通过键盘导航),按钮的外观也会改变,增强可访问性。
三、高级自定义技巧
1. 响应式设计
在样式定义中,我们使用了媒体查询 ([theme.breakpoints.down('sm')]) 来处理不同屏幕尺寸下的布局变化。例如,当屏幕宽度小于 sm 时,按钮的宽度调整为 100%,高度减少到 100px。这确保了在移动设备上有良好的用户体验。
2. 动态内容与动画
可以进一步增强按钮的视觉效果,例如添加淡入淡出动画、动态加载内容等。使用 Material-UI 的 transition 和 keyframes API,可以实现更复杂的动画效果。
const fadeIn = keyframes`from {opacity: 0;}to {opacity: 1;}
`;const AnimatedTypography = styled(Typography)(({ theme }) => ({animation: `${fadeIn} 1s ease-in-out`,
}));
四、总结
Material-UI 的 ButtonBase 组件为创建复杂的按钮提供了极大的灵活性。通过合理使用样式和组件,我们可以轻松地实现各种定制化的按钮设计,以适应不同的应用场景和用户需求。本文介绍的自定义图片按钮示例,展示了如何通过 ButtonBase 构建高级的视觉效果和交互体验。
在实际开发中,我们还可以结合 Material-UI 的主题系统、响应式设计和动画效果,进一步提升应用的整体体验。希望这篇文章能帮助您更好地理解和利用 ButtonBase 组件,打造更加精美和独特的 Web 应用界面。
推荐:
- JavaScript
- react
- vue

相关文章:
【Material-UI】复杂按钮 (Complex Button) 自定义详解
文章目录 一、ButtonBase 组件简介二、实例讲解:创建复杂的图片按钮1. 样式定义2. 核心组件构建3. 交互效果 三、高级自定义技巧1. 响应式设计2. 动态内容与动画 四、总结 在现代 Web 应用中,按钮不仅仅是一个点击交互元素,它们也承载着传递信…...
IT服务质量管理攻略(至简)
质量管理、风险管理和信息安全管理是IT服务监督管理的重要内容,三者之间相对独立。IT服务质量管理是通过制订质量方针、质量目标和质量计划,实施质量控制、质量保证和质量改进活动,确保IT服务满足服务级别协议的要求,最终获得用户…...
MySQL事务隔离级别、InnoDB使用MVCC+各种锁实现了RC和RR事务隔离级别、具体案例
事务隔离级别 脏读:一个事务读取到另一个未提交事务的更改。不可重复读:一个事务在两次读取同一数据时,发现数据被另一个已提交事务修改了。幻读:一个事务在读取过程中,因其他事务的插入而导致返回的行数不一致&#…...
你的Java项目还在等待吗?快来学会线程池,解放你的性能!
文章目录 你的Java项目还在等待吗?快来学会线程池,解放你的性能!1 什么是线程池?为什么需要它?2 线程池的参数有哪些?3 不同类型的线程池有哪些配置? 你的Java项目还在等待吗?快来学…...
深入解析:Amazon Bedrock 上 Claude 3 Haiku 的微调测试报告
前言 2024年7月10日,Anthropic Claude 3 Haiku 的微调功能在 Amazon Bedrock 上开放预览。本篇文章将分享 Claude 3 Haiku 的微调使用步骤及微调后模型的评估结果。 LLM 细调的优势 通过细调,LLM可以获得特定领域的知识或新知识。这样,与RA…...
2023年庐阳区青少年信息学科普日真题- 马拉松(marathon)
题目描述 环湖马拉松全程 L 公里,已经安排了 N 个补给点,位置已经确定。由于预算增加,现在可以增设 K 个补给点。如何安排新增的补给点使得相邻补给点间最大距离最小。相邻补给点间距离也包括起点与第一个补给点之间的距离和最后一个补给点与…...
Python笔记:socket.gaierror: [Errno -3] Temporary failure in name resolution
【Python】成功解决socket.gaierror: [Errno -3] Temporary failure in name resolution 在Python开发中,使用网络编程时,特别是处理socket连接时,遇到socket.gaierror: [Errno -3] Temporary failure in name resolution这个错误是一个相对…...
HexView 刷写文件脚本处理工具-基本功能介绍(三)-导出S19/HEX
菜单 导出(Export) 此项目将一系列不同的选项组合在一起,用于将内部数据存储为不同的文件格式。每种导出都可以包含一些选项,以调整输出信息。 导出为S-Record格式(Export as S-Record) Motorola S-Record格式导出数据。 记录类型将根据最高地址信息的长度自动选择。…...
代码随想录算法训练营第四天(二)|面试题 02.07. 链表相交 142.环形链表II
面试题 02.07. 链表相交 题目: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环…...
学习记录第二十一天
目录操作是指在计算机文件系统中对目录(也称为文件夹)进行的各种管理操作。目录是组织和存储文件的一种逻辑结构,它帮助用户和系统管理大量文件,使得文件查找和组织更加高效有序。目录操作主要包括以下几种: 1.创建目…...
江协科技51单片机学习- p31 LCD1602液晶屏驱动
🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝…...
Android SurfaceFlinger——渲染完成帧显示(四十八)
帧渲染完成后下一步就是将帧缓冲区(framebuffer)的内容发送到显示设备进行显示,也是 SurfaceFlinger 处理渲染合成的最后一步。 1.更新输出设备的色彩配置文件2.更新与合成相关的状态3.计划合成帧图层4.写入合成状态5.设置颜色矩阵6.开始帧7.准备帧数据以进行显示(异步方式)…...
ABAP+json格式数据转换时参数为空没传值
CALL METHOD /UI2/CL_JSON>SERIALIZE 我们在ABAP传输json格式数据到外围系统时,会用到这个类方法 /UI2/CL_JSON>SERIALIZE CALL METHOD /UI2/CL_JSON>SERIALIZEEXPORTINGDATA LO_DATACOMPRESS XPRETTY_NAME /UI2/CL_JSON>PRETTY_M…...
Flink中上游DataStream到下游DataStream的内置分区策略及自定义分区策略
目录 全局分区器GlobalPartitioner 广播分区器BroadcastPartitioner 哈希分区器BinaryHashPartitioner 轮询分区器RebalancePartitioner 重缩放分区器RescalePartitioner 随机分区器ShufflePartitioner 转发分区器ForwardPartitioner 键组分区器KeyGroupStreamPartitio…...
谁来做引领企业精益变革的舵手最合适?
在这个瞬息万变的商业时代,企业如同航行在波涛汹涌的大海中的巨轮,既需面对未知的挑战,也要抓住稍纵即逝的机遇。而在这场没有终点的航行中,引领企业实现精益变革的舵手,无疑是推动企业破浪前行、稳健致远的关键角色。…...
数据结构(java实现)——优先级队列,堆
文章目录 优先级队列堆堆的概念堆的模拟实现创建堆入堆判满删除判空获取栈顶元素 创建堆两种方式的时间复杂度堆排序java提供的PriorityQueue类基本的属性关于PriorityQueue类的三个构造方法关于PriorityQueue类中,入堆方法是怎样实现的?PriorityQueue注…...
一部分优化算法
一、优化问题 1、优化目标 (1)优化和深度学习的目标是根本不同的。前者主要关注的是最小化目标,后者则关注在给定有限数据量的情况下寻找合适的模型。 (2)优化算法的目标函数通常是基于训练数据集的损失函数&#x…...
图论(强联通分量)
在图论中,特别是在讨论有向图(Directed Graph)时,我们常常需要了解图的结构特性,比如强联通分量(Strongly Connected Components, SCC)。了解强联通分量中的各种边对于理解图的整体结构以及某些…...
LLaMA- Adapter V2: Parameter-Efficient Visual Instruction Model
发表时间:28 Apr 2023 论文链接:https://arxiv.org/pdf/2304.15010 作者单位: Shanghai Artificial Intelligence Laboratory Motivation:如何有效地将大型语言模型 (LLM) 转换为指令追随者最近是一个流行的研究方向࿰…...
【爬虫实战】利用代理爬取Temu电商数据
引言 在行业竞争激烈、市场变化快速的跨境电商领域,数据采集可以帮助企业深入了解客户需求和行为,分析市场趋势和竞争情况,从而优化产品和服务,提高客户满意度和忠诚度。同时,数据采集可以实时跟踪库存水平和销售情况&…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
