Skip to content

Instantly share code, notes, and snippets.

@anniesullie
Last active February 13, 2023 07:52
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save anniesullie/3b85f24e26079858004a369f248a8473 to your computer and use it in GitHub Desktop.
Save anniesullie/3b85f24e26079858004a369f248a8473 to your computer and use it in GitHub Desktop.
Bookmarklet for showing Cumulative Layout Shift
/**
* A bookmarklet for viewing shifted elements while debugging
* Cumulative Layout Shift (web.dev/cls). Works in Chrome 84+
* Shows the previous position of shifted elements in yellow,
* and the new position in red.
*
* To install:
* 1. Copy the code starting from the line beginning `javascript:`
* 2. Add a new bookmark in Chrome, and paste the code in as the URL.
**/
javascript:(function(){
try {
let cls = 0;
const canvas = document.createElement('canvas');
canvas.style.width = '100%';
canvas.style.height = '100%';
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
canvas.style.position = 'absolute';
canvas.style.left = 0;
canvas.style.top = 0;
canvas.style.zIndex = 100000;
canvas.style.pointerEvents = 'none';
document.body.appendChild(canvas);
const context = canvas.getContext('2d');
const po = new PerformanceObserver((list) => {
canvas.style.transition = 'opacity 0s';
canvas.style.opacity = 1;
context.clearRect(0, 0, canvas.width, canvas.height);
for (const entry of list.getEntries()) {
cls += entry.value;
for (const source of entry.sources) {
context.strokeStyle = 'yellow';
context.strokeRect(source.previousRect.x,
source.previousRect.y,
source.previousRect.width,
source.previousRect.height);
context.strokeStyle = 'red';
context.strokeRect(source.currentRect.x,
source.currentRect.y,
source.currentRect.width,
source.currentRect.height);
console.log(source);
}
setTimeout(function() {
canvas.style.transition = 'opacity 2s';
canvas.style.opacity = 0;
}, 100);
}
console.log('Cumulative layout shift = ', cls);
});
po.observe({type: 'layout-shift', buffered: true});
} catch (e) {
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment