## 一般流程

1. 不管了，卡就卡吧。（手动滑稽)
2. 看看是电脑在卡还是浏览器在卡。
3. 看Chrome里面的任务管理器，确认有没有页面或者扩展在挖矿。
4. 最近Chrome在DevTools加了Performance Monitor，这里可以看到究竟是什么卡了，JS还是浏览器。
5. 当然很多同学遇到的卡，不是整个Chrome都卡，这时候你需要看看是什么卡，比如是鼠标移动卡，滚动卡还是什么别的。
6. 当我知道是滚动卡，再来多一些信息，比如滚动是来自滚动条的，鼠标滚轮的，触摸板的还是触摸屏的。
8. 如果是某个URL卡，看看是在这个网页所有地方滚动都卡还是在某个地方滚动才卡。

## 如果我是开发者

// Non-transient scrolling reasons.
kNotScrollingOnMain = 0,
kHasBackgroundAttachmentFixedObjects = 1 << 0,
kHasNonLayerViewportConstrainedObjects = 1 << 1,
kScrollbarScrolling = 1 << 3,
kPageOverlay = 1 << 4,

// This bit is set when any of the other main thread scrolling reasons cause
// an input event to be handled on the main thread, and the main thread
// blink::ScrollAnimator is in the middle of running a scroll offset
// animation. Note that a scroll handled by the main thread can result in an
// animation running on the main thread or on the compositor thread.
kCustomScrollbarScrolling = 1 << 15,

// Style-related scrolling on main reasons.
// These *AndLCDText reasons are due to subpixel text rendering which can
// only be applied by blending glyphs with the background at a specific
// screen position; transparency and transforms break this.
kNonCompositedReasonsFirst = 16,
kHasOpacityAndLCDText = 1 << 16,
kHasTransformAndLCDText = 1 << 17,
kBackgroundNotOpaqueInRectAndLCDText = 1 << 18,
kHasClipRelatedProperty = 1 << 20,
kIsNotStackingContextAndLCDText = 1 << 22,
kNonCompositedReasonsLast = 22,

// Transient scrolling reasons. These are computed for each scroll begin.
kNonFastScrollableRegion = 1 << 5,
kFailedHitTest = 1 << 7,
kNoScrollingLayer = 1 << 8,
kNotScrollable = 1 << 9,
kNonInvertibleTransform = 1 << 11,
kPageBasedScrolling = 1 << 12,

// The maximum number of flags in this struct (excluding itself).
// New flags should increment this number but it should never be decremented
// because the values are used in UMA histograms. It should also be noted
// that it excludes the kNotScrollingOnMain value.