Skip to content
Branch: master
Go to file

Latest commit

ts-thomas committed 40c8e47 Dec 3, 2019
Merge pull request #12 from oeichenwei/fix-infinite-slide
make infinite play smooth in the border transition


Failed to load latest commit information.
Latest commit message
Commit time


Web's most easy to integrate lightbox gallery library. Super-lightweight, outstanding performance, no dependencies.

Demo  •  Getting Started  •  Gallery Groups  •  Options  •  Styling  •  API  •  Custom Builds

Spotlight runs out of the box:

  • No additional Javascript coding
  • No additional HTML snippets
  • No additional CSS resources
  • No additional icons/assets
  • No additional handling of dynamic content and event listener

Show Demo

Alternatively you can:

  1. use the non-bundled version of this library (classically contains css files, image files, js files)
  2. use the source files (compatible for the ES6 module system)


  • Gallery groups (group images to specific galleries)
  • Gallery Tools:
    • Fullscreen
    • Zoom in/out
    • Toggle resize
    • Switch theme
    • Autoplay
    • Progress Bar
    • Page
    • Title (inherits from image "alt"-attribute)
    • Description
  • Preloader
  • Prefetch next image (background task)
  • Custom options
  • Simply customize via markup (data-attributes)
  • Arrange built-in animations
  • Custom themes
  • Custom animations
  • Controls:
    • Keyboard
    • Touch
    • Mousemove
    • Mousewheel
  • Browser history detection
  • Back-Button (Android)
  • Global API for programmatic usage

Technical properties:

  • Outstanding performance
  • Memory optimized, tiny footprint, fully cleans up
  • Event capturing (just one single global event listener)
  • Bind event listener for components dynamically:
    • install when gallery opens
    • fully cleanup when gallery was closed
  • No dependencies, no jQuery
  • Responsive
  • Super-lightweight, all in all just 7kb gzip (js + css + html + icons)
  • Support for ES6 module system

Getting Started

Version Explanation

Bundle Standalone All assets bundled into one single file (js + css + html + icons).
Bundle CDN Also a bundled file (js + html), but icons and css will load from extern CDN.
Non-Bundled Each asset file exists separately. Recommended when extended customization is needed.

Get Latest Build (Stable):

Bundle Standalone:
spotlight.bundle.js Download

Bundle CDN:
spotlight.cdn.js Download

spotlight.min.js Download
spotlight.css Download Download Alternatively when using non-bundled version you can download icons from /dist/img/.

ES6 Modules: Download The folder "src" of this Github repository.

Get Latest Build (Nightly):

Just exchange the version number from the URLs above with "master", e.g.: "/spotlight/0.6.3/dist/" into "/spotlight/master/dist".

Get Latest (NPM):

npm install spotlight.js

Get Latest (ES6 Modules):

Basic Setup

1. Just insert the script resource tag right after the documents head:

When you need to add custom styling through css class modifications it is recommended to load the library before you load the css which contains the modifications. Otherwise you have to add an "!important" flag to override existing styles.

    <script src="spotlight.bundle.js"></script>
    <!-- CONTENT -->

2. Add the class spotlight to an anchor element accordingly, e.g.:

<a class="spotlight" href="img1.jpg">
    <img src="thumb1.jpg">
<a class="spotlight" href="img2.jpg">
    <img src="thumb2.jpg">
<a class="spotlight" href="img3.jpg">
    <img src="thumb3.jpg">

This also works with dynamically loaded content. There is no need to inject listeners on new elements. Instead Spotlight make use of global event capturing.

Alternatively you can also use the Spotlight API for programmatically use.

Usage with non-anchor elements:

<div class="spotlight" data-src="img1.jpg">
    <div><!-- ... --></div>

Pretty much the same like anchors but use data-src instead of href.


Give one of the outer wrapping element the class spotlight-group, e.g.:

