1、css
語義化HTML:語義化HTML的好處是可使代碼簡潔清晰、支持不一樣設備、利於搜索引擎、便於團隊開發;web
減小DOM節點:加速頁面渲染;正則表達式
給圖片加上正確的寬高值:這能夠減小頁面重繪,同時防止圖片縮放;算法
防止src屬性和link的href屬性爲空:當值爲空時,瀏覽器極可能會把當前頁面當成其屬性值加載;express
正確的閉合標籤:如避免使用<div/>,瀏覽器會多一個將它解析成<div\></div\>的過程;瀏覽器
連接爲目錄或首頁的地址後面加」/」,如http://www.baidu.com/;緩存
用LINK而不用@import方式導入樣式;服務器
樣式放在頁頭,JS放在頁尾;cookie
2、異步
避免使用 CSS Expressions(CSS表達式):如如background-color: expression( (new Date()).getHours()%2 ? 「#B8D4FF」 : 「#F08A00″ ) ;
避免使用 CSS Filter(CSS濾鏡);
使用CSS縮寫,減小代碼量;
經過CSSSprites把同類圖片合成一張,減小圖片請求;
減小查詢層級:如.header .logo要好過.header .top .logo;
減小查詢範圍:如.header>li要好過.header li;
避免TAG標籤與CLASS或ID並存:如a.top、button#submit;
刪除重複的CSS;
3、
儘可能少用全局變量;
使用事件代理綁定事件,如將事件綁定在body上進行代理;
避免頻繁操做DOM節點;
不使用EVAL;
減小對象查找,如a.b.c.d這種查找方式很是耗性能,儘量把它定義在變量裏;
類型轉換:把數字轉換成字符串使用」" + 1,浮點數轉換成整型使用Math.floor()或者Math.round();
避免對字符串進行循環操做,譬如替換、查找,應使用正則表達式;
刪除重複的JS;
4、
儘可能合併CSS、JS文件,或將其直接寫在頁面上,減小HTTP請求;
壓縮CSS、JS文件,縮短文件傳輸時間;避免404錯誤:特別要避免給404指定一個停擺頁面,不然全部404錯誤都將會加載一次頁面;
通常要求減小DNS查詢次數,如同一個頁面的請求資源儘可能少的使用不一樣的主機名,這能夠減小網站並行下載的數量,但不少網站爲了加速下載資源實際上是特地用了多個主機 名,這裏要作一個權衡;
使用CDN加速,使用戶從離本身最近的服務器下載文件;
減小Cookie的大小,使用無cookie的域,客戶端請求靜態文件的時候,減小 Cookie 的反覆傳輸對主域名的影響;
爲文件頭指定Expires,使內容具備緩存性;
使用gzip壓縮內容;
加載方面的優化:
減小HTTP請求。
由於手機瀏覽器同時響應請求爲4個請求(Android支持4個,iOS 5後可支持6個),因此要儘可能減小頁面的請求數,首次加載同時請求數不能超過4個。a) 合併CSS、JavaScript;b) 合併小圖片,使用雪碧圖(CSS SPRITE);
緩存。
使用緩存能夠減小向服務器的請求數,節省加載時間,因此全部靜態資源都要在服務器端設置緩存,而且儘可能使用長Cache(長Cache資源的更新可以使用時間戳)。
a) 緩存一切可緩存的資源;b) 使用長Cache(使用時間戳更新Cache);c) 使用外聯式引用CSS、JavaScript;
壓縮HTML、CSS、JavaScript。
減小資源大小能夠加快網頁顯示速度,因此要對HTML、CSS、JavaScript等進行代碼壓縮,並在服務器端設置GZip。a) 壓縮(例如,多餘的空格、換行符和縮進);b) 啓用GZip;
確保無阻塞。
寫在HTML頭部的JavaScript(無異步),和寫在HTML標籤中的Style會阻塞頁面的渲染,所以CSS放在頁面頭部並使用Link方式引入,避免在HTML標籤中寫Style,JavaScript放在頁面尾部或使用異步方式加載
使用首屏加載。
首屏的快速顯示,能夠大大提高用戶對頁面速度的感知,所以應儘可能針對首屏的快速顯示作優化。
按需加載。
將不影響首屏的資源和當前屏幕資源不用的資源放到用戶須要時才加載,能夠大大提高重要資源的顯示速度和下降整體流量(PS:按需加載會致使大量重繪,影響渲染性能)。
a) LazyLoad;b) 滾屏加載;c) 經過Media Query加載;
預加載。
大型重資源頁面(如遊戲)可以使用增長Loading的方法,資源加載完成後再顯示頁面。但Loading時間過長,會形成用戶流失。對用戶行爲分析,能夠在當前頁加載下一頁資源,提高速度;a) 可感知Loading(如進入空間遊戲的Loading);b) 不可感知的Loading(如提早加載下一頁);
壓縮圖片。
圖片是最佔流量的資源,所以儘可能避免使用他,使用時選擇最合適的格式(實現需求的前提下,以大小判斷),合適的大小,而後使用智圖壓縮,同時在代碼中用Srcset來按需顯示(PS:過分壓縮圖片大小影響圖片顯示效果)。
a) 使用智圖(雪碧圖);
b) 使用其它方式代替圖片(1. 使用CSS3 2. 使用SVG 3. 使用IconFont);
c) 使用Srcset;
d) 選擇合適的圖片(1. webP優於JPG 2. PNG8優於GIF);
e) 選擇合適的大小(1. 首次加載不大於1014KB 2. 不寬於640(基於手機屏幕通常寬度));
減小Cookie、避免重定向以及異步加載第三方資源。
Cookie會影響加載速度,因此靜態資源域名不使用Cookie。此外,重定向也會影響加載速度,因此在服務器正確設置避免重定向。最後,第三方資源不可控會影響頁面的加載和顯示,所以要異步加載第三方資源。
腳本執行優化:
腳本處理不當會阻塞頁面加載、渲染,所以在使用時需當注意:
· CSS寫在頭部,JavaScript寫在尾部或異步。
· 避免圖片和iFrame等的空Src。
空Src會從新加載當前頁面,影響速度和效率。
· 儘可能避免重設圖片大小。
重設圖片大小是指在頁面、CSS、JavaScript等中屢次重置圖片大小,屢次重設圖片大小會引起圖片的屢次重繪,影響性能。
· 圖片儘可能避免使用DataURL。
DataURL圖片沒有使用圖片的壓縮算法文件會變大,而且要解碼後再渲染,加載慢耗時長。
CSS優化:
儘可能避免寫在HTML標籤中寫Style屬性。
· 避免CSS表達式CSS表達式的執行需跳出CSS樹的渲染,所以請避免CSS表達式
· 移除空的CSS規則空的CSS規則增長了CSS文件的大小,且影響CSS樹的執行,因此需移除空的CSS規則
· 正確使用Display的屬性Display屬性會影響頁面的渲染,所以請合理使用a) display:inline後不該該再使用width、height、margin、padding以及floatb) display:inline-block後不該該再使用floatc) display:block後不該該再使用vertical-alignd) display:table-*後不該該再使用margin或者float
· 不濫用Float。
Float在渲染時計算量比較大,儘可能減小使用
· 不濫用Web字體。
Web字體須要下載,解析,重繪當前頁面,儘可能減小使用
· 不聲明過多的Font-size。
過多的Font-size引起CSS樹的效率
· 值爲0時不須要任何單位。
爲了瀏覽器的兼容性和性能,值爲0時不要帶單位
· 標準化各類瀏覽器前綴。
a) 無前綴應放在最後
b) CSS動畫只用 (-webkit- 無前綴)兩種便可
c) 其它前綴爲 -webkit- -moz- -ms- 無前綴 四種,(-o-Opera瀏覽器改用blink內核,因此淘汰)
· 避免讓選擇符看起來像正則表達式。
高級選擇器執行耗時長且不易讀懂,避免使用
JavaScript執行優化:
· 減小重繪和迴流。
a) 避免沒必要要的Dom操做
b) 儘可能改變Class而不是Style,使用classList代替className
爲document.getElementById("myDIV").classList.add("mystyle"); d iv元素添加class
c) 避免使用document.write
d) 減小drawImage
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
var img=document.getElementById("scream");
img.onload = function(){
//向畫布上繪製圖片
ctx.drawImage(img,10,10);
}
· 緩存Dom選擇與計算。
每次Dom選擇都要計算,緩存它
· 緩存列表.length。
每次.length都要計算,用一個變量保存這個值
· 儘可能使用事件代理,避免批量綁定事件
· 儘可能使用ID選擇器。
ID選擇器是最快的
· TOUCH事件優化。
使用touchstart、touchend代替click,因快影響速度快。但應注意Touch響應過快,易引起誤操做
渲染優化
· HTML使用Viewport。
Viewport能夠加速頁面的渲染,請使用如下代碼<meta name=」viewport」 content=」width=device-width, initial-scale=1″>
· 減小Dom節點。
Dom節點太多影響頁面的渲染,應儘可能減小Dom節點
· 動畫優化。
a) 儘可能使用CSS3動畫
b) 合理使用requestAnimationFrame動畫代替setTimeoutc) 適當使用Canvas動畫 5個元素之內使用css動畫,5個以上使用Canvas動畫(iOS8可以使用webGL)
· 高頻事件優化。
Touchmove、Scroll 事件可致使屢次渲染a) 使用requestAnimationFrame監聽幀變化,使得在正確的時間進行渲染b) 增長響應變化的時間間隔,減小重繪次數
· GPU加速。
CSS中如下屬性(CSS3 transitions、CSS3 3D transforms、Opacity、Canvas、WebGL、Video)來觸發GPU渲染,請合理使用(PS:過渡使用會引起手機過耗電增長)