说明:本文主要介绍在使用HTML、CSS、JS的过程中,需要注意的编码细节和规范
在IE中,使用@import相当于将放在页面底部。
使用filter的问题是它会阻塞渲染并且当浏览在加载图片时,会冻结浏览器。它也会提升内存消耗,它是作用于一个元素而不是一个图片,所以问题会更严重。
最好的解决方案是完全避免使用AlphaImageLoader,用PNG8来代替。
css选择符的编写方式决定了浏览器必须执行的匹配次数,而某些类型的css选择符将会导致浏览器尝试更多匹配,因此开销比简单选择符更高。
ID选择符:这种类型的选择符简单且高效,用于匹配页面唯一的元素。#id {}
类选择符.className {}
类型选择符tagName {}
相邻兄弟选择符H1 + #toc {}
子选择符#toc > li {}
后代选择符#toc A {}
通配选择符 * {}
属性选择符 [href=”#index”] {}
伪类和伪元素 A:hover {}
最右边优先:事实上,css选择符是从右到左进行匹配的。
DOM访问
执行DOM交互的代码比i一般的js代码要慢。DOM交互是不可避免的,但是尽量的减少。例如,动态的使用innerHTML插入HTML语句比创建DOM节点更快。
eval
无论什么时候,避免使用eval方法,因为执行这一方法会造成很大的开销。
with
尽量不要使用with
for-in 循环
避免使用eval和Function constructor
使用eval或者function constructor会加大开销因为每一次脚本引擎调用他们是必须将源码转换成可执行代码;
另外,使用eval时,字符串会在执行时被打断
避免使用with
不要在对性能影响很大的地方使用try-catch-finally
避免使用全局变量
避免在对性能影响较大的地方使用for-in
for in循环需要脚本引擎构建一个枚举属性列表,而且每次都要从头重复检查
使用字符串累加模式
原生的操作比函数更快
将函数而不是字符串传到setTimeout()和setInterval()中
避免对象里没必要的DOM引用
最大化对象解析速度,最小化作用域链
尽量让脚本声明的变量短一点,不要太长,特别是循环里面的变量
将自身引用存储在作用域外的变量中
当一个funciton被执行时,一个执行的上下文(context)会被创建,被激活的对象将所有自身变量push到上下文(context)的作用域链之前。
离作用域链越远,解析的越慢,这也意味着作用域本地的变量时解析的最快的。 将自身引用用作用域之外的变量存储,读写都会变的更快,这在全局变量和一些深度查找的资源解析中特别明显。
当然,作用域内定义的变量比使用对象自身访问的速度更快。
假如你需要在一个大循环中访问一个dom,这样子会更快:
更快的加载和展现页面可以让js加载没有阻塞
添加Experes或者Cache-Control HTTPheader
Gzip javascript和css资源
利用YUI或者JSMin压缩代码
尽量减少资源的数目和大小
让脚本无阻赛并行下载
合并异步加载的脚本
将行内脚本放到样式表之上?有待考证,不科学
少用iframe
尽可能减小DOM的大小
使用文档的组件模板来进行复用
动态的在dom中插入或者更新元素是代价很大的。一个有效的方法来解决这个问题是利用HTML模板来插入一些对话框或者UI组件。
最小化重绘和重构的次数
重绘发生在一些元素可见或者隐藏的时候,但是没有改变document的布局
重构发生在DOM的操作方式影响到布局。
重构的代价比重绘大的多得多。
重构表格比重构块状元素代价大
绝对定位的元素不会对document的布局产生影响
DOM的修改会触发重绘
参考资料:
利用cloneNode()
利用HTML模板和innerHTML
设定元素不可见再进行改变(质疑,appendChild不会重发重绘,js执行完成以后才会)
尽量少的使用改变元素尺寸或位置的操作
使用className来完成多个预定义样式的的改变
利用设定属性来动态完成多个样式的设定
css class name vs. style属性
不要遍历大量的节点,避免在遍历时改变dom结构
将DOM元素缓存在变量中使用
在dom元素使用完以后移除引用
对XMLHttpRequest设定超时时间
考虑使用约定的数据来做大数据的处理,比如选择xml或者json
选择性的使用动画
使用scrollTo()方法来实现滚动动画
将动画元素的position设置为absolute或者fix
在同一时间使用一个timer来服务多个动画元素
让动画的速度更平滑
利用事件冒泡
不要对一些经常触发的event使用代理
Javascript调用栈使用setTimeout不会溢出
原因是setTimeout是伪异步的,把函数交给setTimeout处理后,原来的函数不会等待,会继续执行,函数会结束,资源也就可以释放。
而不用setTimeout的时候,函数必须等待调用的函数返回后才能继续执行,但调用的函数又必须等待下一级函数,这样所有函数都不能结束,资源也就释放不出。
换句话说,就是死锁。
优化css
优化图片