javascript与css3动画结合使用小结


Posted in Javascript onMarch 11, 2015

当Html5,css3已渐渐成为主流的时候,我还非常习惯的用js去做一些简单的动画。因为在桌面浏览器上, 并非所有的都支持css3。用户也倒是很奇怪,用户习惯并不是每个用户都可以被培养。总有不少人会觉得win7.win8没xp好用。但手机方面就大不一样了,手机浏览器对html5和css3的支持还是很不错的。但手机硬件处理能力却又十分有限。在四核、八核手机横行的今天,依然有像我这样使用双核或单核手机的。js虽好,单奈何接触不多,调不好那种感觉。一个简单的页面滑动,在i7的pc上运行十分流畅,可是,在我的双核手机上就卡、顿、卡、顿。令人十分郁闷。为此,我也是寻找了很久很久,看了很多很多。终于在不就之前,找到了一种还算简单的方法:使用css3去执行动画。

在以前,对于动画除了Jquery的animate等动画函数外,更多的是使用setTimeout,setInterval,这样循环的去改变一个元素的margin、width、top等属性。也正是如此,才有了我的困惑。

首先,setTimeout,setInterval 这货并非你设置0ms它就能一直一直的去执行。曾经在iscroll里调试的时候无意中发现了这个秘密。原来Timer延时的计算依靠的是浏览器的内置时钟,而时钟的精确度又取决于时钟更新的频率。IE8及其之前的IE版本更新间隔为15.6毫秒。完了,我想它10ms执行1px位移,它还不能准时的干这事。

而卡又是怎么回事呢?卡,因为代码写的不好。毕竟js是单线程的,一旦有耗时的动作那么UI就可能不响应了。虽然我们使用了setTimeout,但正是因为setTimeout让我们看上去界面没死可动作却又不流畅了。因为这次setTimeout执行之后,在下次执行前,中间这个间隔里很可能遇到另一个耗时的动作,那么,setTimeout的执行就无限后延。然后呢?卡!然而,卡还能有下一个原因,改变原始属性时不小心触发浏览器Layout(即:重布局)。这个问题说它不耗时呢,却又耗时,说它耗时呢,很多时候却又可以忽略。但很多时候其实是不能忽略的。

除了上面这两段,还有一个问题,就是在很多手机上总感觉是一帧一帧的,而且还可能是一帧长一帧短。这真是能把人都搞废的节奏。为何会这样呢,依然和settimeout的推迟有一定的关系。丢帧。这个问题有涉及到显示器的刷新频率问题。实在太复杂了。

最后选择了CSS3,js动态的改变元素的属性,使用transition来控制动画执行时间。举个例子:

<div id="test" style="transition:all 1s ease; width:100px;" ></div>

js:

$("#test").width(200);

这样1秒之后这个div的宽度会变成200px。不是孙悟空变桃子一样瞬间变大,慢慢的赶脚,不卡不顿。而且使用css动画有个好处,它不受耗时js的影响。虽然浏览器中UI线程与js线程是互斥,但这一点对css动画不成立,并且很多浏览器还能启用硬件加速(比如:Chrome)。虽然浏览器重布局普通情况下感觉不是很明显,但还是应该尽量避免大面积的重布局。so在动画元素上加上-webkit-transform: translateZ(0);或者-webkit-transform: translate3d(0,0,0);这样浏览器会独立渲染这一层。即便是重布局无法避免,这样面积也小些。而使用translate取代margin也确实是一个十分明智的决定。

最后附上一些常用的改变时会触发重布局的属性: 
 

width 

 
height 

 
padding 

 
margin 

 
display 

 
border-width 

 
border 

 
min-height

以上就是本文所述的全部内容了,希望对大家学习javascript和CSS3能够有所帮助,同时不足之处烦请补充,谅解。

Javascript 相关文章推荐
用JavaScript实现仿Windows关机效果
Mar 10 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
Jun 27 Javascript
jQuery CSS()方法改变现有的CSS样式
Aug 20 Javascript
javascript HTML+CSS实现经典橙色导航菜单
Feb 16 Javascript
Bootstarp 基础教程之表单部分实例代码
Feb 03 Javascript
jQuery+ThinkPHP+Ajax实现即时消息提醒功能实例代码
Mar 21 jQuery
vue.js中mint-ui框架的使用方法
May 12 Javascript
基于daterangepicker日历插件使用参数注意的问题
Aug 10 Javascript
详解JavaScript的内存空间、赋值和深浅拷贝
Apr 17 Javascript
jquery实现掷骰子小游戏
Oct 24 jQuery
利用PHP实现递归删除链表元素的方法示例
Oct 23 Javascript
微信小程序实现可长按移动控件
Nov 01 Javascript
jquery实现textarea 高度自适应
Mar 11 #Javascript
jQuery简单实现禁用右键菜单
Mar 10 #Javascript
jQuery判断数组是否包含了指定的元素
Mar 10 #Javascript
js控制文本框只输入数字和小数点的方法
Mar 10 #Javascript
jQuery实现当前页面标签高亮显示的方法
Mar 10 #Javascript
jQuery简单几行代码实现tab切换
Mar 10 #Javascript
jQuery实现高亮显示的方法
Mar 10 #Javascript
You might like
模板引擎smarty工作原理以及使用示例
2014/05/25 PHP
php获得文件大小和文件创建时间的方法
2015/03/13 PHP
PHP给前端返回一个JSON对象的实例讲解
2018/05/31 PHP
javascript 延迟加载技术(lazyload)简单实现
2011/01/17 Javascript
js实现俄罗斯方块小游戏分享
2014/01/31 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
2015/09/14 Javascript
JavaScript面试题(指针、帽子和女朋友)
2016/11/23 Javascript
JS实现图片垂直居中显示小结
2016/12/13 Javascript
详解Sea.js中Module.exports和exports的区别
2017/02/12 Javascript
Webpack实战加载SVG的方法
2017/12/26 Javascript
JavaScript模拟实现自由落体效果
2018/08/28 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
2018/10/12 Javascript
微信小程序动画组件使用解析,类似vue,且更强大
2019/08/01 Javascript
JS中比Switch...Case更优雅的多条件判断写法
2019/09/05 Javascript
微信小程序实现一张或多张图片上传(云开发)
2019/09/25 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
原生JS实现京东查看商品点击放大
2020/12/21 Javascript
Python中常见的异常总结
2018/02/20 Python
Python爬虫小技巧之伪造随机的User-Agent
2018/09/13 Python
python解压TAR文件至指定文件夹的实例
2019/06/10 Python
Pytorch 实现冻结指定卷积层的参数
2020/01/06 Python
详解pycharm连接不上mysql数据库的解决办法
2020/01/10 Python
Django ModelForm操作及验证方式
2020/03/30 Python
Pycharm快捷键配置详细整理
2020/10/13 Python
Unineed中文官网:高端护肤美妆与时尚配饰,英国直邮
2020/07/23 全球购物
Ruby如何创建一个线程
2013/03/10 面试题
2014社区三八妇女节活动总结
2014/03/01 职场文书
《春笋》教学反思
2014/04/15 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
幼儿园教师师德承诺书
2015/04/28 职场文书
春风化雨观后感
2015/06/11 职场文书
教师节获奖感言
2015/07/31 职场文书
八年级物理教学反思
2016/02/19 职场文书
python ConfigParser库的使用及遇到的坑
2022/02/12 Python
警用民用对讲机找不同
2022/02/18 无线电
Python可视化神器pyecharts绘制水球图
2022/07/07 Python