当前位置:首页 > 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:

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 示例:

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 实现示例:

react实现弹幕

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 如何引入css

react 如何引入css

在 React 中引入 CSS 的方法 React 提供了多种引入 CSS 的方式,可以根据项目需求选择合适的方法。以下是常见的几种方式: 内联样式 内联样式直接在组件中通过 style 属性定义,…

react如何清理

react如何清理

清理 React 项目的方法 清理未使用的依赖项 运行 npm prune 或 yarn install --production 可以移除 node_modules 中未在 package.json…

如何恢复react

如何恢复react

恢复 React 项目的方法 检查并修复依赖项 运行 npm install 或 yarn install 重新安装所有依赖项。如果依赖项损坏或缺失,这将恢复项目所需的库和工具。 恢复删除的文件 如…

react 如何算精通

react 如何算精通

精通 React 的标准 精通 React 不仅需要掌握基础语法和核心概念,还需具备解决复杂问题、优化性能和架构设计的能力。以下是衡量 React 精通程度的关键维度: 核心概念与机制 组件化开…

react如何启动6

react如何启动6

安装 Node.js 和 npm/yarn 确保系统中已安装 Node.js(建议版本 16 或更高)和 npm/yarn。可通过以下命令验证版本: node -v npm -v 创建 Reac…

react 如何设置 代理

react 如何设置 代理

在 React 中设置代理 在开发过程中,为了跨域请求后端 API,可以通过配置代理来解决。以下是几种常见的设置代理的方法: 使用 package.json 配置代理 在 package.json…