MUI Grid双列布局卡片点击展开时相邻卡片同步拉伸问题
问题原因
这是Flex布局的默认拉伸特性+现有样式设置共同导致的,和JS交互逻辑无关:
- MUI Grid容器默认采用Flex布局,同一行的Grid子项默认
align-items: stretch,会自动拉伸到和当前行最高的子项保持一致高度 - 你给Card组件设置了
height: 100%,会自动撑满父级Grid item的全部高度 - 点击卡片展开时,当前卡片内容变高把所在Grid item撑高,同排相邻的Grid item被Flex规则拉伸到同等高度,内部的Card因为
height:100%也跟着被拉长,就出现了同步变高的问题。
解决方法
改动最小的方案是给每个包裹Card的Grid item添加alignSelf: "start"属性,让Grid子项高度只跟随自身内容决定,不被同排其他元素的高度拉伸:
// 找到ExamoCard组件最外层的Grid item,添加sx配置 <Grid item xs={12} lg={6} sx={{ alignSelf: "start" }} // 新增这一行即可 > <Card // 原有Card属性全部保留,不需要删除height:100%配置 > {/* 原有卡片内容保持不变 */} </Card> </Grid>
这个方案不需要改动现有展开逻辑,卡片收起状态下如果存在微小高度差,给Card加个固定minHeight就能保证排版整齐。
如果不需要收起状态下同排卡片强制等高,也可以直接删除Card样式里的height: "100%",同样能解决相邻卡片被拉伸的问题。
注意这个问题是CSS布局特性导致的,不需要写event.preventDefault()、拦截事件冒泡之类的JS逻辑,调整样式即可生效。另外你当前把expandedId状态写在每个ExamoCard组件内部、让卡片独立维护展开状态的写法是正常可用的,不需要额外把状态上提到父组件。
内容的提问来源于stack exchange,提问作者Nika
相关产品推荐
相关产品推荐

