1
- /*
2
- magic-slider ... Version 0.1.0
3
- https://github.com/orangenwerk/magic-slider / http://orangenwerk.github.com/magic-slider/
4
- **************************************************************************************************
5
- based on jQuery Coda-Slider v2.0 / Coda-Slider v2.1 / moutardeSlider
6
- Coda-Slider v2.0 - http://www.ndoherty.biz/coda-slider
7
- Coda-Slider v2.1 - https://github.com/jgillman/Coda-Slider-2.1
8
- moutardeSlider - https://github.com/fstephany/moutardeSlider
9
- MIT license.
10
- **************************************************************************************************
11
- improvenments by Austin Strange
1
+ /*!
2
+ w-magic-slider (modify by w)
3
+ original info:
4
+ magic-slider ... Version 0.1.0
5
+ https://github.com/orangenwerk/magic-slider
6
+ MIT license
12
7
*/
13
8
14
- $ . fn . magicSlider = function ( settings ) {
9
+
10
+ window . jQuery . fn . magicSlider = function ( settings ) {
11
+ var $ = window . jQuery ;
15
12
16
13
settings = $ . extend ( {
17
14
autoHeight : true ,
@@ -31,13 +28,19 @@ $.fn.magicSlider = function(settings) {
31
28
dynamicTabsContent : "title" , // "title" / "count"
32
29
externalTriggerSelector : "a.xtrig" ,
33
30
highlightExternalTrigger : false ,
31
+ externalTriggerHighlightClass :'current' ,
32
+ functionsOut :{ } ,
34
33
firstPanelToLoad : 1 ,
34
+ firstPanelLoadNoAnimate : false ,
35
35
panelTitleSelector : "h2.title" ,
36
36
slideEaseDuration : 1000 ,
37
37
slideEaseFunction : "swing" ,
38
38
slideDirection : "horizontal" , // "horizontal" / "vertical"
39
39
carousel : false ,
40
40
changeSliderHeadline : false ,
41
+ eventBeforeSlideMove :function ( targetPanelIndex , panelCount ) { } , //eventBeforeSlideMove(targetPanelIndex)
42
+ touchSlideSwitch :true ,
43
+ touchSlideTriggerPixels :50 ,
41
44
sliderHeadlineSelector : "#magic_slider_head" // Selector for headline
42
45
} , settings ) ;
43
46
@@ -46,6 +49,8 @@ $.fn.magicSlider = function(settings) {
46
49
var slider = $ ( this ) ,
47
50
sliderID = slider . attr ( 'id' ) ;
48
51
52
+ var isAnimating = false ;
53
+
49
54
// If Headlineanimation wanted
50
55
if ( settings . changeSliderHeadline == true ) { var panelHeadlines = new Array ( ) ; } ;
51
56
@@ -63,6 +68,7 @@ $.fn.magicSlider = function(settings) {
63
68
} ;
64
69
} ;
65
70
} ) ;
71
+ //console.log('panelsHeights',panelsHeights);
66
72
67
73
var biggestPanel = Array_max ( panelsHeights ) ;
68
74
@@ -76,8 +82,8 @@ $.fn.magicSlider = function(settings) {
76
82
// Slider vars
77
83
var panelWidth = slider . find ( '.' + sliderID + '_panel' ) . width ( ) ,
78
84
panelCount = slider . find ( '.' + sliderID + '_panel' ) . size ( ) ,
79
- navClicks = 0 ; // Used if autoSlideStopWhenClicked = true
80
- last = false ; // Used in carousel mode
85
+ navClicks = 0 , // Used if autoSlideStopWhenClicked = true
86
+ last = false , // Used in carousel mode
81
87
clon = '' ; // Used in carousel mode => 'first' / 'last'
82
88
83
89
// Special vars depend on Slider-Type
@@ -106,6 +112,8 @@ $.fn.magicSlider = function(settings) {
106
112
}
107
113
} ;
108
114
115
+ var classNeedRemove = null ;
116
+
109
117
// Surround the collection of panel divs with a container div (wide enough for all panels to be lined up end-to-end)
110
118
$ ( '.' + sliderID + '_panel' , slider ) . wrapAll ( '<div class="' + sliderID + '_panel_container panel-container"></div>' ) ;
111
119
// Specify the width of the container div (wide enough for all panels to be lined up end-to-end)
@@ -123,10 +131,10 @@ $.fn.magicSlider = function(settings) {
123
131
} else {
124
132
var currentPanel = 1 ;
125
133
} ;
126
- moveToPanel ( currentPanel ) ;
134
+ classNeedRemove = settings . externalTriggerHighlightClass . replace ( '{panel_num}' , currentPanel ) ; ;
135
+ moveToPanel ( currentPanel , settings . firstPanelLoadNoAnimate ) ;
127
136
128
- // Left-Nav = click
129
- $ ( "#magic-nav-left-" + sliderID + " a" ) . click ( function ( ) {
137
+ function moveLeft ( ) {
130
138
navClicks ++ ;
131
139
var navList = $ ( this ) . parents ( 'div.magic-slider-wrapper' ) . find ( '.magic-nav ul' ) ;
132
140
if ( currentPanel == 1 && ! settings . carousel ) {
@@ -144,10 +152,9 @@ $.fn.magicSlider = function(settings) {
144
152
moveToPanel ( currentPanel ) ;
145
153
if ( settings . crossLinking ) { location . hash = currentPanel } ; // Change the URL hash (cross-linking)
146
154
return false ;
147
- } ) ;
155
+ }
148
156
149
- // Right-Nav = click
150
- $ ( '#magic-nav-right-' + sliderID + ' a' ) . click ( function ( ) {
157
+ function moveRight ( ) {
151
158
navClicks ++ ;
152
159
var navList = $ ( this ) . parents ( 'div.magic-slider-wrapper' ) . find ( '.magic-nav ul' ) ;
153
160
if ( currentPanel == panelCount && ! settings . carousel ) {
@@ -165,6 +172,16 @@ $.fn.magicSlider = function(settings) {
165
172
moveToPanel ( currentPanel ) ;
166
173
if ( settings . crossLinking ) { location . hash = currentPanel } ; // Change the URL hash (cross-linking)
167
174
return false ;
175
+ }
176
+
177
+ // Left-Nav = click
178
+ $ ( "#magic-nav-left-" + sliderID + " a" ) . click ( function ( ) {
179
+ return moveLeft ( )
180
+ } ) ;
181
+
182
+ // Right-Nav = click
183
+ $ ( '#magic-nav-right-' + sliderID + ' a' ) . click ( function ( ) {
184
+ return moveRight ( )
168
185
} ) ;
169
186
170
187
// If we need a dynamic menu
@@ -213,16 +230,31 @@ $.fn.magicSlider = function(settings) {
213
230
} ) ;
214
231
} ) ;
215
232
233
+
234
+
216
235
// External triggers (anywhere on the page)
217
236
$ ( settings . externalTriggerSelector ) . each ( function ( ) {
237
+ var $this = $ ( this ) ;
218
238
// Make sure this only affects the targeted slider
219
239
if ( sliderID == $ ( this ) . attr ( "rel" ) ) {
220
- $ ( this ) . bind ( "click" , function ( ) {
240
+ $this . bind ( "click" , function ( ) {
221
241
navClicks ++ ;
222
- targetPanel = parseInt ( $ ( this ) . attr ( "href" ) . slice ( 1 ) ) ;
242
+ var re = / \# ( .* ) $ / ;
243
+ try {
244
+ targetPanel = parseInt ( re . exec ( $ ( this ) . attr ( "href" ) ) [ 1 ] ) ;
245
+ } catch ( e ) {
246
+ return false ;
247
+ }
223
248
if ( settings . highlightExternalTrigger == true ) {
224
- $ ( 'a[rel="' + sliderID + '"]' ) . removeClass ( "current" ) ;
225
- $ ( 'a[rel="' + sliderID + '"][href="#' + targetPanel + '"]' ) . addClass ( "current" ) ;
249
+ $ ( 'a[rel="' + sliderID + '"]' )
250
+ . removeClass ( settings . externalTriggerHighlightClass . replace ( '{panel_num}' , targetPanel ) ) ;
251
+ if ( classNeedRemove ) {
252
+ $ ( 'a[rel="' + sliderID + '"]' )
253
+ . removeClass ( classNeedRemove ) ;
254
+ }
255
+ $ ( 'a[rel="' + sliderID + '"][href$="#' + targetPanel + '"]' )
256
+ . addClass ( settings . externalTriggerHighlightClass . replace ( '{panel_num}' , targetPanel ) ) ;
257
+ classNeedRemove = settings . externalTriggerHighlightClass . replace ( '{panel_num}' , targetPanel ) ;
226
258
// $(this).addClass("current");
227
259
} ;
228
260
offset = - ( panelWidth * ( targetPanel - 1 ) ) ;
@@ -267,18 +299,25 @@ $.fn.magicSlider = function(settings) {
267
299
} ) ;
268
300
} ;
269
301
270
- function alterPanelHeight ( x ) {
302
+ function alterPanelHeight ( x , noAnimation ) {
271
303
if ( settings . autoHeight ) {
272
- panelHeight = $ ( '.' + sliderID + '_panel:eq(' + x + ')' , slider ) . height ( )
273
- slider . animate ( { height : panelHeight } , settings . autoHeightEaseDuration , settings . autoHeightEaseFunction ) ;
304
+ panelHeight = $ ( '.' + sliderID + '_panel:eq(' + x + ')' , slider ) . height ( ) ;
305
+ if ( noAnimation ) {
306
+ slider . css ( { height : panelHeight } ) ;
307
+ } else {
308
+
309
+ slider . animate ( { height : panelHeight } , settings . autoHeightEaseDuration , settings . autoHeightEaseFunction ) ;
310
+ }
274
311
} ;
275
312
} ;
276
313
277
314
function autoSlide ( ) {
315
+ if ( ! settings . autoCycle ) {
316
+ return false ;
317
+ }
278
318
if ( navClicks == 0 || ! settings . autoSlideStopWhenClicked ) {
279
319
if ( currentPanel == panelCount ) {
280
- if ( ! settings . autoCycle )
281
- return false ;
320
+
282
321
currentPanel = 1 ;
283
322
} else {
284
323
currentPanel += 1 ;
@@ -289,42 +328,82 @@ $.fn.magicSlider = function(settings) {
289
328
} ;
290
329
} ;
291
330
292
- function moveToPanel ( targetPanelIndex ) {
331
+ function moveToPanel ( direction , noAnimation ) {
332
+ var targetPanelIndex ;
333
+ if ( typeof direction == 'number' ) {
334
+ targetPanelIndex = direction ;
335
+ } else {
336
+ targetPanelIndex = currentPanel + ( ( direction === 'right' ) ?1 :- 1 ) ;
337
+ targetPanelIndex = ( targetPanelIndex - 1 ) % panelCount + 1 ;
338
+ ( targetPanelIndex < 1 ) && ( targetPanelIndex += panelCount ) ;
339
+ }
340
+
341
+
342
+
343
+ //console.log('moveToPanel', targetPanelIndex);
344
+
345
+ settings . eventBeforeSlideMove ( targetPanelIndex , panelCount ) ;
293
346
var navList = $ ( '#magic-nav-' + sliderID + ' ul' ) ;
294
347
var currentLink = navList . find ( 'li:eq(' + ( targetPanelIndex - 1 ) + ') a' ) ;
295
348
navList . find ( 'a' ) . removeClass ( 'current' ) ;
296
349
currentLink . addClass ( 'current' ) ;
297
350
if ( last == true ) {
298
- doTheDouble ( clon )
351
+ doTheDouble ( clon ) ;
299
352
last = false ;
300
353
clon = '' ;
301
354
} else {
302
- doThePanelMove ( targetPanelIndex ) ;
355
+ doThePanelMove ( targetPanelIndex , noAnimation ) ;
303
356
} ;
304
357
if ( settings . changeSliderHeadline == true ) {
305
358
$ ( settings . sliderHeadlineSelector ) . html ( panelHeadlines [ targetPanelIndex - 1 ] ) ;
306
359
} ;
360
+
307
361
if ( settings . highlightExternalTrigger == true ) {
308
- $ ( 'a[rel="' + sliderID + '"]' ) . removeClass ( "current" ) ;
309
- $ ( 'a[rel="' + sliderID + '"][href="#' + targetPanelIndex + '"]' ) . addClass ( "current" ) ; // $(this).addClass("current");
362
+ $ ( 'a[rel="' + sliderID + '"]' )
363
+ . removeClass ( settings . externalTriggerHighlightClass . replace ( '{panel_num}' , targetPanelIndex ) ) ;
364
+ if ( classNeedRemove ) {
365
+ $ ( 'a[rel="' + sliderID + '"]' )
366
+ . removeClass ( classNeedRemove ) ;
367
+ }
368
+ $ ( 'a[rel="' + sliderID + '"][href$="#' + targetPanelIndex + '"]' )
369
+ . addClass ( settings . externalTriggerHighlightClass . replace ( '{panel_num}' , targetPanelIndex ) ) ;
370
+ classNeedRemove = settings . externalTriggerHighlightClass . replace ( '{panel_num}' , targetPanelIndex ) ;
371
+ // $(this).addClass("current");
310
372
} ;
311
373
slider . find ( 'div.' + sliderID + '_panel_container div.' + sliderID + '_panel' ) . removeClass ( 'current' ) ;
312
374
slider . find ( 'div.' + sliderID + '_panel_container div.' + sliderID + '_panel:eq(' + ( targetPanelIndex - 1 ) + ')' ) . addClass ( 'current' ) ;
375
+ currentPanel = targetPanelIndex ;
313
376
} ;
314
377
315
- function doThePanelMove ( targetPanelIndex ) {
316
- if ( settings . slideDirection == "horizontal" ) {
317
- $ ( '.' + sliderID + '_panel_container' , slider ) . animate (
318
- { marginLeft : - 1 * panelWidth * ( targetPanelIndex - 1 ) } ,
319
- settings . slideEaseDuration ,
320
- settings . slideEaseFunction
321
- ) ;
322
- } else {
323
- $ ( '.' + sliderID + '_panel_container' , slider ) . animate (
324
- { marginTop : - 1 * panelContaineroffset [ targetPanelIndex - 1 ] } ,
325
- settings . slideEaseDuration ,
326
- settings . slideEaseFunction
327
- ) ;
378
+ function doThePanelMove ( targetPanelIndex , noAnimation ) {
379
+ function finished ( ) {
380
+ isAnimating = false ;
381
+ }
382
+ if ( noAnimation ) {
383
+ if ( settings . slideDirection == "horizontal" ) {
384
+ $ ( '.' + sliderID + '_panel_container' , slider ) . css (
385
+ { marginLeft : - 1 * panelWidth * ( targetPanelIndex - 1 ) }
386
+
387
+ ) ;
388
+ } else {
389
+ $ ( '.' + sliderID + '_panel_container' , slider ) . css (
390
+ { marginTop : - 1 * panelContaineroffset [ targetPanelIndex - 1 ] }
391
+ ) ;
392
+ }
393
+ } else {
394
+ if ( settings . slideDirection == "horizontal" ) {
395
+ $ ( '.' + sliderID + '_panel_container' , slider ) . animate (
396
+ { marginLeft : - 1 * panelWidth * ( targetPanelIndex - 1 ) } ,
397
+ settings . slideEaseDuration ,
398
+ settings . slideEaseFunction
399
+ ) ;
400
+ } else {
401
+ $ ( '.' + sliderID + '_panel_container' , slider ) . animate (
402
+ { marginTop : - 1 * panelContaineroffset [ targetPanelIndex - 1 ] } ,
403
+ settings . slideEaseDuration ,
404
+ settings . slideEaseFunction
405
+ ) ;
406
+ }
328
407
}
329
408
} ;
330
409
@@ -375,5 +454,78 @@ $.fn.magicSlider = function(settings) {
375
454
return Math . max . apply ( Math , array ) ;
376
455
} ;
377
456
457
+ //throw
458
+ //$.fn.magicSlider.moveToPanel=moveToPanel;
459
+ var moveTo = settings . functionsOut . moveTo = function ( direction , noAnimate ) {
460
+
461
+ var targetPanelIndex ;
462
+ if ( typeof direction == 'number' ) {
463
+ targetPanelIndex = direction ;
464
+ currentPanel = targetPanelIndex ;
465
+ moveToPanel ( targetPanelIndex , noAnimate ) ;
466
+ alterPanelHeight ( targetPanelIndex - 1 , noAnimate ) ;
467
+ } else {
468
+ targetPanelIndex = currentPanel + ( ( direction === 'right' ) ?1 :- 1 ) ;
469
+ targetPanelIndex = ( targetPanelIndex - 1 ) % panelCount + 1 ;
470
+ ( targetPanelIndex < 1 ) && ( targetPanelIndex += panelCount ) ;
471
+
472
+ if ( direction == 'left' ) {
473
+ return moveLeft ( )
474
+ } else if ( direction == 'right' ) {
475
+ return moveRight ( )
476
+ }
477
+ }
478
+ //console.log('move to ',direction,noAnimate,targetPanelIndex,currentPanel);
479
+
480
+ } ;
481
+ //moveToPanel;
482
+
483
+
484
+ function bindTouchMoveEvent ( $ele , eventMap , options ) {
485
+ options = $ . extend ( {
486
+ pixelsTrigger :20
487
+ } , options ) ;
488
+
489
+ var state = 'ready' ;
490
+ var beginPoint = [ ] ;
491
+
492
+
493
+ $ele . bind ( 'touchstart touchmove touchend' , function ( event ) {
494
+ var touch = event . originalEvent . touches [ 0 ] ;
495
+ //$ele.append('<p>'+ event.type+" Touch x:" + touch.pageX + ", y:" + touch.pageY+'</p>');
496
+ if ( event . type == 'touchstart' ) {
497
+ if ( state == 'ready' ) {
498
+ state = 'touching' ;
499
+ beginPoint = [ touch . pageX , touch . pageY ] ;
500
+ }
501
+ } else if ( event . type == 'touchmove' ) {
502
+ if ( state == 'touching' ) {
503
+ if ( touch . pageX > beginPoint [ 0 ] + options . pixelsTrigger && Math . abs ( touch . pageY - beginPoint [ 1 ] ) < options . pixelsTrigger && eventMap [ 'right' ] ) {
504
+ eventMap [ 'right' ] ( ) ;
505
+ state = 'ready' ;
506
+ } else if ( touch . pageX < beginPoint [ 0 ] - options . pixelsTrigger && Math . abs ( touch . pageY - beginPoint [ 1 ] ) < options . pixelsTrigger && eventMap [ 'left' ] ) {
507
+ eventMap [ 'left' ] ( ) ;
508
+ state = 'ready' ;
509
+ }
510
+ }
511
+ }
512
+ } )
513
+ }
514
+
515
+ if ( settings . touchSlideSwitch ) {
516
+ bindTouchMoveEvent ( slider , {
517
+ 'left' :function ( ) {
518
+ moveTo ( 'right' ) ;
519
+ } ,
520
+ 'right' :function ( ) {
521
+ moveTo ( 'left' ) ;
522
+ }
523
+ } , { pixelsTrigger :settings . touchSlideTriggerPixels } )
524
+ }
525
+ //this.moveToPanel=moveToPanel;
526
+
527
+
528
+
529
+
378
530
} ) ;
379
531
} ;
0 commit comments