Versatile jQuery Modalbox / Lightbox Plugin - MultiDialog

File Size: 332 KB
Views Total: 1875
Last Update:
Publish Date:
Official Website: Go to website
License: MIT
   
Versatile jQuery Modalbox / Lightbox Plugin - MultiDialog

MultiDialog is a powerful and touch-enabled plugin that takes advantage of jQuery and jQuery UI Dialog Widget for creating full featured Modalbox / Lightbox on your web page.

Features:

  • Has the ability to handle different content types (like image, video, ajax content, iframe, inline content, etc)
  • Has multipel viewport related settings and supports RWD.
  • Has a powerful API.
  • Fully compatible to jQuery UI's CSS Framework
  • Supports of path related custom content type
  • Supports of lightbox gallery

Basic Usage:

1. Include jQuery library and jQuery UI on your web page

<link rel="stylesheet" href="../css/jquery-ui-1.10.3.custom.css">
<script src="../js/jquery/jquery-1.9.1.js"></script>
<script src="../js/jquery/jquery-ui-1.10.3.custom.js"></script>

2. Include jQuery MultiDialog plugin files on the web page

<link rel="stylesheet" href="../css/jquery.multiDialog.css">
<script src="../js/jquery.ui.dialog.extended-1.0.2.js"></script>
<script src="../js/jquery.multiDialog.js"></script>

3. Include jQuery add-on for touch events (optional)

<script src="../js/mobile/jquery.event.move.js"></script>
<script src="../js/mobile/jquery.event.swipe.js"></script>

4. Include jQuery UI draggable and resizable widget(optional)

<script src="../js/mobile/jquery.event.move.js"></script>
<script src="../js/mobile/jquery.event.swipe.js"></script>

5. Create the html for a lightbox gallery

<ul>
<li><a class="lightbox" href="1.jpg"><img src="res/images/thumb.jpg"  title="" alt="" longdesc="" /></a></li>
<li><a class="lightbox" href="2.jpg"><img src="res/images/thumb.jpg"  title="" alt="" longdesc="" /></a></li>
<li><a class="lightbox" href="3.jpg"><img src="res/images/thumb.jpg"  title="" alt="" longdesc="" /></a></li>
<li><a class="lightbox" href="4.jpg"><img src="res/images/thumb.jpg"  title="" alt="" longdesc="" /></a></li>
<li><a class="lightbox" href="5.jpg"><img src="res/images/thumb.jpg"  title="" alt="" longdesc="" /></a></li>
...
</ul>

6. The javascript

$(function() {
$( "a.lightbox" ).MultiDialog({
gallery: {
enabled: true
},
dialog: {
buttons: {}
}
});
});

6. Default plugin options.

gallery: {
  enabled: false, // use all selected elements as a gallery
  loop: false,
  strings: {
    position: "Item {index} of {amount}: ",
    next: "Next",
    prev: "Previous"
  },
  showPositionInfo: {
    title: true,
    desc: false
  }
},

/**
* Enable description pan
* @property descEnabled
* @default true
* @type Boolean
*/
descEnabled: true,

/**
* jQuery UI Dialog options: see jQuery UI Dialog docs for all options, some options are not available!
* @property dialog
* @type Object
*/
dialog: {
  closeOnEscape: true,
  closeText: "close",
  
  /**
   * Close MultiDialog by click on overlay
   * @property dialog.closeModalOnClick
   * @default true
   * @type Boolean
   */
  closeModalOnClick : true,
  
  /**
   * Width of the content (not overall size, "auto" not allowed)
   * @property dialog.width
   * @default 600
   * @type Integer
   */
  width: 600,
  
  /**
   * Height of the content (not overall size, "auto" not allowed)
   * @property dialog.height
   * @default 400
   * @type Integer
   */
  height: 400,

  // viewport settings (API doc by jquery.ui.dialog.extended)
  forceFullscreen: false,
  resizeOnWindowResize: true,
  scrollWithViewport: true,
  resizeAccordingToViewport: true,
  resizeToBestPossibleSize: false,

  /**
   * Animate the resizing and positioning mechanism
   * @property dialog.useAnimation
   * @default true
   * @type Boolean
   */
  useAnimation: true,
  
  /**
   * Animate options as defined for jQuery UI show and hide options (see jQuery UI documentation)
   * @property dialog.animateOptions
   * @type Object
   */
  animateOptions: {
    duration: 500,
    queue: false
  },

  show: "fade", // string, use any jQuery UI effect here
  hide: "fade",
  modal: true,
  buttons: null, // options: null (default, adds pre/next buttons in gallery mode), {} (no buttons at all), or use as default dialog option
  
  /**
   * jQuery UI Dialog resize callback event (please note: native close, open and resize callbacks are not available)
   * @property dialog.resized
   * @type Function
   */
  resized: null,

  /**
   * Do not alter this property!
   * @property dialog.useContentSize
   * @type Boolean
   * @default true
   * @private
   */
  useContentSize: true
},

/**
 * Disable plugin
 * @property dialog.disabled
 * @default false
 * @type Boolean
 */
disabled: false,

/**
 * GET variable prefix (?ajax=true)
 * @property dialog.getVarPrefix
 * @default ""
 * @type Boolean
 */
getVarPrefix: "",

// set testing condition, description, alt and title atttribute for each content type
types: {
  defaultType: "auto", // image, ajax, inline, iframe, youtube, vimeo
  // default rendering for all content types, overwritten by each content type config
  defaultConfig: {
    test: null, // test for this content type, returns boolean
    template: "<div class='overflow'>{content}</div>",
    // title, desc & marker will only be rendered if an element is available (given by API or click event)
    title: function( element ) { // dialog title
      return element.attr( "title" ) || element.text();
    },
    desc: null, // description text
    marker: {}, // marker in templates, like image alt attribute
    addParameters: "" // addtional parameters (added to the given URL)
  },
  // configuration specific for each content type, merged with default config, use callbacks provided by this plugin instead
  config: {
    image: {
      test: function( href ) {
        return href.match( /\.(jpg|jpeg|png|gif)(\?.*)?$/ );
      },
      template: "<a href='#next' class='multibox-api next' rel='next'></a><a href='#prev' class='multibox-api prev' rel='prev'></a><img width='100%' height='100%' alt='{alt}' title='{title}' src='{path}' />",
      title: function( element ) {
        return element.find( "img" ).attr( "alt" ) || element.text();
      },
      desc: function( element ) {
        return element.find( "img" ).attr( "longdesc" ) || element.find( "img" ).attr( "alt" ) || element.attr( "title" );
      },
      marker: {
        title: function( element ) {
          return element.find( "img" ).attr( "alt" ) || element.attr( "title" ) || element.text();
        },
        alt: function( element ) {
          return element.find( "img" ).attr( "alt" ) || element.find( "img" ).attr( "title" ) || element.attr( "title" ) || element.text();
        }
        // add custom attributes, index is marker in template
      }
    },
    youtube: {
      test: function( href ) {
        return href.match( /youtube\.com\/watch/i ) || href.match( /youtu\.be/i );
      },
      template: "<iframe width='100%' height='100%' src='{url}' frameborder='0' allowFullScreen></iframe>",
      addParameters: "?autoplay=1"
    },
    vimeo: {
      test: function( href ) {
        return href.match( /vimeo\.com\//i );
      },
      template: "<iframe width='100%' height='100%' src='{url}' frameborder='0' webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>",
      addParameters: "?autoplay=1"
    },
    iframe: {
      test: function( href ) {
        return href.match( /iframe=true/i );
      },
      template: "<iframe width='100%' height='100%' src='{url}' frameborder='0'></iframe>"
    },
    ajax: {
      test: function( href ) {
        return href.match( /ajax=true/i );
      },
      // $.ajax settings
      settings: {
        // Please note: be careful with error, success and href
        dataType: "html"
      }
    },
    inline: {
      test: function( href ) {
        return href.match(/\#/);
      }
      // Please note: addParameters is not possible for inline type as the page is already loaded!
    }
    // add own config here!
  }
},

// custom opener
// this is a backfall, render your own HTML by type parameter! Set your own type parameter by using types.config option!
openCustom: function( data ){
  window.open( data.href, "_newtab" );
},

// loading handler
loadingHandler: function( data ){
  this.isLoading = true;
  this._defaultHandler( "<div class='ui-state-highlight ui-corner-all'><p><span class='ui-icon ui-icon-info'></span><strong>Loading content, please wait!</strong></p></div>", "Loading...", data );
},

// error handler
errorHandler: function( data ){
  this._defaultHandler( "<div class='ui-state-error ui-corner-all'><p><span class='ui-icon ui-icon-alert'></span><strong>Sorry, an error has occured. Please try again!</strong></p></div>", "Error!", data.data );
},

// callbacks
on: {
  create: null,
  createDialog: null,
  open: null,
  change: null,
  close: null,
  position: null,
  resize: null,
  move: null,
  // specific
  imageError: null,
  inlineError: null
  // use ajax.settings option for ajax specific callbacks
  // use loadingHandler and errorHandler as callbacks if needed
}
};

Change log:

v0.9.3 (2015-08-05)


This awesome jQuery plugin is developed by fnagel. For more Advanced Usages, please check the demo page or visit the official website.