此文档描述了当前开发者实现弹幕的方式,并且提出一个新的 Web 接口以在浏览器中更轻便地实现弹幕功能。
这是一份进行中的提案草稿。欢迎参加 W3C 弹幕社区组关于弹幕的相关讨论。
本文档使用了如下术语:
当前开发者实现弹幕主要有如下两种方式:
clearRect
方法清空画布、计算弹幕在下一帧的位置、在新位置绘制弹幕。如:<div>danmaku</div>
transform
和 transition
两个 CSS 属性的作用下向左运动。如:transform
属性设为当前位置,同时把 transition
属性时间设为 0,就实现了把弹幕固定在当前位置。如:性能较好,配合WebGL可以提升应用性能,同时可以同时显示大量的弹幕文字。
不够灵活,显示文字+图像的弹幕比较麻烦;对单独某条弹幕进行暂停比较繁琐。同时在移动设备上需要考虑Canvas分辨率的问题,比如文字发虚等。
简单灵活,可以通过DOM绘制丰富的弹幕样式,比如图像和文字的组合。用户可以单独暂停某一个感兴趣的弹幕。
弹幕较多时会生成的大量的DOM,消耗更多的内存,容易导致页面卡顿。同时需要对弹幕展示进行特定的优化,比如在弹幕消失,需要删除对应的DOM。
本章的内容仍在媒体和娱乐兴趣组讨论,如果您有任何问题或内容更正,您可以在本文档的 GitHub 库中发一个新 issue 或发送电子邮件至 public-web-and-tv@w3.org。
弹幕采用全新的标签元素bulletchatlist
和bulletchat
,新增的弹幕标签元素不是video
或者audio
等元素的子元素。从“使用场景”可以看到,弹幕不仅只是和视频等媒体元素有关联,在“Web页面”或者“互动上墙”等场景下弹幕是独立作为页面的一部分存在,不依赖于视频等元素。
弹幕规范描述了弹幕绘制方式,不包括外部列表。由于弹幕不依赖于video
,因此不要求有弹幕列表。在常见的点播视频弹幕场景中,往往有一个类似[[webvtt1]]这样同步视频时间轴的弹幕列表,
这种情况需要由开发者根据视频时间添加bulletchat
。
bulletchatlist
为块元素,bulletchat
为行内元素。bulletchat
元素允许嵌套内容内容包括:文本、图片、超链接。
area
:定义弹幕显示区域占 bulletchatlist 总高度的百分比,范围 0-100,50为半屏,100为满屏。滚动弹幕、顶部弹幕、逆向滚动显示区域从 bulletchatlist 顶部开始计算,底部弹幕显示区域从 bulletchatlist 底部开始计算。allowOverlap
:定义超出显示区域的弹幕是否允许重叠。false
表示不展示超出显示区域弹幕,true
则表示超出显示区域弹幕会进行重叠展示。
mode
:定义弹幕类型,可选值为scroll
、top
、bottom
以及reverse
。
scroll
为默认值,表示滚动弹幕。弹幕会从左往右进行滚动,滚动时间由CSS
属性bulletchat-duration
控制。显示时间规则为:bulletchat
元素的最左侧进入bulletchatlist
元素显示区域到
bulletchat
元素最右侧从bulletchatlist
元素显示区域消失所消耗的时间。
top
表示顶部弹幕。
bottom
表示底部弹幕。
reverse
表示逆向滚动弹幕。弹幕会从右往左进行滚动,滚动时间与scroll
类似。
bulletchatstart
:弹幕动画开始时触发。bulletchatend
:弹幕动画结束时触发。bulletchatcancel
:弹幕意外终止时触发,如弹幕被移除或被隐藏,或因为超出显示区域不被展示。bulletchat-play-state
:running | paused,定义弹幕状态为运行或暂停,可继承。bulletchat-duration
:<time>,单位为秒(s)或者毫秒(ms),定义弹幕播放速度,可继承。bulletchat-play-state
:running | paused,定义弹幕状态为运行或者暂停,可继承。bulletchat-duration
:<time>,单位为秒(s)或者毫秒(ms),定义弹幕播放速度,可继承。bulletchat-delay
:<time>,单位为秒(s)或者毫秒(ms),定义弹幕动画于何时开始,定义一个负值可以实现一个弹幕从中间开始运动。