Skip to main content
Vuetify0 v1.0 is here
Vuetify0 Logo
Theme
Mode
Palettes
Accessibility
Vuetify One
Sign in to Vuetify One

Access premium tools across the Vuetify ecosystem — Bin, Play, Studio, and more.

Not a subscriber? See what's included

useBreakpoints

Reactive viewport detection for building responsive layouts with named breakpoints.

Edit this page
Report a Bug
Open issues
View on GitHub
Copy Markdown

StableIntermediateJun 29, 2026

Installation

Install the Breakpoints plugin in your app’s entry point:

main.ts
import { createApp } from 'vue'
import { createBreakpointsPlugin } from '@vuetify/v0'
import App from './App.vue'

const app = createApp(App)

app.use(
  createBreakpointsPlugin({
    mobileBreakpoint: 'sm',
    breakpoints: {
      xs: 0,
      sm: 680,
      md: 1024,
      lg: 1280,
      xl: 1920,
      xxl: 2560,
    },
  })
)

app.mount('#app')

Usage

Once the plugin is installed, use the useBreakpoints composable in any component. Destructure the properties you need for automatic ref unwrapping in templates:

vue
<script setup lang="ts">
  import { useBreakpoints } from '@vuetify/v0'

  const { isMobile, mdAndUp, name, width, height } = useBreakpoints()

  if (isMobile.value) {
    console.log('Mobile detected')
  }
</script>

<template>
  <div>
    <!-- Destructured refs auto-unwrap in templates -->
    <nav v-if="mdAndUp">
      <!-- Desktop navigation -->
    </nav>
    <nav v-else>
      <!-- Mobile navigation -->
    </nav>

    <p v-if="isMobile">Mobile layout active</p>
    <p>Current breakpoint: {{ name }}</p>
    <p>Viewport: {{ width }} x {{ height }}</p>
  </div>
</template>
Tip

When using the composable without destructuring, access .value in templates: v-if="breakpoints.isMobile.value". Destructuring to top-level variables enables Vue’s automatic ref unwrapping.

Architecture

useBreakpoints uses the plugin pattern with viewport observation:

Breakpoints Plugin

Use controls to zoom and pan. Click outside or press Escape to close.

Breakpoints Plugin

Reactivity

All breakpoint properties are Readonly<ShallowRef> and automatically update when the viewport size changes. Use .value in script; destructure for template auto-unwrapping.

Breakpoints are range-based, not exact pixel matches. The name is the highest breakpoint whose threshold the viewport meets or exceeds. For example, at 1200px with default thresholds, name is lg because 1200 >= 1145 (the lg threshold) but 1200 < 1545 (the xl threshold). The individual flags like lg mean “the current breakpoint is lg”, while lgAndUp means “the viewport is at least lg” (i.e., lg, xl, or xxl).

PropertyTypeNotes
nameShallowRef<BreakpointName>Current breakpoint name (highest matching threshold)
widthShallowRef<number>Viewport width in pixels
heightShallowRef<number>Viewport height in pixels
isMobileShallowRef<boolean>Below mobile breakpoint threshold
xs / sm / md / lg / xl / xxlShallowRef<boolean>True when this is the current breakpoint
smAndUp / mdAndUp / lgAndUp / xlAndUpShallowRef<boolean>At or above breakpoint
smAndDown / mdAndDown / lgAndDown / xlAndDownShallowRef<boolean>At or below breakpoint
breakpointsRecord<string, number>Static config object (not reactive)
mobileBreakpointBreakpointName | numberThe threshold used to compute isMobile (static)
ssrbooleantrue when running server-side with SSR options
update()Manually trigger viewport dimension and breakpoint recalculation
Tip

xs is always equivalent to “xsAndDown” (nothing is below xs), and xxl is always equivalent to “xxlAndUp” (nothing is above xxl). These redundant combinations are intentionally not provided.

Tip

Zoom-accurate detection Breakpoints use window.matchMedia rather than window.innerWidth. matchMedia reports CSS pixels that account for browser zoom, giving accurate breakpoint detection at all zoom levels.

Examples

Responsive Dashboard Layout

This example wires useBreakpoints into a live analytics dashboard whose card grid reflows as the viewport changes — one column on phones, scaling up to four columns on wide screens. The instrument strip above the grid reads the reactive name, width, height, and isMobile values directly, while the row of chips lights up the active per-breakpoint flag (xs through xxl). Everything updates automatically as you resize or zoom, with no manual listeners.

The teaching point is making layout decisions in JavaScript. useDashboard.ts maps the active breakpoint name to a column count, so the component renders a different structure per breakpoint rather than relying solely on CSS @media rules. Reach for this when a layout choice can’t be expressed in CSS alone — picking a column count, swapping a menu for a dialog, virtualizing only on small screens, or conditionally mounting an expensive widget. Because detection runs through window.matchMedia, the JS flags fire at exactly the same boundaries as your CSS breakpoints, even under browser zoom.

The composable reads its instance once and exposes derived refs; the presentational DashboardGrid.vue translates the column count into a grid class, keeping breakpoint logic out of the markup. The plugin must be installed for reactive updates (see Installation above), and for server rendering pass ssr dimensions so the first paint matches the client. For a lower-level, CSS-only signal without named breakpoints, see useMediaQuery.

FileRole
useDashboard.tsConsumes useBreakpoints, owns the widget data, and derives the column count plus the active-flag map
DashboardGrid.vuePresentational grid that reflows its columns from the derived count
responsive-dashboard.vueEntry that renders the breakpoint instrument strip and wires the composable to the grid
xs
0 x 01 columns Mobile
xssmmdlgxlxxl
Revenue$48.2k+12% this week
Sessions9,3101,204 active now
Conversion3.8%+0.4 pts
Avg. order$72.40212 orders today
Refunds$1.1k6 pending
Churn1.9%-0.2 pts

Resize the window — the grid reflows from one column on phones up to four on wide screens.

Recipes

SSR Support

By default, useBreakpoints returns xs / width 0 on the server. Pass ssr options to render at a known viewport size:

main.ts
app.use(
  createBreakpointsPlugin({
    ssr: {
      clientWidth: 1280,
      clientHeight: 800,
    },
  })
)

On the server, all breakpoint flags are computed from the SSR dimensions — so v-if="mdAndUp" renders correctly in SSR output. On hydration, real window.innerWidth / innerHeight replace the SSR values.

Tip

In Nuxt, read the viewport from a cookie or user-agent hint so the SSR dimensions match the actual device. See the Nuxt integration guide for a cookie-based example.

FAQ

Discord
Need help? Join our community for support and discussions ↗

API Reference

The following API details are for the useBreakpoints composable.
Was this page helpful?

© 2016-1970 Vuetify, LLC
Services
Ctrl+/