初版

用css3来实现弹幕确实比较简单,只需要设置动画让弹幕从屏幕右侧移动到屏幕左侧即可,一开始是这样实现的

.danmu {
position: fixed;
left: %;
animation: danmu 5s linear 0s ;
} @keyframes danmu {
from {
left: %;
transform: translateX();
}
to {
left: ;
transform: translateX(-%);
}
}

在pc端测试挺流畅,效果不错,但是一拿到移动端上试,就发现这个动画不流畅,有卡顿,ios稍好,android的话即使是配置高的机器也是有卡顿,配置低的机器就更是明显。

缘由

一番研究,发现是因为keyframes中使用left,这样的话left的改变会在渲染的过程中导致reflow,从而造成卡顿。那么改进的思路就比较明确了,移除left,只使用translate。

reflow(回流):例如某个子元素样式发生改变,直接影响到了其父元素以及往上追溯很多祖先元素(包括兄弟元素),这个时候浏览器要重新去渲染这个子元素相关联的所有元素。

repaint(重绘):如果只是改变某个元素的背景色、文 字颜色、边框颜色等等不影响它周围或内部布局的属性,将只会引起浏览器 repaint(重绘)

回流的成本比重绘高得多

下面情况会导致reflow发生

1:改变窗口大小  resize事件发生时

2:改变文字大小

3:内容的改变,如用户在输入框中敲字

4:激活伪类,如:hover

5:操作class属性

6:脚本操作DOM

7:计算offsetWidth和offsetHeight

8:设置style属性

新问题

但是全部使用translate又有新的问题,使用left:100%可以达到让弹幕从屏幕右侧开始出现,但是translate使用的百分比单位是相对于自身的,我们需要明确的给出屏幕宽度来translate,而屏幕宽度只有运行时用js才能获取到。这样一来,动画的keyframes看来是需要使用js来动态生成了。

解决方案

在需要展示动画前,动态生成一个style根据当前屏幕宽度定义好keyframes

// css
.danmu {
position: fixed;
left: ;
visibility: hidden;
animation: danmu 5s linear 0s ;
} // js代码
let style = document.createElement('style');
document.head.appendChild(style);
let width = window.innerWidth;
let from = `from { visibility: visible; -webkit-transform: translateX(${width}px); }`;
let to = `to { visibility: visible; -webkit-transform: translateX(-%); }`;
style.sheet.insertRule(`@-webkit-keyframes danmu { ${from} ${to} }`, );

注意,这里.danmu里设置了visibility为隐藏,不然弹幕会堆积显示在屏幕左侧,而keyframes里则设置visibility为显示,这样就使得弹幕只在动画过程中才能被看见。
这么做的原因是弹幕的初始位置为left: 0才能方便的设置弹幕头部从屏幕右侧出现然后从右向左移动到弹幕尾部消失在屏幕左侧为止。

再讲解一下let ,ES6 新增命令,用来声明变量。

  • let声明的变量拥有块级作用域
  • let声明的全局变量不是全局对象的属性
  • 形如for (let x...)循环在每次迭代时都为x创建新的绑定
  • let重定义变量会抛出一个语法错误(SyntaxError)。
  • 不存在变量提升,声明的变量直到控制流到达该变量被定义的代码行时才会被装载,所以在到达之前使用该变量会触发错误,称为“暂时性死区”(TDZ)

ES6引入了一种新型的字符串字面量语法,我们称之为模板字符串

  • 提供了简单的字符串插值功能  ${变量名}
  • 模板字符串可以多行书写  模板字符串中所有的空格、新行、缩进,都会原样输出在生成的字符串中。

