Giter VIP home page Giter VIP logo

rc-bullets's Introduction

React 弹幕

🌈 基于 CSS3 Animation,使用 React 构建,可扩展,高性能。

⚠️ 该类库已基本不维护,如有迭代需求,请移步TS版本:https://github.com/slatejack/rc-bullets-ts

NPM NPM downloads twitter

演示地址

👉zerosoul.github.io/rc-bullets/

demo gif

安装

npm:

npm install --save rc-bullets

yarn:

yarn add rc-bullets

初始化一个简单的弹幕场景

import React, { useEffect, useState } from 'react';
import BulletScreen, { StyledBullet } from 'rc-bullets';

const headUrl='https://zerosoul.github.io/rc-bullets/assets/img/heads/girl.jpg';
export default function Demo() {
  // 弹幕屏幕
  const [screen, setScreen] = useState(null);
  // 弹幕内容
  const [bullet, setBullet] = useState('');
  useEffect(() => {
    // 给页面中某个元素初始化弹幕屏幕,一般为一个大区块。此处的配置项全局生效
    let s = new BulletScreen('.screen',{duration:20});
    // or
    // let s=new BulletScreen(document.querySelector('.screen));
    setScreen(s);
  }, []);
  // 弹幕内容输入事件处理
  const handleChange = ({ target: { value } }) => {
    setBullet(value);
  };
  // 发送弹幕
  const handleSend = () => {
    if (bullet) {
      // push 纯文本
      screen.push(bullet);
      // or 使用 StyledBullet

      screen.push(
        <StyledBullet
          head={headUrl}
          msg={bullet}
          backgroundColor={'#fff'}
          size='large'
        />
      );
      // or 还可以这样使用,效果等同使用 StyledBullet 组件
      screen.push({msg:bullet,head:headUrl,color:"#eee" size="large" backgroundColor:"rgba(2,2,2,.3)"})
    }
  };
  return (
    <main>
      <div className="screen" style={{ width: '100vw', height: '80vh' }}></div>
      <input value={bullet} onChange={handleChange} />
      <button onClick={handleSend}>发送</button>
    </main>
  );
}

特性

  • 支持传入 React 组件,灵活控制弹幕内容和 UI,并提供一个默认样式组件:<StyledBullet/>
  • 弹幕屏幕管理:清屏,暂停,隐藏(后续可能会加入针对单个弹幕的控制)
  • 弹幕动画参数化:运动函数(匀速/ease/步进/cubic-bezier)、时长(秒)、循环次数、延迟等
  • 鼠标悬浮弹幕暂停

常用 API

  • 初始化弹幕屏幕:const screen = new BulletScreen(<queryString>|<HTMLElement>,[<option>]),此处的option和下面的一致,偏向全局初始化,没有则使用默认值,每次发送弹幕不传则使用默认或全局设置,传了则该条弹幕覆盖全局设置。
  • 发送弹幕:const bulletId = screen.push(<string>|<ReactElement>,[<option>])

option

