1/* 2 * jQuery FlexSlider v1.8 3 * http://flex.madebymufffin.com 4 * 5 * Copyright 2011, Tyler Smith 6 * Free to use under the MIT license. 7 * http://www.opensource.org/licenses/mit-license.php 8 * 9 * Contrib: Darin Richardson 10 */ 11 12;(function ($) { 13 14 //FlexSlider: Object Instance 15 $.flexslider = function(el, options) { 16 var slider = el; 17 18 slider.init = function() { 19 slider.vars = $.extend({}, $.flexslider.defaults, options); 20 slider.data('flexslider', true); 21 slider.container = $('.slides', slider); 22 slider.slides = $('.slides > li', slider); 23 slider.count = slider.slides.length; 24 slider.animating = false; 25 slider.currentSlide = slider.vars.slideToStart; 26 slider.animatingTo = slider.currentSlide; 27 slider.atEnd = (slider.currentSlide == 0) ? true : false; 28 slider.eventType = ('ontouchstart' in document.documentElement) ? 'touchstart' : 'click'; 29 slider.cloneCount = 0; 30 slider.cloneOffset = 0; 31 slider.manualPause = false; 32 slider.vertical = (slider.vars.slideDirection == "vertical"); 33 slider.prop = (slider.vertical) ? "top" : "marginLeft"; 34 slider.args = {}; 35 36 //Test for webbkit CSS3 Animations 37 slider.transitions = "webkitTransition" in document.body.style; 38 if (slider.transitions) slider.prop = "-webkit-transform"; 39 40 //Test for controlsContainer 41 if (slider.vars.controlsContainer != "") { 42 slider.controlsContainer = $(slider.vars.controlsContainer).eq($('.slides').index(slider.container)); 43 slider.containerExists = slider.controlsContainer.length > 0; 44 } 45 //Test for manualControls 46 if (slider.vars.manualControls != "") { 47 slider.manualControls = $(slider.vars.manualControls, ((slider.containerExists) ? slider.controlsContainer : slider)); 48 slider.manualExists = slider.manualControls.length > 0; 49 } 50 51 /////////////////////////////////////////////////////////////////// 52 // FlexSlider: Randomize Slides 53 if (slider.vars.randomize) { 54 slider.slides.sort(function() { return (Math.round(Math.random())-0.5); }); 55 slider.container.empty().append(slider.slides); 56 } 57 /////////////////////////////////////////////////////////////////// 58 59 /////////////////////////////////////////////////////////////////// 60 // FlexSlider: Slider Animation Initialize 61 if (slider.vars.animation.toLowerCase() == "slide") { 62 if (slider.transitions) { 63 slider.setTransition(0); 64 } 65 slider.css({"overflow": "hidden"}); 66 if (slider.vars.animationLoop) { 67 slider.cloneCount = 2; 68 slider.cloneOffset = 1; 69 slider.container.append(slider.slides.filter(':first').clone().addClass('clone')).prepend(slider.slides.filter(':last').clone().addClass('clone')); 70 } 71 //create newSlides to capture possible clones 72 slider.newSlides = $('.slides > li', slider); 73 var sliderOffset = (-1 * (slider.currentSlide + slider.cloneOffset)); 74 if (slider.vertical) { 75 slider.newSlides.css({"display": "block", "width": "100%", "float": "left"}); 76 slider.container.height((slider.count + slider.cloneCount) * 200 + "%").css("position", "absolute").width("100%"); 77 //Timeout function to give browser enough time to get proper height initially 78 setTimeout(function() { 79 slider.css({"position": "relative"}).height(slider.slides.filter(':first').height()); 80 slider.args[slider.prop] = (slider.transitions) ? "translate3d(0," + sliderOffset * slider.height() + "px,0)" : sliderOffset * slider.height() + "px"; 81 slider.container.css(slider.args); 82 }, 100); 83 84 } else { 85 slider.args[slider.prop] = (slider.transitions) ? "translate3d(" + sliderOffset * slider.width() + "px,0,0)" : sliderOffset * slider.width() + "px"; 86 slider.container.width((slider.count + slider.cloneCount) * 200 + "%").css(slider.args); 87 //Timeout function to give browser enough time to get proper width initially 88 setTimeout(function() { 89 slider.newSlides.width(slider.width()).css({"float": "left", "display": "block"}); 90 }, 100); 91 } 92 93 } else { //Default to fade 94 //Not supporting fade CSS3 transitions right now 95 slider.transitions = false;
96 slider.slides.css({"width": "100%", "float": "left", "marginRight": "-100%"}).eq(slider.currentSlide).fadeIn(slider.vars.animationDuration); 97 } 98 /////////////////////////////////////////////////////////////////// 99 100 /////////////////////////////////////////////////////////////////// 101 // FlexSlider: Control Nav 102 if (slider.vars.controlNav) { 103 if (slider.manualExists) { 104 slider.controlNav = slider.manualControls; 105 } else { 106 var controlNavScaffold = $('<ol class="flex-control-nav"></ol>'); 107 var j = 1; 108 for (var i = 0; i < slider.count; i++) { 109 controlNavScaffold.append('<li><a>' + j + '</a></li>'); 110 j++; 111 } 112 113 if (slider.containerExists) { 114 $(slider.controlsContainer).append(controlNavScaffold); 115 slider.controlNav = $('.flex-control-nav li a', slider.controlsContainer); 116 } else { 117 slider.append(controlNavScaffold); 118 slider.controlNav = $('.flex-control-nav li a', slider); 119 } 120 } 121 122 slider.controlNav.eq(slider.currentSlide).addClass('active'); 123 124 slider.controlNav.bind(slider.eventType, function(event) { 125 event.preventDefault(); 126 if (!$(this).hasClass('active')) { 127 (slider.controlNav.index($(this)) > slider.currentSlide) ? slider.direction = "next" : slider.direction = "prev"; 128 slider.flexAnimate(slider.controlNav.index($(this)), slider.vars.pauseOnAction); 129 } 130 }); 131 } 132 /////////////////////////////////////////////////////////////////// 133 134 ////////////////////////////////////////////////////////////////// 135 //FlexSlider: Direction Nav 136 if (slider.vars.directionNav) { 137 var directionNavScaffold = $('<ul class="flex-direction-nav"><li><a class="prev" href="#">' + slider.vars.prevText + '</a></li><li><a class="next" href="#">' + slider.vars.nextText + '</a></li></ul>'); 138 139 if (slider.containerExists) { 140 $(slider.controlsContainer).append(directionNavScaffold); 141 slider.directionNav = $('.flex-direction-nav li a', slider.controlsContainer); 142 } else { 143 slider.append(directionNavScaffold); 144 slider.directionNav = $('.flex-direction-nav li a', slider); 145 } 146 147 //Set initial disable styles if necessary 148 if (!slider.vars.animationLoop) { 149 if (slider.currentSlide == 0) { 150 slider.directionNav.filter('.prev').addClass('disabled'); 151 } else if (slider.currentSlide == slider.count - 1) { 152 slider.directionNav.filter('.next').addClass('disabled'); 153 } 154 } 155 156 slider.directionNav.bind(slider.eventType, function(event) { 157 event.preventDefault(); 158 var target = ($(this).hasClass('next')) ? slider.getTarget('next') : slider.getTarget('prev'); 159 160 if (slider.canAdvance(target)) { 161 slider.flexAnimate(target, slider.vars.pauseOnAction); 162 } 163 }); 164 } 165 ////////////////////////////////////////////////////////////////// 166 167 ////////////////////////////////////////////////////////////////// 168 //FlexSlider: Keyboard Nav 169 if (slider.vars.keyboardNav && $('ul.slides').length == 1) { 170 function keyboardMove(event) { 171 if (slider.animating) { 172 return; 173 } else if (event.keyCode != 39 && event.keyCode != 37){ 174 return; 175 } else { 176 if (event.keyCode == 39) { 177 var target = slider.getTarget('next'); 178 } else if (event.keyCode == 37){ 179 var target = slider.getTarget('prev'); 180 } 181 182 if (slider.canAdvance(target)) { 183 slider.flexAnimate(target, slider.vars.pauseOnAction); 184 } 185 } 186 } 187 $(document).bind('keyup', keyboardMove); 188 } 189 ////////////////////////////////////////////////////////////////// 190 191 /////////////////////////////////////////////////////////////////// 192 // FlexSlider: Mousewheel interaction 193 if (slider.vars.mousewheel) { 194 slider.mousewheelEvent = (/Firefox/i.test(navigator.userAgent)) ? "DOMMouseScroll" : "mousewheel"; 195 slider.bind(slider.mousewheelEvent, function(e) { 196 e.preventDefault(); 197 e = e ? e : window.event; 198 var wheelData = e.detail ? e.detail * -1 : e.wheelDelta / 40, 199 target = (wheelData < 0) ? slider.getTarget('next') : slider.getTarget('prev'); 200 201 if (slider.canAdvance(target)) { 202 slider.flexAnimate(target, slider.vars.pauseOnAction); 203 } 204 }); 205 }
206 /////////////////////////////////////////////////////////////////// 207 208 ////////////////////////////////////////////////////////////////// 209 //FlexSlider: Slideshow Setup 210 if (slider.vars.slideshow) { 211 //pauseOnHover 212 if (slider.vars.pauseOnHover && slider.vars.slideshow) { 213 slider.hover(function() { 214 slider.pause(); 215 }, function() { 216 if (!slider.manualPause) { 217 slider.resume(); 218 } 219 }); 220 } 221 222 //Initialize animation 223 slider.animatedSlides = setInterval(slider.animateSlides, slider.vars.slideshowSpeed); 224 } 225 ////////////////////////////////////////////////////////////////// 226 227 ////////////////////////////////////////////////////////////////// 228 //FlexSlider: Pause/Play 229 if (slider.vars.pausePlay) { 230 var pausePlayScaffold = $('<div class="flex-pauseplay"><span></span></div>'); 231 232 if (slider.containerExists) { 233 slider.controlsContainer.append(pausePlayScaffold); 234 slider.pausePlay = $('.flex-pauseplay span', slider.controlsContainer); 235 } else { 236 slider.append(pausePlayScaffold); 237 slider.pausePlay = $('.flex-pauseplay span', slider); 238 } 239 240 var pausePlayState = (slider.vars.slideshow) ? 'pause' : 'play'; 241 slider.pausePlay.addClass(pausePlayState).text((pausePlayState == 'pause') ? slider.vars.pauseText : slider.vars.playText); 242 243 slider.pausePlay.bind(slider.eventType, function(event) { 244 event.preventDefault(); 245 if ($(this).hasClass('pause')) { 246 slider.pause(); 247 slider.manualPause = true; 248 } else { 249 slider.resume(); 250 slider.manualPause = false; 251 } 252 }); 253 } 254 ////////////////////////////////////////////////////////////////// 255 256 ////////////////////////////////////////////////////////////////// 257 //FlexSlider:Touch Swip Gestures 258 //Some brilliant concepts adapted from the following sources 259 //Source: TouchSwipe - http://www.netcu.de/jquery-touchwipe-iphone-ipad-library 260 //Source: SwipeJS - http://swipejs.com 261 if ('ontouchstart' in document.documentElement) { 262 //For brevity, variables are named for x-axis scrolling 263 //The variables are then swapped if vertical sliding is applied 264 //This reduces redundant code...I think :) 265 //If debugging, recognize variables are named for horizontal scrolling 266 var startX, 267 startY, 268 offset, 269 cwidth, 270 dx, 271 startT, 272 scrolling = false; 273 274 slider.each(function() { 275 if ('ontouchstart' in document.documentElement) { 276 this.addEventListener('touchstart', onTouchStart, false); 277 } 278 }); 279 280 function onTouchStart(e) { 281 if (slider.animating) { 282 e.preventDefault(); 283 } else if (e.touches.length == 1) { 284 slider.pause(); 285 cwidth = (slider.vertical) ? slider.height() : slider.width(); 286 startT = Number(new Date()); 287 offset = (slider.vertical) ? (slider.currentSlide + slider.cloneOffset) * slider.height() : (slider.currentSlide + slider.cloneOffset) * slider.width(); 288 startX = (slider.vertical) ? e.touches[0].pageY : e.touches[0].pageX; 289 startY = (slider.vertical) ? e.touches[0].pageX : e.touches[0].pageY; 290 slider.setTransition(0); 291 292 this.addEventListener('touchmove', onTouchMove, false); 293 this.addEventListener('touchend', onTouchEnd, false); 294 } 295 } 296 297 function onTouchMove(e) { 298 dx = (slider.vertical) ? startX - e.touches[0].pageY : startX - e.touches[0].pageX; 299 scrolling = (slider.vertical) ? (Math.abs(dx) < Math.abs(e.touches[0].pageX - startY)) : (Math.abs(dx) < Math.abs(e.touches[0].pageY - startY)); 300 301 if (!scrolling) { 302 e.preventDefault(); 303 if (slider.vars.animation == "slide" && slider.transitions) { 304 if (!slider.vars.animationLoop) { 305 dx = dx/((slider.currentSlide == 0 && dx < 0 || slider.currentSlide == slider.count - 1 && dx > 0) ? (Math.abs(dx)/cwidth+2) : 1); 306 } 307 slider.args[slider.prop] = (slider.vertical) ? "translate3d(0," + (-offset - dx) + "px,0)": "translate3d(" + (-offset - dx) + "px,0,0)"; 308 slider.container.css(slider.args); 309 } 310 } 311 } 312 313 function onTouchEnd(e) { 314 slider.animating = false;
315 if (slider.animatingTo == slider.currentSlide && !scrolling && !(dx == null)) { 316 var target = (dx > 0) ? slider.getTarget('next') : slider.getTarget('prev'); 317 if (slider.canAdvance(target) && Number(new Date()) - startT < 550 && Math.abs(dx) > 20 || Math.abs(dx) > cwidth/2) { 318 slider.flexAnimate(target, slider.vars.pauseOnAction); 319 } else { 320 slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction); 321 } 322 } 323 324 //Finish the touch by undoing the touch session 325 this.removeEventListener('touchmove', onTouchMove, false); 326 this.removeEventListener('touchend', onTouchEnd, false); 327 startX = null; 328 startY = null; 329 dx = null; 330 offset = null; 331 } 332 } 333 ////////////////////////////////////////////////////////////////// 334 335 ////////////////////////////////////////////////////////////////// 336 //FlexSlider: Resize Functions (If necessary) 337 if (slider.vars.animation.toLowerCase() == "slide") { 338 $(window).resize(function(){ 339 if (!slider.animating) { 340 if (slider.vertical) { 341 slider.height(slider.slides.filter(':first').height()); 342 slider.args[slider.prop] = (-1 * (slider.currentSlide + slider.cloneOffset))* slider.slides.filter(':first').height() + "px"; 343 if (slider.transitions) { 344 slider.setTransition(0); 345 slider.args[slider.prop] = (slider.vertical) ? "translate3d(0," + slider.args[slider.prop] + ",0)" : "translate3d(" + slider.args[slider.prop] + ",0,0)"; 346 } 347 slider.container.css(slider.args); 348 } else { 349 slider.newSlides.width(slider.width()); 350 slider.args[slider.prop] = (-1 * (slider.currentSlide + slider.cloneOffset))* slider.width() + "px"; 351 if (slider.transitions) { 352 slider.setTransition(0); 353 slider.args[slider.prop] = (slider.vertical) ? "translate3d(0," + slider.args[slider.prop] + ",0)" : "translate3d(" + slider.args[slider.prop] + ",0,0)"; 354 } 355 slider.container.css(slider.args); 356 } 357 } 358 }); 359 } 360 ////////////////////////////////////////////////////////////////// 361 362 ////////////////////////////////////////////////////////////////// 363 //FlexSlider: Destroy the slider entity 364 //Destory is not included in the minified version right now, but this is a working function for anyone who wants to include it. 365 //Simply bind the actions you need from this function into a function in the start() callback to the event of your chosing 366 /* 367 slider.destroy = function() { 368 slider.pause(); 369 if (slider.controlNav && slider.vars.manualControls == "") slider.controlNav.closest('.flex-control-nav').remove(); 370 if (slider.directionNav) slider.directionNav.closest('.flex-direction-nav').remove(); 371 if (slider.vars.pausePlay) slider.pausePlay.closest('.flex-pauseplay').remove(); 372 if (slider.vars.keyboardNav && $('ul.slides').length == 1) $(document).unbind('keyup', keyboardMove); 373 if (slider.vars.mousewheel) slider.unbind(slider.mousewheelEvent); 374 if (slider.transitions) slider.each(function(){this.removeEventListener('touchstart', onTouchStart, false);}); 375 if (slider.vars.animation == "slide" && slider.vars.animationLoop) slider.newSlides.filter('.clone').remove(); 376 if (slider.vertical) slider.height("auto"); 377 slider.slides.hide(); 378 slider.removeData('flexslider'); 379 } 380 */ 381 ////////////////////////////////////////////////////////////////// 382 383 //FlexSlider: start() Callback 384 slider.vars.start(slider); 385 } 386 387 //FlexSlider: Animation Actions 388 slider.flexAnimate = function(target, pause) { 389 if (!slider.animating) { 390 //Animating flag 391 slider.animating = true; 392 393 //FlexSlider: before() animation Callback 394 slider.animatingTo = target; 395 slider.vars.before(slider); 396 397 //Optional paramter to pause slider when making an anmiation call 398 if (pause) { 399 slider.pause(); 400 } 401 402 //Update controlNav 403 if (slider.vars.controlNav) { 404 slider.controlNav.removeClass('active').eq(target).addClass('active'); 405 } 406 407 //Is the slider at either end 408 slider.atEnd = (target == 0 || target == slider.count - 1) ? true : false;
409 if (!slider.vars.animationLoop && slider.vars.directionNav) { 410 if (target == 0) { 411 slider.directionNav.removeClass('disabled').filter('.prev').addClass('disabled'); 412 } else if (target == slider.count - 1) { 413 slider.directionNav.removeClass('disabled').filter('.next').addClass('disabled'); 414 } else { 415 slider.directionNav.removeClass('disabled'); 416 } 417 } 418 419 if (!slider.vars.animationLoop && target == slider.count - 1) { 420 slider.pause(); 421 //FlexSlider: end() of cycle Callback 422 slider.vars.end(slider); 423 } 424 425 if (slider.vars.animation.toLowerCase() == "slide") { 426 var dimension = (slider.vertical) ? slider.slides.filter(':first').height() : slider.slides.filter(':first').width(); 427 428 if (slider.currentSlide == 0 && target == slider.count - 1 && slider.vars.animationLoop && slider.direction != "next") { 429 slider.slideString = "0px"; 430 } else if (slider.currentSlide == slider.count - 1 && target == 0 && slider.vars.animationLoop && slider.direction != "prev") { 431 slider.slideString = (-1 * (slider.count + 1)) * dimension + "px"; 432 } else { 433 slider.slideString = (-1 * (target + slider.cloneOffset)) * dimension + "px"; 434 } 435 slider.args[slider.prop] = slider.slideString; 436 437 if (slider.transitions) { 438 slider.setTransition(slider.vars.animationDuration); 439 slider.args[slider.prop] = (slider.vertical) ? "translate3d(0," + slider.slideString + ",0)" : "translate3d(" + slider.slideString + ",0,0)"; 440 slider.container.css(slider.args).one("webkitTransitionEnd transitionend", function(){ 441 slider.wrapup(dimension); 442 }); 443 } else { 444 slider.container.animate(slider.args, slider.vars.animationDuration, function(){ 445 slider.wrapup(dimension); 446 }); 447 } 448 } else { //Default to Fade 449 slider.slides.eq(slider.currentSlide).fadeOut(slider.vars.animationDuration); 450 slider.slides.eq(target).fadeIn(slider.vars.animationDuration, function() { 451 slider.wrapup(); 452 }); 453 } 454 } 455 } 456 457 //FlexSlider: Function to minify redundant animation actions 458 slider.wrapup = function(dimension) { 459 if (slider.vars.animation == "slide") { 460 //Jump the slider if necessary 461 if (slider.currentSlide == 0 && slider.animatingTo == slider.count - 1 && slider.vars.animationLoop) { 462 slider.args[slider.prop] = (-1 * slider.count) * dimension + "px"; 463 if (slider.transitions) { 464 slider.setTransition(0); 465 slider.args[slider.prop] = (slider.vertical) ? "translate3d(0," + slider.args[slider.prop] + ",0)" : "translate3d(" + slider.args[slider.prop] + ",0,0)"; 466 } 467 slider.container.css(slider.args); 468 } else if (slider.currentSlide == slider.count - 1 && slider.animatingTo == 0 && slider.vars.animationLoop) { 469 slider.args[slider.prop] = -1 * dimension + "px"; 470 if (slider.transitions) { 471 slider.setTransition(0); 472 slider.args[slider.prop] = (slider.vertical) ? "translate3d(0," + slider.args[slider.prop] + ",0)" : "translate3d(" + slider.args[slider.prop] + ",0,0)"; 473 } 474 slider.container.css(slider.args); 475 } 476 } 477 slider.animating = false; 478 slider.currentSlide = slider.animatingTo; 479 //FlexSlider: after() animation Callback 480 slider.vars.after(slider); 481 } 482 483 //FlexSlider: Automatic Slideshow 484 slider.animateSlides = function() { 485 if (!slider.animating) { 486 slider.flexAnimate(slider.getTarget("next")); 487 } 488 } 489 490 //FlexSlider: Automatic Slideshow Pause 491 slider.pause = function() { 492 clearInterval(slider.animatedSlides); 493 if (slider.vars.pausePlay) { 494 slider.pausePlay.removeClass('pause').addClass('play').text(slider.vars.playText); 495 } 496 } 497 498 //FlexSlider: Automatic Slideshow Start/Resume 499 slider.resume = function() { 500 slider.animatedSlides = setInterval(slider.animateSlides, slider.vars.slideshowSpeed); 501 if (slider.vars.pausePlay) { 502 slider.pausePlay.removeClass('play').addClass('pause').text(slider.vars.pauseText); 503 } 504 } 505 506 //FlexSlider: Helper function for non-looping sliders 507 slider.canAdvance = function(target) { 508 if (!slider.vars.animationLoop && slider.atEnd) { 509 if (slider.currentSlide == 0 && target == slider.count - 1 && slider.direction != "next") { 510 return false;
511 } else if (slider.currentSlide == slider.count - 1 && target == 0 && slider.direction == "next") { 512 return false; 513 } else { 514 return true; 515 } 516 } else { 517 return true; 518 } 519 } 520 521 //FlexSlider: Helper function to determine animation target 522 slider.getTarget = function(dir) { 523 slider.direction = dir; 524 if (dir == "next") { 525 return (slider.currentSlide == slider.count - 1) ? 0 : slider.currentSlide + 1; 526 } else { 527 return (slider.currentSlide == 0) ? slider.count - 1 : slider.currentSlide - 1; 528 } 529 } 530 531 //FlexSlider: Helper function to set CSS3 transitions 532 slider.setTransition = function(dur) { 533 slider.container.css({'-webkit-transition-duration': (dur/1000) + "s"}); 534 } 535 536 //FlexSlider: Initialize 537 slider.init(); 538 } 539 540 //FlexSlider: Default Settings 541 $.flexslider.defaults = { 542 animation: "fade", //String: Select your animation type, "fade" or "slide" 543 slideDirection: "horizontal", //String: Select the sliding direction, "horizontal" or "vertical" 544 slideshow: true, //Boolean: Animate slider automatically 545 slideshowSpeed: 7000, //Integer: Set the speed of the slideshow cycling, in milliseconds 546 animationDuration: 600, //Integer: Set the speed of animations, in milliseconds 547 directionNav: true, //Boolean: Create navigation for previous/next navigation? (true/false) 548 controlNav: true, //Boolean: Create navigation for paging control of each clide? Note: Leave true for manualControls usage 549 keyboardNav: true, //Boolean: Allow slider navigating via keyboard left/right keys 550 mousewheel: false, //Boolean: Allow slider navigating via mousewheel 551 prevText: "Previous", //String: Set the text for the "previous" directionNav item 552 nextText: "Next", //String: Set the text for the "next" directionNav item 553 pausePlay: false, //Boolean: Create pause/play dynamic element 554 pauseText: 'Pause', //String: Set the text for the "pause" pausePlay item 555 playText: 'Play', //String: Set the text for the "play" pausePlay item 556 randomize: false, //Boolean: Randomize slide order 557 slideToStart: 0, //Integer: The slide that the slider should start on. Array notation (0 = first slide) 558 animationLoop: true, //Boolean: Should the animation loop? If false, directionNav will received "disable" classes at either end 559 pauseOnAction: true, //Boolean: Pause the slideshow when interacting with control elements, highly recommended. 560 pauseOnHover: false, //Boolean: Pause the slideshow when hovering over slider, then resume when no longer hovering 561 controlsContainer: "", //Selector: Declare which container the navigation elements should be appended too. Default container is the flexSlider element. Example use would be ".flexslider-container", "#container", etc. If the given element is not found, the default action will be taken. 562 manualControls: "", //Selector: Declare custom control navigation. Example would be ".flex-control-nav li" or "#tabs-nav li img", etc. The number of elements in your controlNav should match the number of slides/tabs. 563 start: function(){}, //Callback: function(slider) - Fires when the slider loads the first slide 564 before: function(){}, //Callback: function(slider) - Fires asynchronously with each slider animation 565 after: function(){}, //Callback: function(slider) - Fires after each slider animation completes 566 end: function(){} //Callback: function(slider) - Fires when the slider reaches the last slide (asynchronous) 567 } 568 569 //FlexSlider: Plugin Function 570 $.fn.flexslider = function(options) { 571 return this.each(function() { 572 if ($(this).find('.slides li').length == 1) { 573 $(this).find('.slides li').fadeIn(400); 574 } 575 else if ($(this).data('flexslider') != true) { 576 new $.flexslider($(this), options); 577 } 578 }); 579 } 580 581})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.