博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HTML5 canvas实现的静态循环滚动播放弹幕
阅读量:2353 次
发布时间:2019-05-10

本文共 5253 字,大约阅读时间需要 17 分钟。

使用方法和API

语法如下:

canvasBarrage(canvas, data);

其中:

canvas

canvas 表示我们的 <canvas> 画布元素,可以直接是DOM元素,也可以是 <canvas> 画布元素的选择器。

data

data 表示弹幕数据,是一个数组。例如下面:

1

2
3
4
5
6
7
8
9
[{
    value: '弹幕1',
    color: 'blue',
    range: [0, 0.5]
}, {
    value: '弹幕2',
    color: 'red',
    range: [0.5, 1]
}]
可以看到数组中的每一个值表示一个弹幕的信息对象。其中 value 表示弹幕的文字内容; color 表示弹幕描边的颜色(弹幕文字本身默认是白色); range 表示弹幕在画布中的区域范围,例如 [0, 0.5] 表示弹幕在画布中的上半区域显示, [0.5, 1] 表示弹幕在画布中的下半区域显示。

然后就可以看到无限滚动的弹幕效果了。

补充说明:

此弹幕效果默认文字大小是 28px ,并且文字加粗,如果这个效果不符合您的需求,需要在 canvasBarrage() 方法中修改源代码。因为本来就是个简单静态效果,因此没有专门设计成API。
此弹幕效果默认是白色文字加可变颜色描边,同样的,如果这个效果不符合您的需求,需要在 canvasBarrage() 方法中修改源代码。
跟真实的弹幕效果有所不同,这里的弹幕出现的速度和时机不是基于特定时间,而是随机产生。所以看到有些文字好像开飞机,而有些文字好像坐着拖拉机。因为是死数据,这样设计会看上去更真实写。
源代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
<style>
    .video-x {
        position: relative;
        width: 640px;
        margin: auto;
    }
 
    .canvas-barrage {
        position: absolute;
        width: 640px;
        height: 360px;
    }
    .video-placeholder {
        height: 360px;
        background-color: #000;
        animation: bgColor 10s infinite alternate;
    }
    @keyframes bgColor {
        25% {
            background-color: darkred;
        }
        50% {
            background-color: darkgreen;
        }
        75% {
            background-color: darkblue;
        }
        100% {
            background-color: sliver;
        }
    }
    </style>
     
    <div class="video-x">
        <canvas id="canvasBarrage" class="canvas-barrage"></canvas>
        <div class="video-placeholder"></div>
    </div>
     
    <script>
        // 弹幕数据
        var dataBarrage = [{
            value: '使用的是静态死数据',
            color: 'blue',
            range: [0, 0.5]
        }, {
            value: '随机循环播放',
            color: 'blue',
            range: [0, 0.6]
        }, {
            value: '可以控制区域和垂直分布范围',
            color: 'blue',
            range: [0, 0.5]
        }, {
            value: '字体大小和速度在方法内设置',
            color: 'black',
            range: [0.1, 1]
        }, {
            value: '适合用在一些静态页面上',
            color: 'black',
            range: [0.2, 1]
        }, {
            value: '基于canvas实现',
            color: 'black',
            range: [0.2, 0.9]
        }, {
            value: '因此IE9+浏览器才支持',
            color: 'black',
            range: [0.2, 1]
        }, {
            value: '可以设置边框颜色',
            color: 'black',
            range: [0.2, 1]
        }, {
            value: '文字颜色默认都是白色',
            color: 'black',
            range: [0.2, 0.9]
        }, {
            value: '若文字颜色不想白色',
            color: 'black',
            range: [0.2, 1]
        }, {
            value: '需要自己调整下JS',
            color: 'black',
            range: [0.6, 0.7]
        }, {
            value: '如果需要的是真实和视频交互的弹幕',
            color: 'black',
            range: [0.2, 1]
        }, {
            value: '可以回到原文',
            color: 'black',
            range: [0, 0.9]
        }, {
            value: '查看另外一个demo',
            color: 'black',
            range: [0.7, 1]
        }, {
            value: '下面就是占位弹幕了',
            color: 'black',
            range: [0.7, 0.95]
        }, {
            value: '前方高能预警!!!',
            color: 'orange',
            range: [0.5, 0.8]
        }, {
            value: '前方高能预警!!!',
            color: 'orange',
            range: [0.5, 0.9]
        }, {
            value: '前方高能预警!!!',
            color: 'orange',
            range: [0, 1]
        }, {
            value: '前方高能预警!!!',
            color: 'orange',
            range: [0, 1]
        }];
 
        // 弹幕方法
        var canvasBarrage = function (canvas, data) {
            if (!canvas || !data || !data.length) {
                return;
            }
            if (typeof canvas == 'string') {
                canvas = document.querySelector(canvas);
                canvasBarrage(canvas, data);
                return;
            }
            var context = canvas.getContext('2d');
            canvas.width = canvas.clientWidth;
            canvas.height = canvas.clientHeight;
 
            // 存储实例
            var store = {};
 
            // 字号大小
            var fontSize = 28;
 
            // 实例方法
            var Barrage = function (obj, index) {
                // 随机x坐标也就是横坐标,对于y纵坐标,以及变化量moveX
                this.x = (1 + index * 0.1 / Math.random()) * canvas.width;
                this.y = obj.range[0] * canvas.height + (obj.range[1] - obj.range[0]) * canvas.height * Math.random() + 36;
                if (this.y < fontSize) {
                    this.y = fontSize;
                } else if (this.y > canvas.height - fontSize) {
                    this.y = canvas.height - fontSize;
                }
                this.moveX = 1 + Math.random() * 3;
 
                this.opacity = 0.8 + 0.2 * Math.random();
                this.params = obj;
 
                this.draw = function () {
                    var params = this.params;
                    // 根据此时x位置绘制文本
                    context.strokeStyle = params.color;
                    context.font = 'bold ' + fontSize + 'px "microsoft yahei", sans-serif';
                    context.fillStyle = 'rgba(255,255,255,' + this.opacity + ')';
                    context.fillText(params.value, this.x, this.y);
                    context.strokeText(params.value, this.x, this.y);
                };
            };
 
            data.forEach(function (obj, index) {
                store[index] = new Barrage(obj, index);
            });
 
            // 绘制弹幕文本
            var draw = function () {
                for (var index in store) {
                    var barrage = store[index];
                    // 位置变化
                    barrage.x -= barrage.moveX;
                    if (barrage.x < -1 * canvas.width * 1.5) {
                        // 移动到画布外部时候从左侧开始继续位移
                        barrage.x = (1 + index * 0.1 / Math.random()) * canvas.width;
                        barrage.y = (barrage.params.range[0] + (barrage.params.range[1] - barrage.params.range[0]) * Math.random()) * canvas.height;
                        if (barrage.y < fontSize) {
                            barrage.y = fontSize;
                        } else if (barrage.y > canvas.height - fontSize) {
                            barrage.y = canvas.height - fontSize;
                        }
                        barrage.moveX = 1 + Math.random() * 3;
                    }
                    // 根据新位置绘制圆圈圈
                    store[index].draw();
                }
            };
 
            // 画布渲染
            var render = function () {
                // 清除画布
                context.clearRect(0, 0, canvas.width, canvas.height);
 
                // 绘制画布上所有的圆圈圈
                draw();
 
                // 继续渲染
                requestAnimationFrame(render);
            };
 
            render();
        };
 
        canvasBarrage('#canvasBarrage', dataBarrage);
    </script>
