最近在閱讀《高效前端:Web高效編程與優化實踐》這本書,書中介紹了前端高效編程的優化實踐和前端基礎。本文將結合我的的理解介紹部分高效編程的例子。css
表單中原生的radio/checkbox的樣式各個瀏覽器都不太一致。要想統同樣式,一種作法是本身div/span
去畫,而後去監聽單擊事件。這種作法就是邏輯控制徹底要本身寫,還有原生事件change
也沒法使用。html
這裏能夠經過CSS提供僞類checked
來實現自定義樣式。原理是把一個checkbox
和一個用來自定義樣式的span
寫在一個label
裏面,checkbox
始終隱藏。前端
<style> input[type=checkbox]{ display: none; } /*未選中的checkbox的樣式*/ .checkbox{ /* 實現略 */ } input[type=checkbox]:checked + .checkbox{ /* 實現略 */ } </style>
<label for="apple">
<input type="checkbox" id="apple">
<span class="checkbox"></span>
</label>
複製代碼
有1~3個items要顯示在同一行, 可是item的個數不必定,就一個的話item佔寬100%,兩個時各佔50%,三個時各佔33%。顯然你能夠用js來計算,可是這樣有點繁瑣。編程
咱們能夠經過CSS3的first-child
和nth-last-child
來實現個數的區分數組
<style> li { width: 100% } li:first-child:nth-last-child(2), li:first-child:nth-last-child(2) ~ li{ width: 50% } li:first-child:nth-last-child(3), li:first-child:nth-last-child(3) ~ li{ width: 33% } </style>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
複製代碼
這個技巧應該是比較常見,經過把寬高設置爲0,同時只設置一個邊的border來畫三角形。下面提供一些其餘三角形畫法:瀏覽器
// 斜邊在左邊的三角形
border-top: 50px solid transparent;
border-bottom: 50px solid transparent;
border-left: 50px solid #000;
// 直角三角形
border-left: 60px solid transparent;
border-right: 0 solid transparent;
border-bottom: 40px solid #000;
// 等邊三角形
border-left: 28px solid transparent;
border-right: 28px solid transparent;
border-bottom: 40px solid #000;
複製代碼
不推薦直接在JS裏面更改樣式屬性, 應該經過增刪類來控制樣式,除了scroll和mousemove緩存
// common
function popCallback(popType){
switch(popType){
case: "favHouse":
favHouse();
break;
case: "saveSearch":
saveSearch();
break;
}
}
// strategy
var popCallback = {
favHouse: function(){ /*do sth.*/ },
saveSearch: function(){ /*do sth.*/ }
}
if(typeof popCallback[popType] === "function"){
popCallback[popType]();
}
複製代碼
這邊其實也能夠在項目中靜態類型檢查器(Flow、TypeScript)來優化代碼。書中有介紹幾點還不錯建議:antd
var num = 0,
str = '',
obj = null;
複製代碼
// bad
var num = 5;
num = "-" + num;
// good
var num = 5;
var sign = "-" + num;
複製代碼
// bad
function getPrice(count){
if(count < 0) return "";
else return count * 100;
}
// good
function getPrice(count){
if(count < 0) return -1;
else return count * 100;
}
複製代碼
全局做用域比較複雜,因此查找屬性比較慢。局部做用的查找是很快的app
// bad
var url = "";
if(window.location.protocal === "https:"){
url = "wss://xxx.com" + window.location.pathname + window.location.search;
}
// good 緩存成局部變量
var url = "";
var location = window.location;
if(location.protocal === "https:"){
url = "wss://xxx.com" + location.pathname + location.search;
}
複製代碼
咱們的代碼中應該避免==
的使用,應該使用===
,這樣能夠避免js類型轉換帶來的一些意外的結果。函數
==
建議的使用場景是判斷變量是否爲空的時候,即if(obj == null)
var nums = [4, 8, 1, 9, 0];
nums.sort((a, b) => b - a);
複製代碼
var tpl =
` <div> <span>1</span> </div> `;
var url = `/list?page=${page}&type=${type}`;
複製代碼
var tasks = [];
for(let i = 0; i <= 4; i++){
tasks.push(function(){
console.log("i is " + i);
});
}
for(var j = 0; j < tasks.length; j++){
tasks[j]();
}
複製代碼
常見的Loading都有圖片加載、AJAX請求、上傳文件進度條。還有一個最近流行的骨架屏(skeleton loading)
這部分能夠去看下一些UI庫的基本理念和設計原則,如antd-design
Chrome Devtools調試建議能夠看下F12裏面的官方文檔。
console.table
打印對象數組console.dir
能遞歸打印對象的全部屬性,打印一個DOM結點devtools的Coverage標籤欄,沒有用到的用紅色表示, 用到的用綠色表示
devtools有一個Renders能夠用來研究重繪
書中的優化實踐點仍是不少的,我這邊就介紹部分相對比較經常使用的。其實優化實踐給出了比較好的方案,可是實際仍是要結合具體狀況來選擇方案的。