reflow
也就是 重排或者回流javascript
由DOM或者佈局的變更而觸發。前端
如你改變了一個div
的位置,或者是改變了這個div的width, height, position 或者佈局類的樣式。java
display:none
不渲染的特色經過一次完整的web請求和渲染過程以及如何優化網頁,咱們能夠知道頁面渲染的時候,會忽略掉display: none
這一類的不佔佈局的元素。web
因此,咱們能夠將元素先display:none
,而後用JS對該元素進行操做。等操做完成在會後,再將它display:block
,這樣只會觸發2次的reflow
。app
固然上述的寫法也能夠利用innerHTML
進行修改。dom
const ul = document.getElementById('content')
const lists = ['a', 'b', 'c', 'd']
const childElementString = lists.map(list=>`<li>${list}</li>`).join('')
ul.innerHTML = ul.innerHTML + childElementString
複製代碼
這裏只進行了一次reflow。佈局
DocumentFragment
上面的寫法顯然不夠好,沒法複用。咱們可使用DocumentFragment
進行優化。 DocumentFragments
是DOM節點,但不是DOM tree的一部分。它存在於內存
中,能夠理解爲虛擬DOM。post
const parentNode = document.getElementById('content')
const lists = ['a', 'b', 'c', 'd']
const fragment = document.createDocumentFragment
lists.forEach(text=>{
const li = document.createElement('li')
li.textContent = text
fragment.appendChild(li)
})
parentNode.appendChild(fragment)
複製代碼
若是不使用DocumentFragment的話,會形成4次reflow,隨着須要修改的dom次數變多,還會形成更屢次的reflow,可是經過fragment,只須要一次就夠了。優化
咱們上面說了,不僅是DOM tree的改變會觸發reflow,CSSOM的改變一樣會觸發。 這裏咱們能夠用替代的CSS屬性替代會形成reflow的屬性。ui
相關文章: