UNPKG

react-modal-slideshow

Version:

A simple React modal media slideshow with CSS powered animations

348 lines (242 loc) 9.41 kB
# react-modal-slideshow [![Build Status](https://travis-ci.org/TiuSh/react-simple-modal-slideshow.svg?branch=master)](https://travis-ci.org/TiuSh/react-simple-modal-slideshow) A simple React modal media slideshow with CSS powered animations. ## Install ``` $ npm install react-modal-slideshow ``` ## Demo https://tiush.github.io/react-simple-modal-slideshow/ Or locally: ``` $ git clone https://github.com/null-none/react-modal-slideshow.git $ cd react-modal-slideshow $ npm install $ npm run dev ``` ## Usage ```js import { Component } from 'react'; import SimpleModalSlideshow from 'react-modal-slideshow'; export default SomeComponent extends Component { /* (...) */ render() { return ( <SimpleModalSlideshow slides={[{ title: ( <h2>Title</h2> ), media: ( <img src="https://unsplash.it/600/400?image=0" /> ), content: ( <div> Donec id elit non mi porta gravida at eget metus. Sed posuere consectetur est at lobortis. </div> ), }, { title: ( <h2>Title</h2> ), media: ( <img src="https://unsplash.it/600/400?image=1" /> ), content: ( <div> Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. </div> ), }]} open={this.state.open} currentSlide={this.state.currentSlide} onClose={::this.handleClose} onNext={::this.handleNext} onPrev={::this.handlePrev} /> ); } } ``` Then copy the `lib/simple-modal-slideshow.css`, and include it in your HTML page if you want to use the default styling. Or you can directly import `src/simple-modal-slideshow.scss` from a SASS file. See [Styling](#styling) for more informations. ## Options ### slides **required** | Type: `Array` | Default: `undefined` Each slide is represented by an object : #### slide.content Type: `Anything that can be rendered` | Default: `undefined` Optional content to be displayed with the title. #### slide.media **required** | Type: `Anything that can be rendered` | Default: `undefined` Media element of the slide. #### slide.content Type: `Anything that can be rendered` | Default: `undefined` Optional content to be displayed with the media. ### open Type: `Boolean` | Default: `false` Whether the modal is opened. ### currentSlide Type: `Integer` | Default: `0` Index of the slide to display (if modal is opened). ### enableApi Type: `Boolean`| Default: `false` If set to `true` the public API will be enabled, and props `open` and `currentSlide` will be ignored. See the [API](#api) section for more informations. **Warning:** Please note that this prop has been designed to be statically set (e.g. `enableApi={true}`), so updating this value during the lifecycle of the component may lead to an unknown behaviour. ### classNamePrefix Type: `String`| Default: `modal-slideshow` Every HTML class name in this component is prefix with this string (see [Styling](#styling)). You can set this prop for example if you want to style multiple slideshows differently. ### modalAnimations Type: `Boolean` | Default: `true` If set to `true` modal animations (opening and closing) will be enabled. See the [Animations](#animations) section for more informations. ### slideAnimations Type: `Boolean` | Default: `true` If set to `true` slide animations (when updating current slide index) will be enabled. See the [Animations](#animations) section for more informations. ### modalTranstionEnterTimeout Type: `Integer` | Default: `300` Modal `enter` CSS animation duration. ### modalTranstionLeaveTimeout Type: `Integer` | Default: `300` Modal `leave` CSS animation duration. ### slideTranstionEnterTimeout Type: `Integer` | Default: `300` Slide `enter` CSS animation duration. Note that it will be the same for `left` and `right` animations. ### slideTranstionLeaveTimeout Type: `Integer` | Default: `300` Slide `leave` CSS animation duration. Note that it will be the same for `left` and `right` animations. ### onClose Type: `Function` | Default: `undefined` Function called when the user clicks on the `a.modal-slideshow__close` tag, or when he hit the `ESC` key. If `enableApi` is set to `true` and this prop is omitted the component will automatically close the slideshow. Otherwise this function is responsible for closing the slideshow. ### onPrev Type: `Function` | Default: `undefined` Function called when the user clicks on the `a.modal-slideshow__controls--prev` tag, or when he hit the `left arrow` key. The function is called with the previous slide index as an argument. If `enableApi` is set to `true` and this prop is omitted the component will automatically go to the previous slide. Otherwise this function is responsible for updating the current slide index. ### onNext Type: `Function` | Default: `undefined` Function called when the user clicks on the `a.modal-slideshow__controls--next` tag, or when he hit the `right arrow` key. The function is called with the next slide index as an argument. If `enableApi` is set to `true` and this prop is omitted the component will automatically go to the next slide. Otherwise this function is responsible for updating the current slide index. ## API When the API is enabled (using the `enableApi` prop), the props `open` and `currentIndex` are ignored. This way we prevent any situation where the props may be inconsistent with the state of the component. ### open(index) * *index* (**optional**): Type: `Integer` | Default: `undefined` Opens the modal slideshow. Optionally you can specify a slide index to open to a specific slide. ### goTo(index) * *index*: Type: `Integer` | Default: `undefined` Goes to a specific slide index. ### goToNext() Goes to the next slide. ### goToPrev() Goes to the previous slide. ### close() Closes the modal slideshow. ## Styling The slideshow is fully custimizable through CSS, or even better with SASS. Here is the full HTML structure of the modal when opened : ```html <div class="modal-slideshow"> <a class="modal-slideshow__close"> Close </a> <div> <div class="modal-slideshow__slide"> <div class="modal-slideshow__media"> <!-- slide.media --> <div class="modal-slideshow__controls"> <a class="modal-slideshow__controls--prev"> Previous </a> <a class="modal-slideshow__controls--next"> Next </a> </div> </div> <div class="modal-slideshow__content"> <!-- slide.content --> </div> </div> </div> </div> ``` ### SASS The slideshow is originally styled using SASS. Therefor you can directly import the default style from the `node_modules` folder: ```css @import 'node_modules/react-simple-modal-slideshow/src/simple-modal-slideshow.scss'; // Your style ``` This SASS file also offers the possibility to customize the default styling using SASS variables: #### $modal-slideshow-prefix Type: `String` | Default: `modal-slideshow` Should correspond to the `classNamePrefix` prop from the component you want to style. #### $modal-slideshow-modal-animation Type: `[false|'fade']` | Default: `fade` Animation used when opening/closing the modal. When set to false, default modal animations are disabled, so you can use your own. #### $modal-slideshow-slide-animation Type: `[false|'slide'|'zoom']` | Default: `slide` Animation used when changing slides. When set to false, default slide animations are disabled so you can use your own. #### $modal-slideshow-z-index Type: `Integer` | Default: `9999` #### Example ```css $modal-slideshow-prefix: 'example-slideshow'; $modal-slideshow-slide-animation: 'zoom'; @import 'node_modules/react-modal-slideshow/src/simple-modal-slideshow.scss'; // Your style ``` ### CSS You can copy the file `lib/simple-modal-slideshow.css` and simply include it in your HTML page to use the default styling. Feel free to modify this file to fit your needs. ### Animations Modal and slides are animated using [ReactCSSTransitionGroup](https://facebook.github.io/react/docs/animation.html) components on `.modal-slideshow` and `.modal-slideshow__slide` elements. So you can easily create your own animations with CSS, using these transitions: #### Modal transitions ##### enter `.modal-slideshow__modal-enter` / `.modal-slideshow__modal-enter-active` When modal is opened. ##### leave `.modal-slideshow__modal-leave` / `.modal-slideshow__modal-leave-active` When modal is closed. #### Slide transitions ##### enterLeft `.modal-slideshow__slide-enter-left` / `.modal-slideshow__slide-enter-left-active` When the next slide enters. ##### leaveLeft `.modal-slideshow__slide-leave-left` / `.modal-slideshow__slide-leave-left-active` When the current slide is leaving for the next one. ##### enterRight `.modal-slideshow__slide-enter-right` / `.modal-slideshow__slide-enter-right-active` When the previous slide enters. ##### leaveRight `.modal-slideshow__slide-leave-right` / `.modal-slideshow__slide-leave-right-active` When the current slide is leaving for the previous one. ## Licence MIT