16 - Grid

grid布局可以用于两个方向上的或者响应式的布局。于此相对的是Stack,用于一个方向上的布局,水平或垂直。

image-20251030102533653

可以看到,设置了不同的breakpoints情况之后,在不同的屏幕条件下,会展示不同的占用宽度。

如果不指定size属性,Grid Item默认是平均分布。如果有某一项、或多项指定了size属性,那其余的Grid Item就会平分其余的宽度。

size="auto"表示会根据GridItem里面内容的宽度来设置宽度。

<Grid container>上面的spacing属性,用来设置Grid Item之间横向、纵向的间距。

image-20251030104730662

17 - Paper

Paper组件主要用于模拟现实世界中一张纸的质感和效果,可以用于创建有层次感的区域,可以用于创建Card、Modal等等的外观基础。

image-20251030105727707

18 - Card

image-20251030110824333

基本用法

image-20251030110404073

CardActions添加按钮

image-20251030110725754

CardMedia添加图片

image-20251030112103032

19 - Accordion

Accordion:手风琴。

基本用法

Accordion group

直接复制之前的Accordion,就可以组成group了,最外层不需要加额外的标签。

让accordion group每次只展开一个

通过Accordionexpanded属性来处理。

上面这段代码的意思要弄清楚,这个设计很好。

20 - ImageList

imagelist的效果应该是照片墙的效果。

基础用法

仔细看一下network里面,调整到3G,当滚动到最下面的时候,图片才开始加载,这对于网速慢的很友好。

Woven image list

Woven image lists use alternating container ratios to create a rhythmic layout. A woven image list is best for browsing peer content.

交织式图片列表使用交替的容器比例来创建富有韵律感的布局。交织式图片列表最适合浏览同行内容。

效果:

Masonry image list

Masonry image lists use dynamically sized container heights that reflect the aspect ratio of each image. This image list is best used for browsing uncropped peer content.

瀑布流图像列表使用动态调整的容器高度,以反映每张图片的宽高比。这种图像列表最适合浏览未经裁剪的同行内容。

效果:

Image list with title bars

ImageListItemBar的作用是 add an overlay to each item。

可以看到,非常漂亮的图片标题就展示了。

image-20251030140715456

21 - Navbar

在mui中没有专门的navbar。但是可以通过两个组件AppBarToolbar来组合成navbar的样式。

image-20251030141614119

基本用法:

为了更好的展示navbar,要把App.css里面的body样式和#root样式的padding和margin全部设置为0。

image-20251030142512736

为导航栏添加按钮,需要将某一部分设置为flexGrow: 1,意味着其余部分都是按照内容大小进行展示的。

image-20251030143657943

22 - Menu

使用MenuMenuItem来组合成Menu。

但是Menu的使用非常复杂,要定义很多变量和函数,还要相互绑定很多值,我问一下:

