div.style.top = '10px';
div.style.bottom = '10px';
console.log(div.offsetWidth);
console.log(div.offsetHeight);
複製代碼
var left = 10;
var top = 10;
el.style.marginLeft = left + 'px';
el.style.marginTop = top + 'px';
// class
.className{
margin-left: 10px;
margin-top: 10px;
}
el.className += ' className';
// cssText
var left = 10;
var top = 10;
div.style.cssText += 'margin-left: ' + Left + 'px; margin-top: ' + Top + 'px;'
複製代碼
// 觸發兩次重排
div.style.left = div.offsetLeft + 1 + 'px';
div.style.top = div.offsetTop + 1 + 'px';
// 緩存佈局信息 至關於讀寫分離
var curLeft = div.offsetLeft;
var curTop = div.offsetTop;
div.style.left = curLeft + 1 + 'px';
div.style.top = curTop + 1 + 'px';
複製代碼
dom.display = 'none'
// 修改dom樣式
dom.display = 'block';
複製代碼
div {
transform: translate3d(10px, 10px, 0);
}
複製代碼
什麼是虛擬DOM?css
VDom特色html
爲何使用虛擬DOM?前端
使用虛擬DOM的損耗計算node
總消耗 = 虛擬DOM增刪改 + (與Diff算法效率有關)真實DOM差別增刪改 + (較少的節點)排版與重繪
複製代碼
使用真實DOM的損耗計算webpack
總損耗 = 真實DOM徹底增刪改 + (可能較多的節點)排版與重繪
複製代碼
Diff算法(實現虛擬DOM對真實的DOM的更新)web
function updateChildren(vnode, newVnode) { // 建立對比函數
var children = vnode.children || [];
var newChildren = newVnode.children || [];
children.forEach(function(childrenVnode, index) {
var newChilrenVnode = newChildren[index]; // 首先拿到對應新的節點
if(childrenVnode.tag = newChildrenVnode.tag) { // 判斷節點是否相同
updateChildren(childrenVnode, newChildVnode); // 若是相同就執行遞歸,深度對比節點
}else {
replaceNode(childrenVnode, newChildVnode); // 若是不一樣則將舊的節點替換成新的節點
}
})
}
function replaceNode(vnode, newVnode) { // 節點替換函數
var elem = vnode.elem;
var newEle = createElement(newVnode);
}
複製代碼