当前位置:首页 > React

react实现弹幕

2026-01-26 13:58:08React

React 实现弹幕功能

弹幕功能通常用于视频播放或直播场景,允许用户发送实时评论并显示在屏幕上。以下是使用 React 实现弹幕功能的几种方法:

使用 CSS 动画实现弹幕

通过 CSS 的 @keyframestransform 实现弹幕的横向移动效果:

import React, { useState, useEffect, useRef } from 'react';

const Danmu = () => {
  const [messages, setMessages] = useState([]);
  const [inputValue, setInputValue] = useState('');
  const containerRef = useRef(null);

  const handleSend = () => {
    if (inputValue.trim()) {
      setMessages([...messages, { text: inputValue, id: Date.now() }]);
      setInputValue('');
    }
  };

  return (
    <div className="danmu-container" ref={containerRef}>
      <div className="danmu-input">
        <input
          value={inputValue}
          onChange={(e) => setInputValue(e.target.value)}
          placeholder="输入弹幕内容"
        />
        <button onClick={handleSend}>发送</button>
      </div>
      <div className="danmu-display">
        {messages.map((msg) => (
          <div key={msg.id} className="danmu-item">
            {msg.text}
          </div>
        ))}
      </div>
    </div>
  );
};

export default Danmu;

对应的 CSS 样式:

.danmu-container {
  position: relative;
  width: 100%;
  height: 300px;
  overflow: hidden;
  background-color: #000;
}

.danmu-display {
  position: relative;
  height: 100%;
}

.danmu-item {
  position: absolute;
  color: #fff;
  white-space: nowrap;
  animation: move linear 10s;
}

@keyframes move {
  from {
    transform: translateX(100%);
  }
  to {
    transform: translateX(-100%);
  }
}

使用 WebSocket 实现实时弹幕

如果需要实现多人实时弹幕,可以结合 WebSocket:

react实现弹幕

import React, { useState, useEffect } from 'react';

const DanmuWithWebSocket = () => {
  const [messages, setMessages] = useState([]);
  const [inputValue, setInputValue] = useState('');
  const [socket, setSocket] = useState(null);

  useEffect(() => {
    const ws = new WebSocket('wss://your-websocket-server');
    ws.onmessage = (event) => {
      setMessages((prev) => [...prev, { text: event.data, id: Date.now() }]);
    };
    setSocket(ws);
    return () => ws.close();
  }, []);

  const handleSend = () => {
    if (inputValue.trim() && socket) {
      socket.send(inputValue);
      setInputValue('');
    }
  };

  return (
    <div className="danmu-container">
      {/* 同上 */}
    </div>
  );
};

export default DanmuWithWebSocket;

使用第三方库

如果需要更复杂的弹幕功能,可以考虑以下库:

  • rc-bullets: 专为 React 设计的弹幕组件库
  • danmaku: 通用的 JavaScript 弹幕库

安装 rc-bullets 示例:

react实现弹幕

npm install rc-bullets

使用示例:

import React from 'react';
import BulletScreen from 'rc-bullets';

const App = () => {
  const screenRef = useRef(null);

  useEffect(() => {
    const screen = new BulletScreen(screenRef.current, { trackCount: 5 });
    screen.push('Hello Danmu!');
  }, []);

  return <div ref={screenRef} style={{ width: '100%', height: '300px' }} />;
};

性能优化建议

弹幕数量较多时,需要注意性能优化:

  • 使用 requestAnimationFrame 替代 CSS 动画
  • 对弹幕进行虚拟滚动,只渲染可视区域内的弹幕
  • 定期清理已经移出屏幕的弹幕 DOM 节点
  • 使用 Canvas 渲染代替 DOM 渲染(适用于超大量弹幕)

Canvas 实现示例:

const DanmuCanvas = () => {
  const canvasRef = useRef(null);
  const [messages, setMessages] = useState([]);

  useEffect(() => {
    const canvas = canvasRef.current;
    const ctx = canvas.getContext('2d');

    const animate = () => {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      // 绘制所有弹幕
      messages.forEach((msg) => {
        ctx.fillStyle = msg.color || '#fff';
        ctx.font = '16px Arial';
        ctx.fillText(msg.text, msg.x, msg.y);
        msg.x -= 2; // 移动速度
      });
      requestAnimationFrame(animate);
    };

    animate();
  }, [messages]);

  // 添加弹幕逻辑...
};

以上方法可以根据具体需求选择或组合使用,CSS 动画适合简单场景,WebSocket 实现实时互动,Canvas 则适合高性能要求。

标签: 弹幕react
分享给朋友:

相关文章

react native如何启动

react native如何启动

React Native 启动步骤 确保已安装 Node.js(建议版本 14 或更高)和 npm/yarn。安装完成后,通过命令行工具执行以下操作。 初始化新项目 使用 React Native…

react中monent如何获取日期

react中monent如何获取日期

使用 Moment.js 获取当前日期 在 React 中通过 Moment.js 获取当前日期,可以直接调用 moment() 函数。它会返回包含当前日期和时间的 Moment 对象。 impo…

react 如何执行

react 如何执行

安装 Node.js 和 npm React 开发需要 Node.js 环境,因为它提供了 npm(或 yarn)包管理工具。从 Node.js 官网 下载并安装最新 LTS 版本。安装完成后,在终端…

react如何取消渲染

react如何取消渲染

取消渲染的方法 在React中,取消渲染通常指的是在某些条件下阻止组件渲染或中断正在进行的渲染过程。以下是几种常见的方法: 条件渲染 通过条件判断决定是否渲染组件或部分内容。可以使用if语句或三元…

如何生成react代码

如何生成react代码

使用 Create React App 生成项目 安装 Node.js 后,通过命令行工具运行以下命令创建新项目: npx create-react-app my-app cd my-app np…

如何react页面

如何react页面

创建 React 页面 使用 create-react-app 快速初始化项目: npx create-react-app my-app cd my-app npm start 基础页面结构 在…