11# Visible
22
3- > The ` v-b-visible ` directive allows you to react when an element becomes visible in the viewport.
3+ > ` v-b-visible ` is a lightweight directive that allows you to react when an element becomes visible
4+ > in the viewport and/or when it moves out of the viewport (or is no longer visible).
45
56The ` v-b-visible ` directive was added in version ` 2.1.0 ` .
67
78## Overview
89
910- ` v-b-visible ` will call your callback method with a boolean value indicating if the element is
10- visible (intersecting) with the viewport.
11+ visible (intersecting with the viewport) or not .
1112- The directive can be placed on almost any element or component.
12- - Changes in visibility cqn also be detected (such as ` display: none ` ), as long as the element is
13- within (or partially within) the viewport, or within the optional offset.
14- - Several BootstrapVue components use ` v-b-visible ` , such as ` <b-img-lazy> ` .
13+ - Changes in visibility can also be detected (such as ` display: none ` ), as long as the element is
14+ within (or partially within) the viewport, or within the optional offset. Note: transitioning to a
15+ non-visible state due to ` v-if="false" ` _ cannot_ be detected.
16+ - Internally, BootstrapVue uses this directive in several components, such as ` <b-img-lazy> ` .
1517- The ` v-b-visible ` directive requires browser support of
1618 [ ` IntersectionObserver ` ] ( https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API ) .
1719 For older browsers that do not support ` IntersectionObserver ` , you will need to use a
1820 [ polyfill] ( /docs/#js ) .
21+ - If ` IntersectionObserver ` support is not detected, then ` v-b-visible ` will assume the element is
22+ _ always visible_ , and will call the callback once with the argument set to ` true ` .
1923
2024## Directive syntax and usage
2125
2226``` html
23- <div v-b-visible.[mod ].[... ] =" callback" >content</div >
27+ <div v-b-visible.[mod1 ].[mod2 ] =" callback" >content</div >
2428```
2529
2630Where ` callback ` is required:
2731
2832- A function reference that will be called whenever visibility changes. The callback is passed a
2933 single boolean argument. ` true ` indicates that the element is intersecting (partially or entirely
3034 visible) in the viewport, or ` false ` if the element is not visible/intersecting with the viewport.
31- The callback will be called each time the element's visibility changes (except when hte ` once `
35+ The callback will be called each time the element's visibility changes (except when the ` once `
3236 modifier is used. See below for details)
3337
34- Where ` [mod ] ` can be (all optional):
38+ Where ` [mod1] ` or ` [mod2 ]` can be (all optional):
3539
36- - A positive number representing the offset (margin) in pixels _ away_ from the edge of the viewport
37- to determine when the element is considered in (or just about to be in) the viewport. The value
38- adds a margin around the view port . The default value is ` 0 ` .
39- - The keyword ` once ` . When this modifier is present, the callback will be called once (with the
40- argument of ` true ` indicating the element is intersecting/ visible) when the element is
41- intersecting with the viewport . Note the callback may be called prior to this with an argument of
42- ` false ` signifying the element is not intersecting/visible.
40+ - A positive integer number representing the offset (margin) in pixels _ away_ from the edge of the
41+ _ viewport _ to determine when the element is considered in (or just about to be in) the viewport.
42+ The value adds a margin around the viewport . The default value is ` 0 ` .
43+ - The keyword ` once ` . When this modifier is present, the callback will be called only once the first
44+ time the element is visible (with the argument of ` true ` indicating the element is
45+ intersecting/visible) . Note the callback _ may be _ called prior to this with an argument of ` false `
46+ signifying the element is not intersecting/visible.
4347
44- ### Usage examples
48+ The order of the modifiers is not important.
4549
46- Basic:
50+ ### Usage syntax examples
51+
52+ In all use cases, the callback function is required.
53+
54+ #### Basic (no modifiers)
4755
4856``` html
4957<template >
@@ -64,8 +72,10 @@ export default {
6472 </script >
6573```
6674
67- With viewport offset modifier of 350px (if the element is outside of the physical viewport by at
68- least 350px, then it will be considered "visible"):
75+ #### With viewport offset modifier
76+
77+ In this example, the modifier value represents 350px (if the element is outside of the physical
78+ viewport by at least 350px, then it will be considered "visible"):
6979
7080``` html
7181<template >
@@ -86,7 +96,7 @@ export default {
8696 </script >
8797```
8898
89- With ` once ` modifier:
99+ #### With the ` once ` modifier
90100
91101``` html
92102<template >
@@ -110,7 +120,7 @@ export default {
110120 </script >
111121```
112122
113- With ` once ` and offset modifiers:
123+ #### With both ` once ` and offset modifiers
114124
115125``` html
116126<template >
@@ -133,3 +143,98 @@ export default {
133143}
134144 </script >
135145```
146+
147+ ## Live examples
148+
149+ Here are two live examples showing two common use cases.
150+
151+ ### Visibility of scrolled content
152+
153+ Scroll the container to see the reaction when the ` <b-badge> ` scrolls into view:
154+
155+ ``` html
156+ <template >
157+ <div >
158+ <div
159+ :class =" [isVisible ? 'bg-info' : 'bg-light', 'border', 'p-2', 'text-center']"
160+ style =" height : 85px ; overflow-y : scroll ;"
161+ >
162+ <p >{{ text }}</p >
163+ <b-badge v-b-visible =" handleVisibility" >Element with v-b-visible directive</b-badge >
164+ <p >{{ text }}</p >
165+ </div >
166+ <p class =" mt-2" >
167+ Visible: {{ isVisible }}
168+ </p >
169+ </div >
170+ </template >
171+
172+ <script >
173+ export default {
174+ data () {
175+ return {
176+ isVisible: false ,
177+ text: `
178+ Quis magna Lorem anim amet ipsum do mollit sit cillum voluptate ex nulla
179+ tempor. Laborum consequat non elit enim exercitation cillum aliqua
180+ consequat id aliqua. Esse ex consectetur mollit voluptate est in duis
181+ laboris ad sit ipsum anim Lorem. Incididunt veniam velit elit elit veniam
182+ Lorem aliqua quis ullamco deserunt sit enim elit aliqua esse irure. Laborum
183+ nisi sit est tempor laborum mollit labore officia laborum excepteur commodo
184+ non commodo dolor excepteur commodo. Ipsum fugiat ex est consectetur ipsum
185+ commodo tempor sunt in proident. Non elixir food exorcism nacho tequila tasty.
186+ `
187+ }
188+ },
189+ methods: {
190+ handleVisibility (isVisible ) {
191+ this .isVisible = isVisible
192+ }
193+ }
194+ }
195+ </script >
196+
197+ <!-- v-b-visible-scroll.vue -->
198+ ```
199+
200+ ### CSS display visibility detection
201+
202+ Click the button to change the ` <div> ` visibility state:
203+
204+ ``` html
205+ <template >
206+ <div >
207+ <b-button @click =" show = !show" class =" mb-2" >Toggle display</b-button >
208+ <p >Visible: {{ isVisible }}</p >
209+ <div class =" border p-3" style =" height : 6em ;" >
210+ <!-- We use Vue's `v-show` directive to control the CSS `display` of the div -->
211+ <div v-show =" show" class =" bg-info p-3" >
212+ <b-badge v-b-visible =" handleVisibility" >Element with v-b-visible directive</b-badge >
213+ </div >
214+ </div >
215+ </div >
216+ </template >
217+
218+ <script >
219+ export default {
220+ data () {
221+ return {
222+ show: true ,
223+ isVisible: false
224+ }
225+ },
226+ methods: {
227+ handleVisibility (isVisible ) {
228+ this .isVisible = isVisible
229+ }
230+ }
231+ }
232+ </script >
233+
234+ <!-- v-b-visible-display.vue -->
235+ ```
236+
237+ ## See also
238+
239+ For more details on ` IntersectionObserver ` , refer to the
240+ [ MDN documentation] ( https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API )
0 commit comments