<div class="spotlight-group">
    <a class="spotlight" href="dog1.jpg">
        <img src="dog1-thumb.jpg">
    <a class="spotlight" href="dog2.jpg">
        <img src="dog2-thumb.jpg">
    <a class="spotlight" href="dog3.jpg">
        <img src="dog3-thumb.jpg">
<div class="spotlight-group">
    <a class="spotlight" href="cat1.jpg">
        <img src="cat1-thumb.jpg">
    <a class="spotlight" href="cat2.jpg">
        <img src="cat2-thumb.jpg">
    <a class="spotlight" href="cat3.jpg">
        <img src="cat3-thumb.jpg">


Pass options as declarative via data-attributes in the HTML markup or use the Spotlight API.

When using markup follow these style: data-option="value" (change option and value accordingly), e.g.: <a class="spotlight" data-preftech="false"></a>.

You can either apply the following data-attributes to the spotlight-group wrapper element or apply them separately to each spotlight anchor element (that also overrides group definitions).

Option         Values Description
index number Sets the starting index when showing the gallery by using the Spotlight API. The index starts from 1.
onchange function(index) Pass a callback function which is get fired every time when a page has changed (the first parameter is equal to the new index).
Note: The image may not have been fully loaded when the event is fired (preloading phase). The index starts from 1.
animation "fade"
Change animation (use built-ins)

Note: Could also combined as comma-separated list, e.g: data-animation="slide,fade,scale" (this is the default animation).
control string Show/hide control elements as "whitelisted" through a comma-separated list, e.g. data-control="autofit,page,fullscreen"
autohide true / false / number Enable/disable automatically hide controls when inactive, also set cooldown time
fullscreen true / false Show/hide fullscreen button
zoom true / false Show/hide both zoom buttons
zoomin true / false Show/hide zoom-in button
zoomout true / false Show/hide zoom-out button
autofit true / false Show/hide autofit button
theme true / false Show/hide theme button
player true / false / number Show/hide player button, also set delay between each tick
progress true / false Show/hide autoplay progress bar
infinite true / false Restart from beginning when no slides left
theme "white"
Change the default theme
page true / false Show/hide page
title string / false Set image title or hide it

Note: When using image elements, this attribute will also inherit automatically from <img alt="...">. To prevent this behavior you can set data-title="false". This will hide the title regardless of any image alt-attributes.
description string / false Set image description or hide it
preloader true / false Enable/disable preloading of the current image (also hides spinner)
prefetch true / false Enable/disable preloading of the next image

<div class="spotlight-group" data-title="Untitled" data-animation="fade"
     data-fullscreen="false" data-maximize="false" data-minimize="false">
    <a class="spotlight" href="cat1.jpg" data-title="This is a title.">
        <img src="cat1-thumb.jpg">
    <a class="spotlight" href="cat2.jpg" data-description="This is a description.">
        <img src="cat2-thumb.jpg">
    <a class="spotlight" href="cat3.jpg">
        <img src="cat3-thumb.jpg" alt="This is a title.">

Hint: The 2nd image gets the title "Untitled" from the group attributes.

Control elements could also whitelisted as a comma-separated list, e.g.:

<div class="spotlight-group" data-control="fullscreen,autofit,theme">

Use a whitelist to enable controls gets priority over other ambiguous options.

The same from above as explicitly:

<div class="spotlight-group" data-fullscreen="true" data-contrast="true"
     data-zoomin="false" data-zoomout="false" data-autofit="true">

When control attributes are not specified they are automatically enabled by default.

Therefore the example above could be shortened to:

<div class="spotlight-group" data-zoomin="false" data-zoomout="false">

Since "zoom" is a shorthand for both zoom buttons, this is the same:

<div class="spotlight-group" data-zoom="false">

Spotlight API

Also you can programmatically use Spotlight via the library API. This way does not require any dependant HTML elements (e.g. the classname "spotlight").

Define a gallery group as follows:

var gallery = [{
    title: "Image 1",
    description: "This is a description.",
    src: "gallery/london-1758181.jpg"
    title: "Image 2",
    description: "This is a description.",
    src: "gallery/sea-1975403.jpg"
    title: "Image 3",
    description: "This is a description.",
    src: "gallery/newport-beach-2089906.jpg"

Show gallery with default options:;

Show gallery with custom options:, {
    index: 2,
    theme: "white",
    autohide: false,
    control: ["autofit", "zoom"]

Close gallery:


Next slide:;

Previous slide:


Goto slide:


Zoom to:


Toggle theme:


Set theme:


Toggle fullscreen:


Set fullscreen:


Toggle autofit:


Set autofit:


Toggle menu:;

Set menu:;;

Example ES6:

import Spotlight from "./spotlight.js";
    [ /* Gallery */ ], 
    { /* Options */ }

Note: You may need to perform npm run build initially to make pre-compiled files available.

Custom Styling

To add custom styling just override CSS classes accordingly:

#spotlight {
    /* font styles, background */
#spotlight .title{
    /* image title */
#spotlight .description{
    /* image description */
#spotlight .page{
    /* current page */
#spotlight .fullscreen{
    /* button fullscreen */
#spotlight .autofit{
    /* button autofit */
#spotlight .zoom-out{
    /* button zoom out */
#spotlight .zoom-in{
    /* button zoom in */
#spotlight .theme{
    /* button theme */
#spotlight .player{
    /* button autoplay */
#spotlight .close{
    /* button close */
#spotlight .arrow-left{
    /* button arrow left */
#spotlight .arrow-right{
    /* button arrow right */


Customize builtin themes

Use the same classes as above:

#spotlight.white .title{
    /* image title in white theme */
    /* main background in dark theme */

Create New Themes

Define styles, e.g. for the custom theme name "my-theme": .title{
    /* image title in custom theme */
    /* main background in custom theme */

Apply custom theme via markdown:

<a class="spotlight" href="img.jpg" data-theme="my-theme">
    <img src="thumb.jpg">

Or apply custom theme via API:[ /* Gallery */ ],{
    theme: "my-theme"

Custom Animations

When you pass a custom animation, all other ambiguous animation settings will be overridden (also when mixed with built-ins).

The style class for a custom animation describes the hidden state of an image.

You can define your own custom animation by:

1. Extending the default styles (when image is shown) and corresponding transitions as follows:

#spotlight .scene img{
    filter: grayscale(0);
    transition: filter 1s ease-out,
                opacity 0.5s ease-out;

2. Providing styles for the hidden state of the transition by adding a custom animation name as a class:

#spotlight .scene{
    opacity: 0 !important;
    filter: grayscale(1);

Apply custom animation via markdown:

<a class="spotlight" href="img.jpg" data-animation="my-animation">
    <img src="thumb.jpg">

Or apply custom animation via API:[ /* Gallery */ ],{
    animation: "my-animation"

Preload Library / Async Load

If you like to override css classes for custom styling you may need to add !important flag to the css property value.

    <link rel="preload" href="spotlight.bundle.js" as="script">
    <script src="spotlight.bundle.js" async></script>

Initialize library manually (once):


When using Spotlight exclusively through the API it is recommended to follow this practice. But there are some important facts you might need to know:

  1. When loading the library before loading other stylesheets (which modifies the Spotlight default theme) you do not have to add a "!important" flag to the styles.
  2. When using Spotlight with anchors it is recommended to load the library in the head section of the document to prevent executing the default anchor behavior when the user has clicked during page load.
  3. In rare situations it also might produce a short flashing/reflow after page load, depending on your stack. Moving the script tag into the head section will solve this issue.

Custom Builds

Note: You can modify all source files e.g. stylesheets, template and also the icon files located in /src/img/. Providing a more handy way to pass custom icons is coming soon.

Perform a full build:

npm run build

The destination folder of the build is: /dist/

Copyright 2019 Nextapps GmbH
Released under the Apache 2.0 License

You can’t perform that action at this time.