>  기사  >  웹 프론트엔드  >  리플로우 및 다시 그리기 작업을 줄이는 팁과 방법

리플로우 및 다시 그리기 작업을 줄이는 팁과 방법

WBOY
WBOY원래의
2024-01-26 08:04:061216검색

리플로우 및 다시 그리기 작업을 줄이는 팁과 방법

잦은 리플로우 및 다시 그리기 작업을 피하는 방법

리플로우와 다시 그리기는 브라우저가 페이지를 렌더링할 때 두 가지 중요한 작업입니다. 리플로우(Reflow)는 브라우저가 DOM 트리의 변화에 ​​따라 요소의 위치와 크기를 다시 계산하는 것을 말하며, 다시 그리기(reraw)는 계산 결과에 따라 페이지를 다시 그리는 것을 의미합니다. 이 두 가지 작업은 많은 컴퓨팅 리소스를 소비하고 페이지 성능을 저하시킵니다. 따라서 빈번한 리플로우 및 다시 그리기 작업을 피하는 것은 웹 페이지 성능을 최적화하는 데 중요합니다.

이 문서에서는 잦은 리플로우 및 다시 그리기 작업을 방지하는 몇 가지 효과적인 방법을 소개하고 구체적인 코드 예제를 제공합니다.

  1. CSS의 변형 속성을 사용하세요
    요소의 변위, 회전, 크기 조절 등의 작업을 수행해야 할 경우 왼쪽, 위쪽, 너비, 높이 및 요소를 직접 수정하는 대신 CSS의 변형 속성을 사용하는 것이 좋습니다. 요소의 다른 속성. 변환 작업은 리플로우를 트리거하지 않고 다시 그리기 작업만 트리거하므로 성능이 향상됩니다.

샘플 코드:

// 不推荐的方式
element.style.left = '100px';
element.style.top = '200px';
element.style.width = '300px';
element.style.height = '400px';

// 推荐的方式
element.style.transform = 'translate(100px, 200px) scale(1.5)';
  1. 레이아웃 속성에 대한 빈번한 액세스를 피하세요
    offsetWidth, offsetHeight, clientWidth, clientHeight 등과 같은 JavaScript 요소의 레이아웃 속성을 자주 읽어야 하는 경우 이러한 속성에 대한 액세스를 최소화해야 합니다. 문제 발생을 방지하기 위한 속성 빈번한 리플로우 작업.

샘플 코드:

// 不推荐的方式
for (let i = 0; i < elements.length; i++) {
    const element = elements[i];
    console.log(element.offsetWidth);
}

// 推荐的方式
const length = elements.length;
for (let i = 0; i < length; i++) {
    const element = elements[i];
    console.log(element.offsetWidth);
}
  1. 가상 DOM 사용
    Virtual DOM은 JavaScript 개체를 통해 실제 DOM을 표현하는 기술로, 일괄 업데이트를 통해 리플로우 및 다시 그리기 작업을 줄일 수 있습니다. 많은 수의 DOM 요소를 자주 수정해야 하는 경우 먼저 가상 DOM을 통해 일괄 처리를 수행한 다음 실제 DOM을 한 번에 업데이트하여 리플로우 및 다시 그리기 횟수를 줄일 수 있습니다.

샘플 코드:

// 创建虚拟DOM
const virtualDOM = document.createElement('div');
virtualDOM.style.width = '200px';
virtualDOM.style.height = '300px';

// 批量批处理
for (let i = 0; i < 1000; i++) {
    const element = document.createElement('span');
    element.innerText = 'Hello Virtual DOM';
    virtualDOM.appendChild(element);
}

// 一次性更新真实DOM
document.body.appendChild(virtualDOM);
  1. 제한 및 디바운스 사용
    제한 및 디바운스는 페이지 성능을 최적화하기 위해 일반적으로 사용되는 기술입니다. 조절은 이벤트의 트리거 빈도를 제한하여 빈번한 트리거로 인한 리플로우 및 다시 그리기 작업을 방지할 수 있으며, 흔들림 방지는 이벤트의 트리거 시간을 지연시켜 짧은 시간 내에 하나의 이벤트만 트리거하는 효과를 달성할 수 있습니다. 리플로우 및 다시 그리기 작업.

샘플 코드:

// 节流方式
function throttle(fn, delay) {
    let timer = null;
    return function() {
        if (!timer) {
            timer = setTimeout(() => {
                timer = null;
                fn.apply(this, arguments);
            }, delay);
        }
    };
}

// 防抖方式
function debounce(fn, delay) {
    let timer = null;
    return function() {
        clearTimeout(timer);
        timer = setTimeout(() => {
            fn.apply(this, arguments);
        }, delay);
    };
}

// 使用节流方式绑定事件
element.addEventListener('scroll', throttle(function() {
    // 处理滚动事件
}, 200));

// 使用防抖方式绑定事件
element.addEventListener('resize', debounce(function() {
    // 处理调整窗口大小事件
}, 200));

위의 방법을 통해 빈번한 리플로우 및 다시 그리기 작업을 효과적으로 방지하고 페이지의 성능과 사용자 경험을 향상시킬 수 있습니다. 개발 과정에서 CSS 변환 속성의 합리적인 사용, 레이아웃 속성에 대한 액세스 감소, 일괄 처리를 위한 가상 DOM 사용, 조절 및 흔들림 방지 기술 사용에 주의를 기울여야 합니다. 페이지의 렌더링 작업을 신중하게 최적화하면 사용자에게 더 빠르고 원활한 탐색 환경을 제공할 수 있습니다.

위 내용은 리플로우 및 다시 그리기 작업을 줄이는 팁과 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.