Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

svelte-visibility-change

metonym1.1kMIT0.7.0TypeScript support: included

Detect browser page visibility changes using the Page Visibility API

svelte, svelte component, page visibility, browser tab, focus, blur, api

readme

svelte-visibility-change

NPM

Detect browser page visibility changes using the Page Visibility API

Use this utility component and action to listen to browser page visibility changes.

The visibility state of a page can either be visible or hidden.

Use cases

  • make a network request when the browser tab is focused
  • check for app UI updates when the tab is focused
  • play/pause audio when the tab is focused/blurred
  • pause expensive background computations when the tab is blurred

Try it in the Svelte REPL.


Installation

# npm
npm i svelte-visibility-change

# pnpm
pnpm i svelte-visibility-change

# Yarn
yarn add svelte-visibility-change

# Bun
bun add svelte-visibility-change

Usage

Basic

Bind to the state prop to determine if the current tab is currently visible or hidden.

In the following example, switch to a different tab in the same browser window. The page title should change from "visible" to "hidden."

<script>
  import VisibilityChange from "svelte-visibility-change";

  let state; /** "visible" | "hidden" */

  $: if (typeof window !== "undefined") {
    document.title = state;
  }
</script>

<VisibilityChange bind:state />

visible / hidden

You can also bind to the boolean visible and hidden props.

<script>
  import VisibilityChange from "svelte-visibility-change";

  let visible; /** boolean */
  let hidden; /** boolean */
</script>

<VisibilityChange bind:visible bind:hidden />

on:visible / on:hidden

An alternative to binding to props is to listen to the on:visible and on:hidden dispatched events.

<script>
  import VisibilityChange from "svelte-visibility-change";

  let events = [];
</script>

<VisibilityChange
  on:visible={() => (events = [...events, "on:visible"])}
  on:hidden={() => (events = [...events, "on:hidden"])}
/>

{events.join(", ")}

on:change

This component dispatches an on:change event whenever a visibilitychange event occurs.

Note: unlike on:visible, this event only fires when the page visibility changes after the component has mounted.

<VisibilityChange
  on:change={({ detail }) => {
    console.log(detail.state); // "visible" | "hidden"
    console.log(detail.visible); // boolean
    console.log(detail.hidden); // boolean
  }}
/>

visibilityChange action

An alternative to the VisibilityChange component is the visibilityChange action.

The action only dispatches a "change" event with the same event.detail signature.

<script>
  import { visibilityChange } from "svelte-visibility-change";
</script>

<div
  use:visibilityChange
  on:visibilitychange={({ detail }) => {
    console.log(detail.state); // "visible" | "hidden"
    console.log(detail.visible); // boolean
    console.log(detail.hidden); // boolean
  }}
>
</div>

API

Props

Name Type Default value
state "visible" or "hidden" undefined
visible boolean false
hidden boolean false

Dispatched Events

  • on:visible: fired if the page is visible
  • on:hidden: fired if the page visibility is hidden
  • on:change: fired when a page visibility event occurs, after the initial mount

Changelog

CHANGELOG.md

License

MIT

changelog

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

0.7.0 - 2025-03-21

  • add exports field to package.json
  • use svelteHTML namespace for on:visibilitychange event

0.6.0 - 2022-06-28

  • use DocumentVisibilityState to type state prop
  • rename action change event to visibilitychange
  • remove OnChangeEvent type; instead, type the action event through the JSX namespace
  • type visibilityChange using the Svelte Action type
  • colocate types in src folder

0.5.2 - 2022-06-28

  • VisibilityChange change event should dispatch after state changes

0.5.1 - 2021-12-16

  • set type="module" in package.json

0.5.0 - 2021-11-28

  • add visibilityChange action

0.4.0 - 2021-10-31

Breaking Changes

  • rename defaultProps TypeScript interface to VisibilityChangeProps

0.3.1 - 2021-10-26

Documentation

  • update README examples to use full component import

0.3.0 - 2021-10-10

Features

  • add dispatched event descriptions to TypeScript definitions

0.2.0 - 2021-09-11

  • use .svelte.d.ts extension for component TypeScript definition

0.1.2 - 2021-08-02

  • package.json#main should specify src/index.js as the entry point

0.1.1 - 2021-07-18

  • fix typo in documentation

0.1.0 - 2021-07-18

  • initial release