我们来详细看一下 MUI Menu 组件中最重要的两个部分:定位(anchorEl状态管理(open/onClose


 

1. ⚓ 定位:anchorEl (锚点元素)

 

anchorEl 属性告诉 Menu 组件它应该“挂”在哪里。

 

🔹 示例代码 (如何获取锚点):

 

通常,您会在按钮的点击事件中获取这个 DOM 元素的引用,并将其存储在 state 中:


 

2. 🔄 状态管理:openonClose

 

Menu 是一个受控组件(Controlled Component),这意味着您必须通过外部 State 来控制它的显示和隐藏。

通过这种 anchorEl + open/onClose 的模式,MUI 将复杂的定位逻辑封装在内部,同时将显示和隐藏的控制权交给了开发者,这既灵活又符合 React 的最佳实践。

menu的功能实现,搞懂上面的原理之后就不难了,就是里面为了兼容无障碍,弄在一起就很复杂了。

案例:新增一个resources按钮,在点击这个按钮的时候,出现menu。

下面是纯粹功能的实现,没有报错:

效果:

在官方文档和老师的讲解中,button和menu都加上了id,button加上了aria相关的属性,这些属性是干什么的呢?

这是一个非常好的问题,它触及了现代前端开发中的一个核心概念:Web 无障碍性(Accessibility,简称 A11y)

在您之前看到的 Menu 示例中,给 ButtonMenu 加上 idaria- 属性,主要是为了确保使用屏幕阅读器键盘导航的用户能够理解和操作这个菜单。

1. 🔑 为什么需要 id 属性?

在这个特定的 Button/Menu 组合场景中,id 的作用是建立一个可识别的连接

2. ♿ Button 上的 aria- 属性及其含义

aria- 属性是 WAI-ARIA (Web Accessibility Initiative - Accessible Rich Internet Applications) 标准的一部分。它们不改变组件的外观,但会向屏幕阅读器等辅助技术传达关于组件的角色、状态和属性的信息。

在您的 Button 示例中,常见的 ARIA 属性及其含义如下:

ARIA 属性含义 (作用)屏幕阅读器读出 (示例)
aria-controls指向一个由当前元素控制或分组的元素的 id“菜单按钮,控制 [菜单ID]
aria-haspopup表示该元素会弹出一个浮动元素(如菜单、对话框)。“菜单按钮,有弹出菜单”
aria-expanded表示它控制的可展开元素当前的状态(是否展开)。opentrue 时读出:“展开

详细解释:

总结:

这些 idaria- 属性的复杂性,正是 MUI 致力于实现高质量无障碍性的体现。它们是确保任何用户,无论是否有残障,都能有效使用您的 Web 应用界面的关键。

如果对anchor position不是很理解,可以参考官网:https://mui.com/material-ui/react-popover/#anchor-playground

23 - Link

The Link component allows you to easily customize anchor elements with your theme colors and typography styles.

Link组件可以用在breadcrumbs中。

image-20251030155256827

 

24 - Breadcrumbs

A breadcrumbs is a list of links that help visualize a page's location within a site's hierarchical structure, it allows navigation up to any of the ancestors.

基本用法

效果:

 

一些属性

separator属性指定分隔符。

可以指定为字符。

image-20251030161249260

 

可以指定为icon图标

image-20251030161410611

maxItems指定有几个item显示

可以看到,只有两个Item显示了,并且点击省略号之后会显示全部。

25 - Drawer

The navigation drawers (or "sidebars") provide ergonomic access to destinations in a site or app functionality such as switching accounts.

导航抽屉(或侧边栏)提供符合人体工程学的访问方式,方便用户访问网站或应用程序的功能,例如切换账户。

mui里面的drawer不单单只是抽屉,还包括(临时的或永久的)侧边栏,就类似CRM里面的侧边菜单栏,这一点要记住。

现在只学习简单的抽屉。

效果:

26 - Speed Dial

When pressed, a floating action button can display three to six related actions in the form of a Speed Dial.

按下后,一个浮动操作按钮可以以快速拨号的形式显示三到六个相关操作。根据老师的说法,这个组件更适合移动端。

就是下面这种组件:

使用模拟手机端的屏幕来看效果:

在显示action buttons之后,更换speeddial里面的图标:

27 - Bottom Navigation

这个组件比较适合手机或平板页面,类似于app里面的底部导航栏。

28 - Avatar

第28-33节,是data display相关的内容。

image-20251030192507506

29 - Badge

Badge generates a small badge to the top-right of its child(ren).

这句话说明了,badge要显示在某个元素右上角,那么需要使用Badge组件来包裹这个元素,而不是相反。

效果:

image-20251030193926502

30 - List

Lists are continuous, vertical indexes of text or images.

List组件还是蛮重要的,单纯的用List好像没有必要,就好像我之前写vue项目的时候,遇到垂直方向上很多item的情况,都是直接div+v-for。

不能再像那样写代码了,能够用到UI组件的地方,就要想到UI组件,因为这些组件绑定了很多样式和方法,直接使用会更加简单,别人看代码也更容易理解。

List可以做侧边栏或菜单栏:

image-20251030195315432

可以做选项列表:

image-20251030195359997

总之,遇到垂直方向上很多item的,就要想到使用List。

List涉及到的组件特别多,到时候参考文档即可。

image-20251030195907757

31 - Chip

Chips are compact elements that represent an input, attribute, or action.Chips allow users to enter information, make selections, filter content, or trigger actions.

chip,可以翻译为字片,是一种紧凑、可交互的元素,主要用于表示信息片段、用户选择、属性标签或简短操作。最常见的就是多选框中,如果选择了某些项,那么就会以chip的方式显示在多选框中。

chips也可以用来显示属性,比如说我会哪些技能,html、css、javascript、typescript、react、vue等等就可以用chips来展现。

效果: