{"_id":"a-barrage","_rev":"1-5a0cb375043263655787666558d661d3","name":"a-barrage","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"a-barrage","version":"0.0.1","description":"JavaScript Danmu(Barrage) Library","keywords":[],"main":"dist/barrage.umd.js","module":"dist/barrage.es5.js","typings":"dist/types/barrage.d.ts","private":false,"author":{"name":"everlastlucas","email":"everlastlucas@outlook.com"},"repository":{"type":"git","url":"git+https://github.com/logcas/a-barrage.git"},"license":"MIT","engines":{"node":">=6.0.0"},"scripts":{"lint":"tslint  --project tsconfig.json -t codeFrame 'src/**/*.ts' 'test/**/*.ts'","prebuild":"rimraf dist","build":"tsc --module commonjs && rollup -c rollup.config.ts && typedoc --out docs --target es6 --theme minimal --mode file src","start":"rollup -c rollup.config.ts -w","test":"jest --coverage","test:watch":"jest --coverage --watch","test:prod":"npm run lint && npm run test -- --no-cache","deploy-docs":"ts-node tools/gh-pages-publish","report-coverage":"cat ./coverage/lcov.info | coveralls","commit":"git-cz","semantic-release":"semantic-release","semantic-release-prepare":"ts-node tools/semantic-release-prepare","precommit":"lint-staged","travis-deploy-once":"travis-deploy-once","example":"webpack-dev-server --config=./example/webpack.config.js","build:demo":"webpack --config=./example/webpack.prod.js"},"lint-staged":{"{src,test}/**/*.ts":["prettier --write","git add"]},"config":{"commitizen":{"path":"node_modules/cz-conventional-changelog"}},"jest":{"transform":{".(ts|tsx)":"ts-jest"},"testEnvironment":"jsdom","testRegex":"(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$","moduleFileExtensions":["ts","tsx","js"],"coveragePathIgnorePatterns":["/node_modules/","/test/"],"coverageThreshold":{"global":{"branches":90,"functions":95,"lines":95,"statements":95}},"collectCoverageFrom":["src/**/*.{js,ts}"]},"prettier":{"semi":false,"singleQuote":true},"commitlint":{"extends":["@commitlint/config-conventional"]},"devDependencies":{"@babel/core":"^7.9.6","@babel/preset-env":"^7.9.6","@commitlint/cli":"^7.1.2","@commitlint/config-conventional":"^7.1.2","@types/jest":"^23.3.14","@types/node":"^10.11.0","babel-loader":"^8.1.0","colors":"^1.3.2","commitizen":"^3.0.0","coveralls":"^3.0.2","cross-env":"^5.2.0","cz-conventional-changelog":"^2.1.0","faker":"^4.1.0","html-webpack-plugin":"^4.3.0","husky":"^1.0.1","jest":"^23.6.0","jest-config":"^23.6.0","lint-staged":"^8.0.0","lodash.camelcase":"^4.3.0","prettier":"^1.14.3","prompt":"^1.0.0","replace-in-file":"^3.4.2","rimraf":"^2.6.2","rollup":"^0.67.0","rollup-plugin-commonjs":"^9.1.8","rollup-plugin-json":"^3.1.0","rollup-plugin-node-resolve":"^3.4.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.18.0","semantic-release":"^15.9.16","shelljs":"^0.8.3","travis-deploy-once":"^5.0.9","ts-jest":"^23.10.5","ts-node":"^7.0.1","tslint":"^5.11.0","tslint-config-prettier":"^1.15.0","tslint-config-standard":"^8.0.1","typedoc":"^0.12.0","typescript":"^3.0.3","webpack":"^4.43.0","webpack-cli":"^3.3.11","webpack-dev-server":"^3.11.0"},"gitHead":"150b611028d4ac19fa04dc6a2ba75cae1f4b028a","bugs":{"url":"https://github.com/logcas/a-barrage/issues"},"homepage":"https://github.com/logcas/a-barrage#readme","_id":"a-barrage@0.0.1","_nodeVersion":"14.5.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-VZbEiAogimFeVM3QROs3EBI4N/NYA19FPI/9KyssipHjfgRtoHUIs5HP85EaldGD/M8wY2Ng35pB15JwNqUNUg==","shasum":"9e252a275c21e92f9e321e06aa38360f7ca0bcf4","tarball":"https://registry.npmjs.org/a-barrage/-/a-barrage-0.0.1.tgz","fileCount":39,"unpackedSize":248006,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfT7dzCRA9TVsSAnZWagAAMrIP/2wjji7JvmZCeLwL+GNg\nSpWb9ofNuuztPRBOuS/PhBWiMyE+7Jfk3/4zAtnLp0ZFU/eU2+h8mx8XHP/a\nnYYk4z0hfExivZMEe1WGdzKVji1xQKqgYVhxW37AgY9w/mt84G7sX83xm5RZ\nsETr0oduOxTHY2Y3r+fHQItJsQvIfBfBvGhtspehSYh0YqlkOCh5KgexvGwl\nlsW6Qf9VhSaB1FUMgd6CckQxQqYSfOJs8IZYyjJjom3g6MNJDreK/a2ZgWEw\nMesH5ArYZRZhbTS5mpa4wP/2abbW2IsdV7Q+CwUCad6o1UCOYxA6xLdsq9JR\n8ReD7kPyMHU3cofjzZgci+Ug0bAlsT1Cl1MI6ZuJdtsijS1uAQVRdjFd+XN4\nYj0H2+9vYbWhE+5feSfYnh1ZNgaw3ieFr7aAptsgFida4k2GHdXm4I9AQSNp\neetfh+cUoZBeIelJTSq30ZtDx2uSZFKC3Qr0Ae57cpA/KWBIMqK24H2Vnjfg\nfxuUVvAfIoAITeYn5QK5CoMuO8aezmXlMNi/hyXohpbVp9MOCYmIpq/5jcsW\n1SLWx1eM4A60zRitEyrg2xwm3eTx2hX2r3Y55AgrG1kWKsCwonbWmn7SN9lz\nI5YyYXtoLvNgud2KN0vIfPDBJbqD4Ddt0CSafqSBfjoklDT/PuYAuBMjinFf\noNcM\r\n=0p2Q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD10qF3diYn7S6gqXkTp0nXtluiu6fmvxNmbenZFPfX0gIhANVmcftYNe0UH3geDepS4vI03ym3MvSaj4jDFbY5nyZx"}]},"maintainers":[{"name":"everlastlucas","email":"everlastlucas@outlook.com"}],"_npmUser":{"name":"everlastlucas","email":"everlastlucas@outlook.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/a-barrage_0.0.1_1599059826951_0.08352792345665261"},"_hasShrinkwrap":false}},"time":{"created":"2020-09-02T15:17:06.951Z","0.0.1":"2020-09-02T15:17:07.133Z","modified":"2022-04-11T12:17:29.803Z"},"maintainers":[{"name":"everlastlucas","email":"everlastlucas@outlook.com"}],"description":"JavaScript Danmu(Barrage) Library","homepage":"https://github.com/logcas/a-barrage#readme","keywords":[],"repository":{"type":"git","url":"git+https://github.com/logcas/a-barrage.git"},"author":{"name":"everlastlucas","email":"everlastlucas@outlook.com"},"bugs":{"url":"https://github.com/logcas/a-barrage/issues"},"license":"MIT","readme":"# <p align=\"center\">A-Barrage</p>\n<p align=\"center\">高性能JavaScript弹幕库</p>\n\n## 🎦 Live Demo\nhttps://logcas.github.io/a-barrage/example/\n\n## 🧐 如何使用\n\n`A-Barrage`同时支持`Canvas`渲染和`HTML+CSS`的渲染模式，你可以根据实际情况采用不同的渲染引擎进行弹幕的渲染。其中，`Canvas`是非交互式渲染，也就是说，采用`Canvas`渲染的弹幕并不会有任何的交互操作，纯展示性质；`HTML+CSS`是交互式渲染，如果你的网站允许用户与弹幕之间进行一些交互（如点赞、回复等），那么可以采用`HTML+CSS`的渲染模式，它会结合浏览器的DOM事件进行响应。\n\n`A-Barrage`默认使用的是`Canvas`渲染模式。\n\n### 🎞 使用`Canvas`进行弹幕渲染\n\n采用`Canvas`渲染，即意味着你需要在模板中提供一个`<canvas>`元素：\n\n```html\n<canvas id=\"danmu\"></canvas>\n```\n\n然后，实例化一个`ABarrage`对象，同时传入`canvas`元素：\n\n```js\nnew ABarrage(\n  '#danmu',\n  config\n)\n```\n\n其中，`config`对象支持如下属性（全部都是可选的，如下值为默认值）：\n\n```js\nconfig = {\n  engine: 'canvas', // 渲染引擎 canvas 或 css3 可选\n  zoom: 1, // 文字缩放比\n  proxyObject: null, // 事件代理触发对象\n  usePointerEvents: true, // 屏蔽弹幕画布的点击事件\n  maxTrack: 4, // 最大轨道数\n  fontSize: 20, // 文字大小，单位为px\n  fontColor: '#fff', // 文字颜色\n  duration: 10000, // 弹幕留存时间\n  trackHeight: 20 * 1.5 // 轨道高度，默认为默认文字的1.5倍\n}\n```\n\n### ⛱ 使用`HTML+CSS`进行弹幕渲染\n\n采用`HTML+CSS`渲染，你需要做的是准备一个`<div>`元素就好：\n\n```html\n<div id=\"container\">\n  <div id=\"danmu\"></div>\n  <video/>\n</div>\n```\n\n然后，实例化一个`ABarrage`对象，同时传入`div`元素：\n\n```js\nnew ABarrage(\n  '#danmu',\n  config\n)\n```\n\n其中，`config`对象支持如下属性（全部都是可选的，如下值为默认值）：\n\n```js\nconfig = {\n  engine: 'css3', // 渲染引擎 canvas 或 css3 可选\n  zoom: 1, // 文字缩放比\n  proxyObject: null, // 事件代理触发对象\n  usePointerEvents: true, // 屏蔽弹幕画布的点击事件\n  maxTrack: 4, // 最大轨道数\n  fontSize: 20, // 文字大小，单位为px\n  fontColor: '#fff', // 文字颜色\n  duration: 10000, // 弹幕留存时间\n  trackHeight: 20 * 1.5, // 轨道高度，默认为默认文字的1.5倍\n  wrapper: document.querySelector('#container') // wrapper 用于弹幕交互的事件代理，如果需要交互，则必须传入\n}\n```\n\n### 通用步骤\n\n然后，可以通过`add()`方法添加弹幕：\n```js\n// 添加滚动弹幕\ninstance.add(danmu, 'scroll')\n\n// 添加固定在顶部的弹幕\ninstance.add(danmu, 'fixed-top')\n\n// 添加固定在底部的弹幕\ninstance.add(danmu, 'fixed-bottom')\n```\n\n其中，第一个参数是一个`RawBarrageObject`对象，它的类型是这样的：\n\n```js\nRawBarrageObject {\n  text: string //  文本 \n  color?: string // 颜色，可选\n  size?: number // 字体大小，可选\n}\n```\n\n第二个参数也是可选的，默认为`scroll`，即滚动弹幕。顶部弹幕和底部弹幕分别为：`fixed-top`、`fixed-bottom`。\n\n## 📅 事件机制\n\n首先，为了弹幕的正常显示，你必须拥有这样的层级：\n```\n------用户视觉-------\n   👇  👇  👇  👇\n--------弹幕--------\n-------播放器-------\n```\n\n以上层级的HTML结构一般是这样的：\n```html\n<div id=\"container\">\n  <video/>\n  <canvas id=\"danmu\"></canvas>\n<div>\n```\n\n这样会造成一个问题，因为弹幕元素和播放器元素是兄弟元素结点，所以，当点击弹幕时，事件并无法传达到播放器上。\n\n为了解决事件被阻挡的问题，这里主要使用了两种方法：\n1. `pointer-events:none`\n2. 事件代理\n\n### `usePointerEvent`\n配置选项中的`usePointerEvent`默认为`true`，也就是默认状态下会为画布元素添加该CSS属性。这样的话画布元素就不会成为鼠标事件的`target`，那么鼠标事件就会从下一层的元素开始触发。\n\n但是这个属性有兼容性问题，对于IE仅支持IE11+的浏览器，其余浏览器的最新版本基本已支持。\n\n综上，所以有了事件代理机制。\n\n### 事件代理\n`ABarrage`类是继承自`EventEmitter`的，因此它也是一个事件中心，拥有`$on`、`$once`、`$emit`、`$off`等方法。\n\n对于`click`、`dblclick`、`mousedown`、`mousemove`、`mouseout`、`mouseover`、`mouseup`这几个鼠标事件，当画布触发这些事件时，会调用`$emit`同步触发通过`$on`绑定的事件处理器。\n\n除此之外，你也可以添加自定义事件。\n\n## 🔎 API\n### add(barrage[, type])\n其中，`barrage`是一个`RawBarrageObject`对象，它的结构是这样的：\n```js\n{\n  text: string,\n  color?: string,\n  size?: number\n}\n```\n\n`type`可选`scroll`、`fixed-top`、`fixed-bottom`，分别代表滚动弹幕、固定顶部弹幕、底部弹幕。默认为`scroll`。\n\n### start()\n弹幕开始\n\n### stop()\n弹幕暂停\n\n### resize([,width])\n宽度会影响弹幕轨道的宽度，当`canvas`的宽度更改时，务必调用该方法更新轨道宽度。\n\n### clear()\n清空弹幕\n\n### setOpacity(opacity = 1)\n设置弹幕文字的不透明度，默认为`1`，即不透明。取值区间为`[0,1]`。\n\n### setFontSize(zoom = 1)\n全局设置文字的缩放大小。需要注意的是，`setFontSize`并不会改变实话配置中的`fontSize`大小，而是通过设置`config.zoom`（缩放比率）的方式更改输出文字的大小。默认为`1`。\n\n### $on(eventName, handler)\n绑定事件处理器。\n\n### $once(eventName, handler)\n绑定事件处理器，但它只会执行一次。\n\n### $off(eventName[, handler])\n接触事件处理器，当`handler`不传时，会消除`eventName`事件的所有回调。\n\n### $emit(eventName[, ...args])\n触发事件处理器，从第二个参数开始可以传入回调函数的参数。\n\n### onBarrageHover(handler) `***仅作用于HTML+CSS渲染***`\n当鼠标定位到某个弹幕时触发，`handler`回调函数的参数分别为：弹幕实例、弹幕对应的DOM元素。\n\n### onBarrageBlur(handler) `***仅作用于HTML+CSS渲染***`\n当鼠标从某个弹幕移出时触发，`handler`回调函数的参数分别为：弹幕实例、弹幕对应的DOM元素。\n\n### onBarrageClick(handler) `***仅作用于HTML+CSS渲染***`\n当鼠标点击某个弹幕时触发，`handler`回调函数的参数分别为：弹幕实例、弹幕对应的DOM元素。\n\n## License\nMIT","readmeFilename":"README.md"}