当前位置:首页 > React

react实现翻牌抽奖活动

2026-01-27 12:19:42React

实现翻牌抽奖的基本思路

翻牌抽奖活动的核心是通过点击卡片触发翻转动画,展示奖品信息。React中可通过状态管理控制翻转状态,结合CSS动画实现视觉效果。

核心代码结构

import React, { useState } from 'react';
import './FlipCard.css';

const FlipCard = () => {
  const [flipped, setFlipped] = useState(false);
  const [prize, setPrize] = useState('');

  const prizes = ['一等奖', '二等奖', '谢谢参与', '优惠券'];

  const handleFlip = () => {
    if (!flipped) {
      const randomPrize = prizes[Math.floor(Math.random() * prizes.length)];
      setPrize(randomPrize);
    }
    setFlipped(!flipped);
  };

  return (
    <div className={`flip-card ${flipped ? 'flipped' : ''}`} onClick={handleFlip}>
      <div className="flip-card-inner">
        <div className="flip-card-front">
          <div className="card-content">点击抽奖</div>
        </div>
        <div className="flip-card-back">
          <div className="card-content">{prize}</div>
        </div>
      </div>
    </div>
  );
};

配套CSS样式

.flip-card {
  perspective: 1000px;
  width: 200px;
  height: 300px;
  margin: 20px;
}

.flip-card-inner {
  position: relative;
  width: 100%;
  height: 100%;
  transition: transform 0.6s;
  transform-style: preserve-3d;
}

.flip-card.flipped .flip-card-inner {
  transform: rotateY(180deg);
}

.flip-card-front, .flip-card-back {
  position: absolute;
  width: 100%;
  height: 100%;
  backface-visibility: hidden;
  display: flex;
  justify-content: center;
  align-items: center;
  border-radius: 10px;
  box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}

.flip-card-front {
  background-color: #ff4757;
  color: white;
}

.flip-card-back {
  background-color: #70a1ff;
  color: white;
  transform: rotateY(180deg);
}

.card-content {
  font-size: 24px;
  font-weight: bold;
}

多卡片布局实现

对于多个抽奖卡片的情况,可将单个卡片组件化:

const PrizeWall = () => {
  return (
    <div className="prize-wall">
      <FlipCard />
      <FlipCard />
      <FlipCard />
    </div>
  );
};

配套CSS:

.prize-wall {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}

高级功能扩展

添加抽奖限制逻辑,防止重复抽奖:

const [hasDrawn, setHasDrawn] = useState(false);

const handleFlip = () => {
  if (hasDrawn) return;

  const randomPrize = prizes[Math.floor(Math.random() * prizes.length)];
  setPrize(randomPrize);
  setFlipped(true);
  setHasDrawn(true);
};

添加重置功能:

const handleReset = () => {
  setFlipped(false);
  setHasDrawn(false);
  setPrize('');
};

性能优化建议

使用React.memo优化卡片组件:

const MemoizedFlipCard = React.memo(FlipCard);

对于大量卡片的情况,考虑虚拟滚动技术:

import { FixedSizeList as List } from 'react-window';

const Row = ({ index, style }) => (
  <div style={style}>
    <FlipCard key={index} />
  </div>
);

const PrizeWall = () => (
  <List
    height={600}
    itemCount={100}
    itemSize={320}
    width={800}
  >
    {Row}
  </List>
);

动画增强方案

使用CSS变量控制动画速度:

.flip-card {
  --flip-duration: 0.6s;
}

.flip-card-inner {
  transition: transform var(--flip-duration);
}

添加弹簧动画效果:

react实现翻牌抽奖活动

.flip-card-inner {
  transition: transform 0.6s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}

分享给朋友:

相关文章

react 如何调试

react 如何调试

调试 React 应用的方法 使用 React Developer Tools 安装 Chrome 或 Firefox 的 React Developer Tools 扩展,可以检查组件树、状态和 p…

react如何开发

react如何开发

React 开发基础步骤 安装 Node.js 和 npm/yarn 确保系统已安装 Node.js(包含 npm)或 Yarn。React 项目依赖这些工具管理包和运行脚本。官方推荐使用 Node.…

react如何安装

react如何安装

安装React的步骤 确保已安装Node.js(建议版本12或更高),可通过以下命令检查版本: node -v npm -v 使用Create React App快速搭建项目(推荐): npx c…

react 如何启动

react 如何启动

创建 React 项目 使用官方工具 create-react-app 快速初始化项目,需提前安装 Node.js(版本 ≥ 14.0.0)和 npm/yarn: npx create-react-…

react如何调度

react如何调度

React 调度机制概述 React 的调度机制通过 Fiber 架构 和 Scheduler 模块实现任务优先级管理与时间切片(Time Slicing),确保高优先级更新(如用户交互)能快速响应,…

react如何重启

react如何重启

重启 React 应用的方法 重新加载当前页面 使用 window.location.reload() 强制刷新页面,这会重新加载整个应用并重置所有状态。 window.location…