wtc-gallery-component
Version:
Very simplistic gallery with image preloader and a navigation and autoplay option.
175 lines (137 loc) • 6.08 kB
Markdown
# wtc-gallery-component
A minimal, touch-enabled content switcher, with options for autoplay, pagination, and more.
## Install
```sh
$ npm install wtc-gallery-component
```
## Usage
Import it into your project.
```javascript
import Gallery from "wtc-gallery-component";
```
Include the stylesheet if desired. This can be found in the `dist/` folder, or you can import it directly into your stylesheet:
```scss
"~wtc-gallery-component";
```
Add your markup.
```html
<div data-nav="true">
<ul>
<li>
<img src="./assets/img/image.jpg" alt="" />
</li>
<li>
<img src="./assets/img/image2.jpg" alt="" />
</li>
<li>
<img src="./assets/img/image3.jpg" alt="" />
</li>
</ul>
</div>
```
You now have 2 options to initalize the component.
### 1. Using ExecuteControllers
If you are using [wtc-controller-element] just add **data-controller="Gallery"** to your markup, and ensure that `ExecuteControllers.instanciateAll()` is being called somewhere globally.
```html
<div data-nav="true" data-controller="Gallery">
<ul>
<li>
<img src="./assets/img/image.jpg" alt="" />
</li>
...
</ul>
</div>
```
You can also instantiate the component explicitly:
```javascript
ExecuteControllers.instanciate(document.getElementById("gallery"), Gallery);
```
### 2. Default JS
With the default JS version, you have the option to pass the options as an object, or use data-attributes—they both work.
If you choose to pass the options to the instance, you get a few extra hooks: `onLoad`, `onWillChange`, and `onHasChanged`.
```javascript
let gallery = new Gallery(document.getElementById("gallery"), {
nav: true,
autoplay: true,
delay: 5000,
onLoad: null,
onWillChange: function(instance, direction) {
// run some code before a slide change
},
onHasChanged: function(currentItem, previousItem, instance) {
// run some code after a slide change
},
});
```
## Options
There are many more options you can pass in to the component:
- `nav`: Boolean. Toggles next/previous buttons. Defaults to `false`.
- `autoplay`: Boolean. Auto-starts the gallery transitions. Defaults to `false`.
- `delay`: Number. The delay (in milliseconds) between gallery item transitions. Defaults to `5000`.
- `pauseOnHover`: Boolean. Pauses autoplay when a pointing device is within the gallery area. Defaults to `false`.
- `loop`: Boolean. Enables left or right navigation, when the user reaches the first or last gallery item, respectively. Defaults to `false`.
- `draggable`: Boolean. Allows for a basic swipe/drag to advance gallery items. Defaults to `false`.
- `dragThreshold`: Number. Minimum pixel amount for a drag action to advance the slideshow. Defaults to `40` pixels.
- `pagination`: Boolean. Sets up a navigation list of the gallery items. If `paginationTarget` (below) is specified, you can pass in your own list of elements to use; otherwise a bare bones list will be set up for you. Defaults to `false`.
- `paginationTarget`: String. CSS selector to integrates as navigation for the gallery items. Pagination items will be created from the immediate children of the given element. Defaults to `null`.
- `nextBtnMarkup`: String. Markup to override the default "next button" content.
- `prevBtnMarkup`: String. Markup to override the default "previous button" content.
- `liveRegionText`: String. Markup to override the default aria-live region content.
- **THE FOLLOWING OPTIONS ARE ONLY AVAILABLE WHEN USING THE `new` KEYWORD TO INSTANTIATE:**
- `onLoad`: Function. Fires after all images were preloaded, and the gallery is initiated.
- `onWillChange`: Function. Fires before a gallery transition event happens. Accepts two parameters: `instance` and `direction` (direction will be `true` or `false`, based on whether it's next or previous).
- `onHasChanged`: Function. Fires immediately after the transition event happens (does not wait for animations). Accepts three parameters: `currentItem`, `previousItem`, and `instance`.
If setting options via data-attributes in the markup, change camelCase to kebab-case. For example, `pauseOnHover` would become `data-pause-on-hover`.
For custom pagination, a valid CSS selector is needed—i.e. `data-pagination-target=".my-custom-pagination"`. It does not matter where in the markup this element is; if you're using multiple Galleries, give your pagination items unique classes or IDs.
## Customize!
The following example uses custom pagination, as well as some other nifty options:
```html
<div
data-controller="Gallery"
data-nav="true"
data-autoplay="true"
data-delay="6000"
data-loop="true"
data-pause-on-hover="true"
data-draggable="true"
data-pagination="true"
data-pagination-target=".my-custom-pagination"
>
<ul>
<li>
<img src="./assets/img/image1.jpg" alt="" />
</li>
<li>
<img src="./assets/img/image2.jpg" alt="" />
</li>
<li>
<img src="./assets/img/image3.jpg" alt="" />
</li>
</ul>
<!-- A custom pagination element should have the same amount of sub-items as the number of gallery items. -->
<ul class="my-custom-pagination">
<li>
Item 1 🐼 (could be an image, more markup… could be anything!)
</li>
<li>
Item 2 🦊
</li>
<li>
Item 3 🐍
</li>
</ul>
</div>
```
## Caveats
Please note that this controller should never be stored in an immutable data structure, as doing so can lead to memory leaks due to method bindings within event listeners.
### To-do:
Add a destroy method to un-bind any listeners, per the above caveat.
[wtc-controller-element]: https://github.com/wethegit/wtc-controller-element
## Documentation
Documentation can be found [here](https://wethegit.github.io/wtc-gallery-component/Gallery.html)
## Development
When developing or debugging features in this library, you can use the `index.html` file found in the `dist/` directory to test your changes. Please run the following to get a working build though, as the index.html file depends on the dist files:
```sh
$ npm run build
```
.