到此这篇关于HTML5 canvas实现的静态循环滚动播放弹幕的文章就介绍到这了

转载地址:http://xxevb.baihongyu.com/

你可能感兴趣的文章
修改linux文件权限命令:chmod
查看>>
linux gcc编译器使用
查看>>
Linux下的tar压缩解压缩命令详解
查看>>
网页向女友/老婆告白和纪念日专用特效
查看>>
五种常见的电子商务模式:B2B、B2C、C2B、C2C、O2O
查看>>
关于__stdcall和__cdecl调用方式的理解
查看>>
全球最杰出的14位程序员
查看>>
MyEclipse中echart.js文件校验报错
查看>>
init_seg说明
查看>>
#pragma init_seg使特定的全局变量优先于其他的全局变量先构造
查看>>
VS2008下载(包含中文MSDN)序列号 破解版
查看>>
汇编语言中的相关英文全称
查看>>
cdecl、stdcall、fastcall函数调用约定区别
查看>>
堆栈中的EIP EBP ESP
查看>>
ESP和EBP指针寄存器
查看>>
EIP & EBP & ESP
查看>>
动态链接库(DLL)入口/出口点
查看>>
C/C++ 开发库 | C/C++ Development Library
查看>>
VC 运行时库中的 new/delete 函数
查看>>
面向对象设计原则、模式开篇
查看>>