【Web前端】用CSS3实现弹幕的更多相关文章

  1. web前端开发:css3实现loading

    web前端开发:css3实现loading 有大量web前端开发工具及学习资料,可以搜群[ web前端学习部落22群 ]进行下载,遇到学习问题也可以问群内专家以及课程老师哟 <!DOCTYPE ...

  2. 1+x 证书 Web 前端开发 CSS3 专项练习

    官方QQ群 1+x 证书 Web 前端开发 CSS3 专项练习 http://blog.zh66.club/index.php/archives/196/

  3. 【Web前端HTML5&CSS3】03-字符实体与语义标签

    笔记来源:尚硅谷Web前端HTML5&CSS3初学者零基础入门全套完整版 目录 字符实体与语义标签 1. 字符实体 2. meta标签 3. 语义标签 4. 块元素与行内元素 块元素(bloc ...

  4. 【Web前端HTML5&CSS3】05-样式继承与其他概念

    笔记来源:尚硅谷Web前端HTML5&CSS3初学者零基础入门全套完整版 目录 样式继承与其他概念 1. 继承 2. 选择器的权重 3. 长度单位 像素 屏幕分辨率 图像分辨率 百分比 em ...

  5. 【Web前端HTML5&CSS3】06-盒模型

    笔记来源:尚硅谷Web前端HTML5&CSS3初学者零基础入门全套完整版 目录 盒模型 1. 文档流(normalflow) 2. 块元素 3. 行内元素 4. 盒子模型 盒模型.盒子模型.框 ...

  6. 【Web前端HTML5&CSS3】08-盒模型补充

    笔记来源:尚硅谷Web前端HTML5&CSS3初学者零基础入门全套完整版 目录 盒模型补充及田径场实战 1. 盒子大小 2. 轮廓 3. 阴影 4. 圆角 圆 椭圆 盒模型补充及田径场实战 1 ...

  7. 【Web前端HTML5&CSS3】11-定位

    笔记来源:尚硅谷Web前端HTML5&CSS3初学者零基础入门全套完整版 目录 定位的简介 1. 相对定位 偏移量(offset) 相对定位的特点 2. 绝对定位 绝对定位的特点 包含块(co ...

  8. 【Web前端HTML5&CSS3】12-字体

    笔记来源:尚硅谷Web前端HTML5&CSS3初学者零基础入门全套完整版 目录 字体 1. 字体相关的样式 2. font-family 3. 几种字体 手写体 艺术体 乱码字体 中文字体 4 ...

  9. 1+x证书Web前端开发CSS3详细教程

    web 前端开发之 CSS3 新特性 http://blog.zh66.club/index.php/archives/189/ web 前端开发之 html5 新特性 http://blog.zh6 ...

  10. 整理六百篇web前端知识混总

    9个有用的和免费的工具来支持动态网页开发 8个基本的引导工具的网页设计师 11款CSS3动画工具的开发 2016年某前端群题目答案参考 9最好的JavaScript压缩工具 创建响应式布局的10款优秀 ...

随机推荐

  1. 吴恩达机器学习笔记13-正规方程(Normal Equation)

    到目前为止,我们都在使用梯度下降算法,但是对于某些线性回归问题,正规方程方法是更好的解决方案.如: 即: 运用正规方程方法求解参数: 注:对于那些不可逆的矩阵(通常是因为特征之间不独立,如同时包含英尺 ...

  2. Linux服务器开机自动启动服务或脚本的方法

    由于种种原因我们需要重启服务器或断电重启,服务都得手动一个一个启动太过麻烦,所以专门了解开机自启脚本的设置方法. 方式一: 直接在脚本/etc/rc.d/rc.local(和/etc/rc.local ...

  3. 【vim】模式与模式切换

    很多初学者启动vim后,不知道怎么输入字符:按了半天字母,结果屏幕还是空的. vim和记事本或WORD不一样,不是一打开后就可以输入文字,此时它处于正常模式. vim一共有4个模式: 正常模式 (No ...

  4. C语言中assert()断言函数的概念及用法

    断言函数的格式如下所示: void assert (int expression);如果参数expression等于零,一个错误消息将会写入到设备的标准错误集并且会调用abort函数,就会结束程序的执 ...

  5. Canny算子

    Canny边缘检测算子是John F. Canny于1986年开发出来的一个多级边缘检测算法.更为重要的是Canny创立了“边缘检测计算理论”(computational theory of edge ...

  6. 一看看懂Protocol Buffer(协议篇)

    前言 由于笔者业团队的业务对即时通讯服务有很大的依赖,春节结束后的第一天,红包没到,产品同学先到了,产品同学和我说要做一款IM,看到需求文档后和设计图后笔者大吃一斤 这不就是一个翻版的web qq吗? ...

  7. 学习笔记第六课 VB程序

    VB程序的特殊地方在于: 前几课学的破解方法,诸如设置API断点,修改关键CALL的返回值,MESSAGEBOX断点等,这些对于VB程序都是无效的. 这节课是设置VB的API断点,绕过报错弹窗来破解. ...

  8. git push 到github时,报错:ERROR: Permission to xxx.git denied to user

    之前我电脑的本地git已经登录了一个github账号,今天想换另外一个新的github账户来提交项目,相当于同一台电脑使用两个github账户. 于是我先修改用户名和邮箱. git config -- ...

  9. 课程五(Sequence Models),第三周(Sequence models & Attention mechanism) —— 0.Practice questions:Sequence models & Attention mechanism

  10. 课程回顾-Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization

    训练.验证.测试划分的量要保证数据来自一个分布偏差方差分析如果存在high bias如果存在high variance正则化正则化减少过拟合的intuitionDropoutdropout分析其它正则 ...