You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React 17 + Material UI 实现点击后聚焦卡片列表指定卡片的方法

React + Material UI 卡片点击聚焦效果实现方案

核心实现思路

通过 React 状态管理当前选中的卡片唯一标识,点击卡片时更新状态,动态为匹配状态的卡片添加高亮聚焦样式,如需自动滚动到对应卡片可配合 ref 实现。

具体实现步骤

  • 步骤1:定义状态存储激活卡片ID,同时为每个卡片分配唯一标识
import { useState } from 'react';
// 假设你的卡片列表数据结构如下,每个卡片有唯一id
const cardList = [
  { id: 1, title: 'דף צביעה', image: cardImage },
  // 其他卡片数据
];

function YourComponent() {
  // 存储当前激活的卡片ID
  const [activeCardId, setActiveCardId] = useState(null);
  // 你的样式定义
  const classes = useStyles();
  • 步骤2:修改卡片渲染逻辑,绑定点击事件、动态添加激活样式
{cardList.map(card => (
  <Grid md={3} className={classes.card} key={card.id}>
    <Card 
      className={`${classes.root} ${activeCardId === card.id ? classes.activeCard : ''}`}
      style={{ cursor: "pointer" }}
      onClick={() => setActiveCardId(card.id)}
    >
      <CardHeader title={card.title} />
      <CardMedia
        className={classes.media}
        image={card.image}
        title="Paint"
      />
      <CardActions disableSpacing>
        <IconButton aria-label="add to favorites">
          <FavoriteIcon />
        </IconButton>
        <IconButton aria-label="share">
          <ShareIcon />
        </IconButton>
        <Button>הורדה</Button>
      </CardActions>
    </Card>
  </Grid>
))}
  • 步骤3:添加激活状态的聚焦样式(以MUI v4的makeStyles为例,v5可替换为styled写法,逻辑一致)
import { makeStyles } from '@material-ui/core/styles';

const useStyles = makeStyles(() => ({
  root: {
    // 原有卡片样式
    transition: 'all 0.3s ease', // 添加过渡动画效果更流畅
  },
  activeCard: {
    // 自定义聚焦效果,可根据需求调整参数
    border: '2px solid #1976d2',
    boxShadow: '0 0 12px rgba(25, 118, 210, 0.6)',
    transform: 'scale(1.02)',
  },
  // 其他原有样式
  media: {
    height: 0,
    paddingTop: '56.25%', // 16:9比例
  },
}));

可选扩展:点击后自动滚动到聚焦卡片

如果卡片列表较长,需要点击后自动滚动到选中卡片位置,可配合ref实现:

import { useRef } from 'react';

// 定义ref存储所有卡片的dom引用
const cardRefs = useRef({});

// 点击时添加滚动逻辑
const handleCardClick = (cardId) => {
  setActiveCardId(cardId);
  cardRefs.current[cardId]?.scrollIntoView({
    behavior: 'smooth',
    block: 'center',
  });
};

// 渲染时给每个Card绑定ref
<Card
  ref={el => cardRefs.current[card.id] = el}
  onClick={() => handleCardClick(card.id)}
  // 其他属性保持不变
/>

内容的提问来源于stack exchange,提问作者Yaniv Suriyano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:18:00