Skip to content

useElementBounding

Category
Export Size
1.31 kB
Last Changed
6 months ago

Reactive bounding box of an HTML element

Demo

Resize the box to see changes

Usage

vue
<script setup lang="ts">
import { 
useElementBounding
} from '@vueuse/core'
import {
useTemplateRef
} from 'vue'
const
el
=
useTemplateRef
('el')
const {
x
,
y
,
top
,
right
,
bottom
,
left
,
width
,
height
} =
useElementBounding
(
el
)
</script> <template> <
div
ref
="
el
" />
</template>

Component Usage

This function also provides a renderless component version via the @vueuse/components package. Learn more about the usage.

vue
<template>
  <UseElementBounding v-slot="{ 
width
,
height
}">
Width: {{
width
}} Height: {{
height
}}
</UseElementBounding> </template>

Directive Usage

This function also provides a directive version via the @vueuse/components package. Learn more about the usage.

vue
<script setup lang="ts">
import { 
vElementBounding
} from '@vueuse/components'
interface BoundingType {
height
: number
bottom
: number
left
: number
right
: number
top
: number
width
: number
x
: number
y
: number
} function
onBounding
({
height
,
bottom
,
left
,
right
,
top
,
width
,
x
,
y
}: BoundingType) {
console
.
log
(
height
,
bottom
,
left
,
right
,
top
,
width
,
x
,
y
)
} const
options
= {
reset
: true,
windowResize
: true,
windowScroll
: true,
immediate
: true,
updateTiming
: 'sync',
} </script> <template> <
textarea
v-element-boundi
ng="
onBounding
" />
<!-- with options --> <
textarea
v-element-boundi
ng="
[
onBounding
,
options
]
" />
</template>

Type Declarations

Show Type Declarations
ts
export interface UseElementBoundingOptions {
  /**
   * Reset values to 0 on component unmounted
   *
   * @default true
   */
  
reset
?: boolean
/** * Listen to window resize event * * @default true */
windowResize
?: boolean
/** * Listen to window scroll event * * @default true */
windowScroll
?: boolean
/** * Immediately call update on component mounted * * @default true */
immediate
?: boolean
/** * Timing to recalculate the bounding box * * Setting to `next-frame` can be useful when using this together with something like {@link useBreakpoints} * and therefore the layout (which influences the bounding box of the observed element) is not updated on the current tick. * * @default 'sync' */
updateTiming
?: "sync" | "next-frame"
} /** * Reactive bounding box of an HTML element. * * @see https://vueuse.org/useElementBounding * @param target */ export declare function
useElementBounding
(
target
:
MaybeComputedElementRef
,
options
?: UseElementBoundingOptions,
): {
height
:
ShallowRef
<number, number>
bottom
:
ShallowRef
<number, number>
left
:
ShallowRef
<number, number>
right
:
ShallowRef
<number, number>
top
:
ShallowRef
<number, number>
width
:
ShallowRef
<number, number>
x
:
ShallowRef
<number, number>
y
:
ShallowRef
<number, number>
update
: () => void
} export type
UseElementBoundingReturn
=
ReturnType
<typeof
useElementBounding
>

Source

SourceDemoDocs

Contributors

Anthony Fu
Anthony Fu
Jelf
青椒肉丝
wheat
Robin
IlyaL
Robin
Jonas Schade
huiliangShen
vaakian X
Ducz01
hsyq
Hebilicious
webfansplz
Ciro Lo Sapio
Shinigami
Alex Kozack

Changelog

v12.3.0 on
67a9c - feat: added directive for vElementBounding (#4436)
v12.0.0-beta.1 on
0a9ed - feat!: drop Vue 2 support, optimize bundles and clean up (#4349)
v11.0.0-beta.2 on
0fa17 - feat: add updateTiming option (#3869)
v10.7.1 on
70dbd - fix: trigger by css or style (#3664)

Released under the MIT License.

Build faster with AI
New Masterclass to help you leverage AI in your Vue workflow
Get Early Access