@@ -3,13 +3,12 @@ import { LazyOptions, LazyBinding, LazyElement } from '../types/index.js'
3
3
export class LazyCore {
4
4
private useNative : boolean
5
5
private rootMargin : string
6
- private type : 'loading' | 'observer' | 'none' = 'loading '
6
+ private type ? : 'loading' | 'observer' | 'none'
7
7
private io ?: IntersectionObserver
8
8
9
9
constructor ( options : LazyOptions ) {
10
10
this . useNative = options ?. useNative ?? true
11
11
this . rootMargin = options ?. rootMargin ?? '200px'
12
- this . init ( )
13
12
}
14
13
15
14
private init ( ) {
@@ -25,8 +24,9 @@ export class LazyCore {
25
24
}
26
25
27
26
bind ( el : Element , binding : LazyBinding ) {
27
+ ! this . type && this . init ( )
28
28
binding . arg !== 'bg' &&
29
- binding . arg !== 'background ' &&
29
+ binding . arg !== 'bgset ' &&
30
30
! el . hasAttribute ( 'loading' ) &&
31
31
el . setAttribute ( 'loading' , 'lazy' )
32
32
this . update ( el , binding )
@@ -36,75 +36,66 @@ export class LazyCore {
36
36
if ( oldValue === value ) return
37
37
const isEager = el . getAttribute ( 'loading' ) === 'eager'
38
38
39
- if ( arg ) {
40
- switch ( arg ) {
41
- case 'bg' :
42
- case 'background' :
43
- if ( ( el as LazyElement ) . style . backgroundImage ) {
44
- ( el as LazyElement ) . style . backgroundImage = ''
45
- }
46
- if ( ! isEager && ( this . type === 'loading' || this . type === 'observer' ) ) {
47
- if ( ! this . io ) {
48
- this . setObserver ( )
49
- }
50
- el . setAttribute ( 'data-bg' , value )
51
- this . io ?. observe ( el )
52
- } else {
53
- ( el as LazyElement ) . style . backgroundImage = `url(${ value } )`
54
- }
55
- break ;
56
- case 'set' :
57
- case 'srcset' :
58
- el . hasAttribute ( 'srcset' ) && el . removeAttribute ( 'srcset' )
59
- if ( this . type === 'loading' ) {
60
- el . setAttribute ( 'srcset' , value )
61
- } else if ( ! isEager && this . type === 'observer' ) {
62
- el . setAttribute ( 'data-srcset' , value )
63
- this . io ?. observe ( el )
64
- } else {
65
- el . setAttribute ( 'srcset' , value )
66
- }
67
- break
68
- default :
69
- error ( 'One of [v-lazy="URL", v-lazy:bg="URL", v-lazy:background="URL", v-lazy:set="URL", v-lazy:srcset="URL"]' )
70
- break ;
71
- }
72
- } else {
73
- el . hasAttribute ( 'src' ) && el . removeAttribute ( 'src' )
74
- if ( this . type === 'loading' ) {
75
- el . setAttribute ( 'src' , value )
76
- } else if ( ! isEager && this . type === 'observer' ) {
77
- el . setAttribute ( 'data-src' , value )
78
- this . io ?. observe ( el )
79
- } else {
80
- el . setAttribute ( 'src' , value )
81
- }
39
+ switch ( arg ) {
40
+ case undefined :
41
+ el . hasAttribute ( 'src' ) && el . removeAttribute ( 'src' )
42
+ if ( ! isEager && this . type === 'observer' ) {
43
+ el . setAttribute ( 'data-src' , value )
44
+ this . io ! . observe ( el )
45
+ } else {
46
+ el . setAttribute ( 'src' , value )
47
+ }
48
+ break
49
+ case 'set' :
50
+ case 'srcset' :
51
+ el . hasAttribute ( 'srcset' ) && el . removeAttribute ( 'srcset' )
52
+ if ( ! isEager && this . type === 'observer' ) {
53
+ el . setAttribute ( 'data-srcset' , value )
54
+ this . io ! . observe ( el )
55
+ } else {
56
+ el . setAttribute ( 'srcset' , value )
57
+ }
58
+ break
59
+ case 'bg' :
60
+ if ( ! isEager && ( this . type === 'loading' || this . type === 'observer' ) ) {
61
+ ! this . io && this . setObserver ( )
62
+ el . setAttribute ( 'data-bg' , value )
63
+ this . io ! . observe ( el )
64
+ } else {
65
+ setStyle ( el , 'bg' , value )
66
+ }
67
+ break ;
68
+ case 'bgset' :
69
+ if ( ! isEager && ( this . type === 'loading' || this . type === 'observer' ) ) {
70
+ ! this . io && this . setObserver ( )
71
+ el . setAttribute ( 'data-bgset' , value )
72
+ this . io ! . observe ( el )
73
+ } else {
74
+ setStyle ( el , 'bgset' , value )
75
+ }
76
+ break ;
77
+ default :
78
+ error ( 'One of v-lazy, v-lazy:set, v-lazy:srcset, v-lazy:bg, v-lazy:bgset' )
79
+ break ;
82
80
}
83
81
}
84
82
85
83
unbind ( el : Element ) {
86
- if ( this . type === 'observer' ) {
87
- this . io ?. unobserve ( el )
88
- }
84
+ this . type === 'observer' && this . io ! . unobserve ( el )
89
85
}
90
86
91
87
private setObserver ( ) {
92
88
this . io = new IntersectionObserver ( entries => {
93
89
entries . forEach ( item => {
94
90
if ( item . isIntersecting ) {
95
91
const el = ( item . target as LazyElement )
96
- const { src, srcset, bg } = getDataset ( el )
97
-
98
- if ( src ) {
99
- el . src = src
100
- }
101
- if ( srcset ) {
102
- el . srcset = srcset
103
- }
104
- if ( bg ) {
105
- el . style . backgroundImage = `url(${ bg } )`
106
- }
107
- this . io ?. unobserve ( item . target )
92
+ const { src, srcset, bg, bgset } = getDataset ( el )
93
+
94
+ bg && setStyle ( el , 'bg' , bg )
95
+ bgset && setStyle ( el , 'bgset' , bgset )
96
+ src && el . setAttribute ( 'src' , src )
97
+ srcset && el . setAttribute ( 'srcset' , srcset )
98
+ this . io ! . unobserve ( item . target )
108
99
}
109
100
} )
110
101
} , {
@@ -126,8 +117,8 @@ function getDataset(el: LazyElement) {
126
117
const key = name . split ( '-' ) [ 1 ]
127
118
const value = el . attributes [ i ] . nodeValue || undefined
128
119
129
- if ( [ 'src' , 'srcset' , 'bg' ] . indexOf ( key ) !== - 1 ) {
130
- obj [ key as 'src' | 'srcset' | 'bg' ] = value
120
+ if ( [ 'src' , 'srcset' , 'bg' , 'bgset' ] . indexOf ( key ) !== - 1 ) {
121
+ obj [ key as 'src' | 'srcset' | 'bg' | 'bgset' ] = value
131
122
}
132
123
}
133
124
}
@@ -139,6 +130,17 @@ export function getVueVersion(Vue: any) {
139
130
return Number ( Vue . version . split ( '.' ) [ 0 ] )
140
131
}
141
132
133
+ export function setStyle ( el : Element , type : 'bg' | 'bgset' , value : string ) {
134
+ const oldStyle = el . getAttribute ( 'style' ) || ''
135
+ const style =
136
+ type === 'bg'
137
+ ? `background-image: url(${ value } );`
138
+ : `background-image: -webkit-image-set(${ value } ); background-image: image-set(${ value } );`
139
+ const newStyle = oldStyle + style
140
+
141
+ el . setAttribute ( 'style' , newStyle )
142
+ }
143
+
142
144
export function error ( msg : string ) {
143
145
process . env . NODE_ENV === 'development' &&
144
146
console . error ( '[vue-lazy-loading error]: ' + msg ) ;
0 commit comments