Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork27
An accessible, open-source lightbox with no dependencies
License
midzer/tobii
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
An accessible, open-source lightbox with no dependencies.
- No dependencies
- Supports multiple content types:
- Images
- Inline HTML
- Iframes
- Videos (YouTube, Vimeo)
- Grouping
- Events
- Customizable with settings and CSS
- Accessible:
- ARIA roles
- Keyboard navigation:
Prev
/Next
Keys: Navigate through slidesESCAPE
Key: Close TobiiTAB
Key: Focus elements within Tobii, not outside
- User preference media features:
prefers-reduced-motion
media query
- When Tobii opens, focus is set to the first focusable element in Tobii
- When Tobii closes, focus returns to what was in focus before Tobii opened
- Touch & mouse drag/swipe support:
- Horizontal to navigate through slides
- Vertical up to close Tobii
- Double click, pinch and wheel zoom:
- Hold pointer to pan
- Responsive
CSS:dist/tobii.min.css
#"auto">
dist/tobii.min.js
: IIFE build for maximum browser support, including IE 11dist/tobii.modern.js
: Build specially designed to work in all modern browsersdist/tobii.module.js
: ESM builddist/tobii.umd.js
: UMD builddist/tobii.js
: CommonJS/Node buildTobii is also available on npm.
npm install @midzer/tobii --save
You can install Tobii by linking the.css
and.js
files to your HTML file. The HTML code may look like this:
<!DOCTYPE html><html><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1"><title>Your page title</title><!-- CSS --><linkhref="tobii.min.css"rel="stylesheet"></head><body><!-- Your HTML content --><!-- JS --><scriptsrc="tobii.min.js"></script></body></html>
Initialize the script by running:
consttobii=newTobii()
The standard way of using Tobii is a linked thumbnail image with the class namelightbox
to a larger image:
<ahref="path/to/image.jpg"class="lightbox"><imgsrc="path/to/thumbnail.jpg"alt="I am a caption"></a>
Instead of a thumbnail, you can also refer to a larger image with a text link:
<ahref="path/to/image.jpg"class="lightbox"> Open image</a>
If you use a Markdown parser or CMS and want to make all images in a postautomatically viewable in a lightbox, use the following JavaScript code to addall images to the same album:
document.addEventListener('DOMContentLoaded',()=>{// This assumes your article is wrapped in an element with the class "content-article".document.querySelectorAll('.content-article img').forEach((articleImg)=>{// Add lightbox elements in blog articles for Tobii.constlightbox=document.createElement('a');lightbox.href=articleImg.src;lightbox.classList.add('lightbox');lightbox.dataset.group='article';articleImg.parentNode.appendChild(lightbox);lightbox.appendChild(articleImg);});});
For inline HTML, create an element with a unique ID:
<divid="selector"><!-- Your HTML content --></div>
Then create a link with the class namelightbox
and ahref
attribute that matches the ID of the element:
<ahref="#selector"data-type="html"class="lightbox"> Open HTML content</a>
or a button with the class namelightbox
and adata-target
attribute that matches the ID of the element:
<buttontype="button"data-type="html"data-target="#selector"class="lightbox"> Open HTML content</button>
In both ways, the attributedata-type
with the valuehtml
is required.
For an iframe, create a link with the class namelightbox
:
<ahref="https://www.wikipedia.org"data-type="iframe"class="lightbox"> Open Wikipedia</a>
or a button with the class namelightbox
and adata-target
attribute:
<buttontype="button"data-type="iframe"data-target="https://www.wikipedia.org"class="lightbox"> Open Wikipedia</button>
In both ways, the attributedata-type
with the valueiframe
is required.
data-height
set the height anddata-width
the width of the iframe.
For a YouTube video, create a link with the class namelightbox
and adata-id
attribute with the YouTube video ID:
<ahref="#"data-type="youtube"data-id="KU2sSZ_90PY"class="lightbox"> Open YouTube video</a>
or a button with the class namelightbox
and adata-id
attribute with the YouTube video ID:
<buttontype="button"data-type="youtube"data-id="KU2sSZ_90PY"class="lightbox"> Open YouTube video</button>
In both ways, the attributedata-type
with the valueyoutube
is required.
data-controls
indicates whether the video player controls are displayed:0
do not display and1
display controls in the player.data-height
set the height anddata-width
the width of the player. I recommend using an external library for responsive iframes.
If you have a group of related types that you would like to combine into a set, add thedata-group
attribute:
<ahref="path/to/image_1.jpg"class="lightbox"data-group="vacation"><imgsrc="path/to/thumbnail_1.jpg"alt="I am a caption"></a><ahref="path/to/image_2.jpg"class="lightbox"data-group="vacation"><imgsrc="path/to/thumbnail_2.jpg"alt="I am a caption"></a>// ...<ahref="path/to/image_4.jpg"class="lightbox"data-group="birthday"><imgsrc="path/to/thumbnail_4.jpg"alt="I am a caption"></a>// ...
You can pass an object with custom options as an argument.
consttobii=newTobii({captions:false})
The following options are available:
Property | Type | Default | Description |
---|---|---|---|
selector | string | ".lightbox" | All elements with this class triggers Tobii. |
captions | bool | true | Display captions, if available. |
captionsSelector | "self", "img" | "img" | Set the element where the caption is. Set it to "self" for thea tag itself. |
captionAttribute | string | "alt" | Get the caption from given attribute. |
captionText | function | null | Custom callback which returns the caption text for the current element. The first argument of the callback is the element. If set,captionsSelector andcaptionAttribute are ignored. |
captionHTML | bool | false | Allow HTML captions. |
captionToggle | bool | true | Allows users to hide or show the caption by clicking or tapping on it. |
captionToggleLabel | string | ["Hide caption", "Show caption"] | Labels for the caption display toggle button. |
nav | bool, "auto" | "auto" | Display navigation buttons. "auto" hides buttons on touch-enabled devices. |
navText | string | ["inline svg", "inline svg"] | Text or HTML for the navigation buttons. |
navLabel | string | ["Previous", "Next"] | ARIA label for screen readers. |
close | bool | true | Display close button. |
closeText | string | "inline svg" | Text or HTML for the close button. |
closeLabel | string | "Close" | ARIA label for screen readers. |
dialogTitle | string | "Lightbox" | ARIA label for screen readers. |
loadingIndicatorLabel | string | "Image loading" | ARIA label for screen readers. |
counter | bool | true | Display current image index. |
keyboard | bool | true | Allow keyboard navigation. |
zoom | bool | true | Display zoom icon. |
zoomText | string | "inline svg" | Text or HTML for the zoom icon. |
docClose | bool | true | Click outside to close Tobii. |
swipeClose | bool | true | Swipe up to close Tobii. |
draggable | bool | true | Use dragging and touch swiping. |
threshold | number | 100 | Touch and mouse dragging threshold (in px). |
autoplayVideo | bool | false | Videos will automatically start playing as soon as they can do so without stopping to finish loading the data. |
autoplayAudio | bool | false | Audio will automatically start playing. |
You can also use data attributes to customize HTML elements.
<ahref="path/to/image.jpg"class="lightbox"data-group="custom-group"> Open image.</a>
The following options are available:
Property | Description |
---|---|
data-type | Sets media type. Possible values:html ,iframe ,youtube . |
data-id | Required for youtube media type. |
data-target | Can be used to set target for "iframe" and "html" types. |
data-group | Set custom group |
data-width | Set container width for iframe or youtube types. |
data-height | Set container height for iframe or youtube types. |
data-controls | Indicates whether the video player controls are displayed: 0 do not display and 1 display controls in the player. |
data-allow | Allows to set allow attribute on iframes. |
data-srcset | Allows to have Responsive image or retina images |
data-zoom | Allows to enable or disable zoom icon. Values: "true" or "false" |
Function | Description |
---|---|
open(index) | Open Tobii. Optionalindex (Integer), zero-based index of the slide to open. |
select(index) | Select a slide withindex (Integer), zero-based index of the slide to select. |
previous() | Select the previous slide. |
next() | Select the next slide. |
selectGroup(value) | Select a group withvalue (string), name of the group to select. |
close() | Close Tobii. |
add(element) | Addelement (DOM element). |
remove(element) | Removeelement (DOM element). |
isOpen() | Check if Tobii is open. |
slidesIndex() | Return the current slide index. |
slidesCount() | Return the current number of slides. |
currentGroup() | Return the current group name. |
reset() | Reset Tobii. |
destroy() | Destroy Tobii. |
Bind events with the.on()
and.off()
methods.
consttobii=newTobii()constlistener=functionlistener(){console.log('eventName happened')}// bind event listenertobii.on(eventName,listener)// unbind event listenertobii.off(eventName,listener)
eventName | Description |
---|---|
open | Triggered after Tobii has been opened. |
close | Triggered after Tobii has been closed. |
previous | Triggered after the previous slide is selected. |
next | Triggered after the next slide is selected. |
Tobii supports the following browser (all the latest versions):
- Chrome
- Firefox
- Internet Explorer 11
- Edge
- Safari
- Open an issue or a pull request to suggest changes or additions
- Spread the word
Tobii is available under the MIT license. See theLICENSE file for more info.
About
An accessible, open-source lightbox with no dependencies
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Sponsor this project
Uh oh!
There was an error while loading.Please reload this page.
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors9
Uh oh!
There was an error while loading.Please reload this page.