选项 含义 值类型 默认值 备注
top 弹幕位置 string undefined 自已强制定制距离顶部的高度,格式同 CSS 中的 top
trackHeight 轨道高度 number 50 均分轨道的高度
onStart 自定义动画开始函数 function null e.g.(bulletId,screen)=>{//do something}可以自定义一些动作,比如播放某个音效,在特定时间暂停该弹幕:screen.pause(bulletId)
onEnd 自定义动画结束函数 function null e.g.(bulletId,screen)=>{//do something}可以自定义一些动作,比如播放某个音效
pauseOnClick 鼠标点击暂停 boolean false 再次点击继续
pauseOnHover 鼠标悬停暂停 boolean true 鼠标进入暂停,离开继续
loopCount 循环次数 number/string 1 值为‘infinite’时,表示无限循环
duration 滚动时长 number/string 10 数字则单位为‘秒’,字符串则支持'10s'和'300ms'两种单位
delay 延迟 number/string 0 数字则单位为‘秒’,字符串则支持'10s'和'300ms'两种单位
direction 动画方向 string normal animation-direction支持的所有值
animateTimeFun 动画函数 string linear:匀速 animation-timing-function支持的所有值
  • 弹幕清屏:screen.clear([<bulletId>]),无参则清除全部
  • 暂停弹幕:screen.pause([<bulletId>]),无参则暂停全部
  • 弹幕继续:screen.resume([<bulletId>]),无参则继续全部
  • 隐藏弹幕(滚动继续):screen.hide([<bulletId>]),无参则隐藏全部
  • 显示弹幕:screen.show([<bulletId>]),无参则显示全部
  • 自带的一个弹幕样式组件:<StyledBullet msg="<弹幕内容>" head="<头像地址>" color="<字体颜色>" backgroundColor="<背景色>" size="<尺寸:small|normal|large|huge|自定义大小,基于em机制,默认normal>">

TO DO

  • 弹幕过多时,防重叠处理
  • react hooks 版本:useBulletScreen

自己动手,丰衣足食

克隆项目

git clone https://github.com/zerosoul/rc-bullets.git && cd rc-bullets

本地类库构建

npm i && npm run start

本地 demo

cd example && npm i && npm run start

支持

赞赏码

License

MIT © zerosoul

rc-bullets's People

Contributors

nishikinocurtis avatar zerosoul avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

rc-bullets's Issues

返回ObjectHTML Collection问题

您好,我是刚刚接触react的,我在new BulletScreen()添加屏幕的的HTMLElement时,一直返回的是Object HTMLCollection,所以一直抛出The display target of the barrage must be set。请问怎样才能解决这个问题呢,我明明选中的是一个

关于支持vue

是否考虑扩展vue组件,目前国内一般用vue的相对较多,个人项目尤甚,如果可以扩展支持vue,我想使用的人会等多。

如何修改字体大小?

你好,我想把你的弹幕变得很大很大,只有三行那种。我发现在rc-bullet的index里修改fontSize没有变化。我是一个js新手,能否指点一下,谢谢!

引用到Chrome extension中弹幕不显示

const danmuContainer = () => { // 弹幕屏幕 const [screen, setScreen] = useState(null); // 弹幕内容 const [bullet, setBullet] = useState(""); const ref = useRef(null) useEffect(() => { let s = new BulletScreen(ref.current,{duration:10}); setScreen(s); }, []); // 弹幕内容输入事件处理 const handleChange = ({ target: { value } }) => { setBullet(value); }; // 发送弹幕 const handleSend = () => { if (bullet) { // push 纯文本 screen.push(bullet); } }; return ( <div className={style.danmu_container_root}> <div ref={ref} className={style.screen}></div> <input value={bullet} onChange={handleChange} /> <button onClick={handleSend}>发送</button> </div> ); };

image

防止重叠

大神超级厉害的,效果超好,不过想问问如何防止多个弹幕重叠呢?

duration 控制弹幕运动时长

duration ,这个参数好像只能控制一条弹幕在屏幕中的出现时长,,,如果两条弹幕,一条字很多,一条字很少,两个弹幕的运动速度会不一样,会出现重叠,字数越多,运动速度越快,,,可不可以让每条弹幕的运动速度一样

请问一下是否有做左右的防遮挡

demo预览的时候发现弹幕长度不一的时候,同一轨道内会发生遮盖,但是看todo里写了弹幕过多的遮盖问题做了处理,所以是demo和现在的代码版本不一致吗?

弹幕显示卡顿

您好,在本地使用和在您的项目官网上,都肉眼可见的卡顿,请有空维护一下。

在 ios 或 Safari 上这个地方会有问题

if (intersectionRatio === 1) {

image

在 ios 或电脑端 Safari 里面,上面的判断会造成 this.tracks 全为false,因为它没有进到这个判断里

在 ios 里如果手机息屏之后再点亮好像还有点问题,弹幕也会停止,我现在没法debugger ios,还没找到问题

其实我没太看懂您这里的判断逻辑,我只是把这个判断条件去除了,就好了


if (intersectionRatio === 1) {

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.