22* @Author : Alex Dong
33* @Date : 2020-07-29 13:21:07
44* @Last Modified by: Alex Dong
5- * @Last Modified time: 2021-02-02 19:35:42
5+ * @Last Modified time: 2021-02-21 00:29:05
66*/
77
88define ( [
@@ -18,24 +18,7 @@ define([
1818
1919 _create : function ( ) {
2020 var options = this . options ;
21- var self = this ;
22- if ( "IntersectionObserver" in window ) {
23- let gridSliderObserver = new IntersectionObserver ( function ( entries , observer ) {
24- entries . forEach ( function ( entry ) {
25- if ( entry . isIntersecting ) {
26- // let el = entry.target;
27- self . _initSlider ( ) ;
28- gridSliderObserver . unobserve ( entry . target ) ;
29- }
30- } ) ;
31- } ) ;
32-
33- self . element . each ( function ( index , el ) {
34- gridSliderObserver . observe ( el ) ;
35- } ) ;
36- } else {
37- self . _initSlider ( ) ;
38- }
21+ this . _initSlider ( ) ;
3922 } ,
4023
4124 _uniqid : function ( a = "" , b = false ) {
@@ -53,83 +36,122 @@ define([
5336 _initSlider : function ( ) {
5437 var options = this . options ;
5538 var self = this ;
39+ var $head = $ ( 'head' ) ;
5640 self . element . find ( options . selector ) . each ( function ( ) {
57- var el = $ ( this ) ;
41+ var element = $ ( this ) ;
5842 var selector = 'grid-slider-' + self . _uniqid ( ) ;
59- el . addClass ( selector ) ;
43+ var styleId = selector ;
44+ element . addClass ( selector ) ;
6045 selector = '.' + selector ;
6146 if ( $ ( 'body' ) . hasClass ( 'rtl' ) ) {
62- el . attr ( 'dir' , 'rtl' ) ;
63- el . data ( 'rtl' , true ) ;
47+ element . attr ( 'dir' , 'rtl' ) ;
48+ element . data ( 'rtl' , true ) ;
6449 }
65- var options = el . data ( ) ;
50+ var options = element . data ( ) ;
6651 if ( iClass === undefined ) {
67- el . children ( ) . addClass ( 'alo-item' ) ;
52+ element . children ( ) . addClass ( 'alo-item' ) ;
6853 var iClass = '.alo-item' ;
6954 }
70- var classes = selector + ' ' + iClass ;
71- var padding = options . padding ;
72- var float = $ ( 'body' ) . hasClass ( 'rtl' ) ? 'right' : 'left' ;
73- var style = padding ? classes + '{float: ' + float + '; padding: 0 ' + padding + 'px; box-sizing: border-box} ' + selector + '{margin: 0 -' + padding + 'px}' : '' ;
55+ var classes = selector + ' ' + iClass ;
56+ var padding = options . padding ;
57+ var float = $ ( 'body' ) . hasClass ( 'rtl' ) ? 'right' : 'left' ;
58+ var style = padding ? classes + '{float: ' + float + '; padding: 0 ' + padding + 'px; box-sizing: border-box} ' + selector + '{margin: 0 -' + padding + 'px}' : '' ;
59+ $head . append ( '<style type="text/css" >' + style + '</style>' ) ;
60+ style = '' ;
7461 if ( options . slidesToShow ) {
75- var lazy = el . find ( 'img.lazyload' ) ;
76- if ( lazy . length ) {
77- lazy . each ( function ( index ) {
78- $ ( this ) . data ( 'lazy' , $ ( this ) . data ( 'src' ) ) ;
79- } ) ;
80- }
81- el . on ( 'init' , function ( event , slick ) {
82- $ ( 'body' ) . trigger ( 'contentUpdated' ) ; // support lazyload
83- var video = $ ( this ) . find ( '.external-video' ) ;
84- video . click ( function ( event ) {
85- var $this = $ ( this ) ;
86- var img = $this . find ( 'img' ) ;
87- event . preventDefault ( ) ;
88- var url = $ ( this ) . data ( 'video' ) ;
89- url = url . replace ( "://vimeo.com/" , "://player.vimeo.com/video/" ) ;
90- url = url . replace ( "://www.youtube.com/watch?v=" , "://youtube.com/embed/" ) ;
91- url = url + '?autoplay=1&badge=0' ;
92- var iframe = '<iframe class="iframe-video" src="' + url + '" width="' + img . width ( ) + '" height="' + img . height ( ) + '" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>' ;
93- $this . append ( iframe ) . addClass ( 'embed' ) ;
94- img . hide ( ) ;
95- } ) ;
96- } ) ;
97-
98- var slider = el . slick ( options ) ;
99- el . on ( 'beforeChange' , function ( event , slick , currentSlide , nextSlide ) {
100- var video = $ ( this ) . find ( '.external-video' ) ;
101- video . removeClass ( 'embed' ) . find ( 'img' ) . show ( ) ;
102- video . find ( '.iframe-video' ) . remove ( ) ;
103- } ) ;
104- slider . on ( "click" , ".item" , function ( ) {
105- el . slick ( 'slickSetOption' , "autoplay" , false , false ) ;
106- } ) ;
107- } else {
108- var responsive = options . responsive ;
109- if ( responsive == undefined ) return ;
110- var length = Object . keys ( responsive ) . length ;
62+ if ( "IntersectionObserver" in window ) {
63+ var nthChild = options . slidesToShow + 1 ;
64+ style += selector + ' .item:nth-child(n+ ' + nthChild + ')' + '{display: none;} ' + selector + ' .item{float:left};' ;
65+ let gridSliderObserver = new IntersectionObserver ( function ( entries , observer ) {
66+ entries . forEach ( function ( entry ) {
67+ if ( entry . isIntersecting ) {
68+ let el = entry . target ;
69+ $head . find ( '#' + styleId ) . remove ( ) ;
70+ self . sliderRender ( $ ( el ) ) ;
71+ gridSliderObserver . unobserve ( el ) ;
72+ }
73+ } ) ;
74+ } ) ;
11175
112- $ . each ( responsive , function ( key , value ) {
113- var col = 0 ;
114- var maxWith = 0 ;
115- var minWith = 0 ;
116- $ . each ( value , function ( size , num ) { minWith = parseInt ( size ) + 1 ; col = num ; } ) ;
117- if ( key + 2 < length ) {
118- $ . each ( responsive [ key + 1 ] , function ( size , num ) { maxWith = size ; col = num ; } ) ;
119- style += ' @media (min-width: ' + minWith + 'px) and (max-width: ' + maxWith + 'px)' ;
120- } else {
121- if ( key + 2 == length ) return ; // don't use key = length - 1;
122- $ . each ( responsive [ key ] , function ( size , num ) { maxWith = size ; col = num ; } ) ;
123- style += ' @media (min-width: ' + maxWith + 'px)' ;
124- }
125- style += ' {' + selector + '{margin: 0 -' + padding + 'px}' + classes + '{padding: 0 ' + padding + 'px; box-sizing: border-box; width: ' + ( Math . floor ( ( 10 / col ) * 100000000000 ) / 10000000000 ) + '%} ' + classes + ':nth-child(' + col + 'n+1){clear: ' + float + ';}}' ;
126- } ) ;
76+ element . each ( function ( index , el ) {
77+ gridSliderObserver . observe ( el ) ;
78+ } ) ;
79+ } else {
80+ self . sliderRender ( element ) ;
81+ }
12782 }
83+ var responsive = self . getPesponsive ( options ) ;
84+ if ( responsive == undefined ) return ;
85+ var length = Object . keys ( responsive ) . length ;
86+ $ . each ( responsive , function ( key , value ) {
87+ var col = 0 ;
88+ var maxWith = 0 ;
89+ var minWith = 0 ;
90+ $ . each ( value , function ( size , num ) { minWith = parseInt ( size ) + 1 ; col = num ; } ) ;
91+ if ( key + 2 < length ) {
92+ $ . each ( responsive [ key + 1 ] , function ( size , num ) { maxWith = size ; col = num ; } ) ;
93+ style += ' @media (min-width: ' + minWith + 'px) and (max-width: ' + maxWith + 'px)' ;
94+ } else {
95+ if ( key + 2 == length ) return ; // don't use key = length - 1;
96+ $ . each ( responsive [ key ] , function ( size , num ) { maxWith = size ; col = num ; } ) ;
97+ style += ' @media (min-width: ' + maxWith + 'px)' ;
98+ }
99+ style += ' {' + selector + '{margin: 0 -' + padding + 'px}' + classes + '{padding: 0 ' + padding + 'px; box-sizing: border-box; width: ' + ( Math . floor ( ( 10 / col ) * 100000000000 ) / 10000000000 ) + '%} ' + classes + ':nth-child(' + col + 'n+1){clear: ' + float + ';}}' ;
100+ } ) ;
101+ $head . append ( '<style type="text/css" id="' + styleId + '" >' + style + '</style>' ) ;
102+
103+ } ) ;
104+ } ,
128105
129- $ ( 'head' ) . append ( '<style type="text/css">' + style + '</style>' ) ;
106+ getPesponsive : function ( options ) {
107+ if ( ! options . slidesToShow ) return options . responsive ;
108+ var responsive = options . responsive ;
109+ var length = Object . keys ( responsive ) . length ;
110+ var gridResponsive = [ ] ;
111+ $ . each ( responsive , function ( key , value ) {
112+ var breakpoint = { } ;
113+ breakpoint [ value . breakpoint ] = parseInt ( value . settings . slidesToShow ) ;
114+ gridResponsive . push ( breakpoint ) ;
115+ } ) ;
116+ return gridResponsive . reverse ( ) ;
117+ } ,
118+
119+ sliderRender : function ( el ) {
120+ var options = el . data ( ) ;
121+ var lazy = el . find ( 'img.lazyload' ) ;
122+ if ( lazy . length ) {
123+ lazy . each ( function ( index ) {
124+ $ ( this ) . data ( 'lazy' , $ ( this ) . data ( 'src' ) ) ;
125+ } ) ;
126+ }
127+ el . on ( 'init' , function ( event , slick ) {
128+ $ ( 'body' ) . trigger ( 'contentUpdated' ) ; // support lazyload
129+ var video = $ ( this ) . find ( '.external-video' ) ;
130+ video . click ( function ( event ) {
131+ var $this = $ ( this ) ;
132+ var img = $this . find ( 'img' ) ;
133+ event . preventDefault ( ) ;
134+ var url = $ ( this ) . data ( 'video' ) ;
135+ url = url . replace ( "://vimeo.com/" , "://player.vimeo.com/video/" ) ;
136+ url = url . replace ( "://www.youtube.com/watch?v=" , "://youtube.com/embed/" ) ;
137+ url = url + '?autoplay=1&badge=0' ;
138+ var iframe = '<iframe class="iframe-video" src="' + url + '" width="' + img . width ( ) + '" height="' + img . height ( ) + '" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>' ;
139+ $this . append ( iframe ) . addClass ( 'embed' ) ;
140+ img . hide ( ) ;
141+ } ) ;
142+ } ) ;
130143
144+ var slider = el . slick ( options ) ;
145+ el . on ( 'beforeChange' , function ( event , slick , currentSlide , nextSlide ) {
146+ var video = $ ( this ) . find ( '.external-video' ) ;
147+ video . removeClass ( 'embed' ) . find ( 'img' ) . show ( ) ;
148+ video . find ( '.iframe-video' ) . remove ( ) ;
149+ } ) ;
150+ slider . on ( "click" , ".item" , function ( ) {
151+ el . slick ( 'slickSetOption' , "autoplay" , false , false ) ;
131152 } ) ;
132153 }
154+
133155 } ) ;
134156
135157 return $ . magepow . gridSlider ;
0 commit comments