---
title: "Non-passive scroll listener (bp/passive-listener)"
description: "The browser waits for a touch or wheel listener before every scroll frame unless it is passive (Lighthouse: does not use passive listeners to improve scrolling performance)."
url: http://localhost:4173/rules/bp/passive-listener
updated: 2026-11-11
---

# Non-passive scroll listener

> `bp/passive-listener` is a vetd rule. It flags: Non-passive scroll listener. It runs on every `check`, together with the TypeScript check.

| Fact | Value |
| --- | --- |
| Rule id | `bp/passive-listener` |
| Severity | warning |
| Group | Best practices |
| Tags | performance, lighthouse |

## Why it matters

The browser waits for a touch or wheel listener before every scroll frame unless it is passive (Lighthouse: does not use passive listeners to improve scrolling performance).

## How to fix it

Pass { passive: true } when the handler never calls preventDefault().

## Credit

Based on work by:

- [Google Chrome](https://developer.chrome.com/docs/lighthouse/overview): Lighthouse recommends passive listeners so touch and wheel handlers do not block scrolling.

## References

- [Use passive listeners to improve scrolling performance](https://developer.chrome.com/docs/lighthouse/best-practices/uses-passive-event-listeners), Chrome for Developers
- [EventTarget: addEventListener() method](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener), MDN Web Docs

## See it

Demos in the vetd Lab:

- [Use passive scroll listeners](http://localhost:4173/lab/web-perf/passive-scroll-listeners)

## Related rules

- [`bp/unload-listener`](http://localhost:4173/rules/bp/unload-listener.md)

## Get this text from vetd

MCP: call `explain` with `{ "diagnosticId": "bp/passive-listener" }`. CLI: `npx vetd explain bp/passive-listener`.

---

[All 92 rules](http://localhost:4173/rules.md) · Previous: [`bp/unload-listener`](http://localhost:4173/rules/bp/unload-listener.md) · Next: [`bp/http-url`](http://localhost:4173/rules/bp/http-url.md)
