共计 1134 个字符,预计需要花费 3 分钟才能阅读完成。
bullet.js 文件如下
import TimeManager from "./TimeManager.js";
export default class Bullet{
rect;
x;
speed=2;
width;
col;
constructor(txt){this.elem=this.createElem(txt);
}
createElem(txt){if(this.elem) return this.elem;
var div = document.createElement("div");
this.randomColor();
Object.assign(div.style,{
whiteSpace: "nowrap",
position:"absolute",
fontSize:"20px",
color:this.col
})
div.textContent=txt
return div;
}
randomColor() {
this.col = "#";
for (var i = 0; i < 6; i++) {this.col += Math.floor(Math.random() * 16).toString(16);
}
}
appendTo(parent){if(typeof parent==="string") parent=document.querySelector(parent);
parent.appendChild(this.elem);
this.rect=parent.getBoundingClientRect();
Object.assign(this.elem.style,{top:Math.random()*this.rect.height/4+"px",
left:this.rect.width+"px"// 留神插入开始时是放在视频容器左边外边的
});
this.x=this.rect.width;
this.width=this.elem.offsetWidth;
TimeManager.instance.add(this);// 当弹幕对象创立好增加到视频容器中之后,再将其增加到观察者的单例对象的 list 上
}
update(){if(!this.width) return;
this.x-=this.speed;
this.elem.style.left=this.x+"px";
if (this.x < -this.width) {// 这步是弹幕对象挪动了整个视频容器的地位 + 自身文本撑开的宽度
// 当弹幕播放完之后删除,观察者单例对象的 list 上,dom 构造中以及堆中都要删除
TimeManager.instance.remove(this);
this.elem.remove();
this.elem=null;
}
}
}
正文完
发表至: javascript
2020-11-21