An open API service indexing awesome lists of open source software.

https://github.com/nodlik/react-pageflip

Simple React.js wrapper for StPageFlip library, for creating realistic and beautiful page turning effect
https://github.com/nodlik/react-pageflip

animation book effects flip fold javascript page react reactjs

Last synced: 4 months ago
JSON representation

Simple React.js wrapper for StPageFlip library, for creating realistic and beautiful page turning effect

Awesome Lists containing this project

README

          

[![GitHub license](https://img.shields.io/github/license/Nodlik/react-pageflip)](https://github.com/Nodlik/react-pageflip/blob/master/LICENSE) [![npm](https://img.shields.io/npm/v/react-pageflip)](https://www.npmjs.com/package/react-pageflip) [![npm](https://img.shields.io/npm/dm/react-pageflip)](https://npmcharts.com/compare/react-pageflip?minimal=true) [![](https://img.shields.io/badge/support-buymeacoffee-orange)](https://www.buymeacoffee.com/nndlik)

# Version 2.0.0

This version fixed some bugs and is completely written with react hooks.
!!! Method access api changed !!!

# React.js wrapper for StPageFlip

Simple React.js wrapper for StPageFlip library, for creating realistic and beautiful page turning effect

![](video.gif)

### Features of StPageFlip

- Works with simple images on canvas and complex HTML blocks
- Has simple API and flexible configuration
- Compatible with mobile devices
- Supports landscape and portrait screen mode
- Supports soft and hard page types (only in HTML mode)
- No dependencies

Live Demo with source code: https://nodlik.github.io/react-pageflip/

Docs and examples to StPageFlip: https://nodlik.github.io/StPageFlip/

Docs (generated by TypeDoc): https://nodlik.github.io/StPageFlip/docs/index.html

### Installation

You can install the latest version using npm:

`npm install react-pageflip`

### Basic Usage

```jsx
import HTMLFlipBook from 'react-pageflip';

function MyBook(props) {
return (

Page 1

Page 2

Page 3

Page 4


);
}
```

### Advanced Usage

You can define pages as a component, but in this case you should use `React.forwardRef` method. Like this:

```jsx
const Page = React.forwardRef((props, ref) => {
return (


/* ref required */

Page Header


{props.children}


Page number: {props.number}



);
});

function MyBook(props) {
return (

Page text
Page text
Page text
Page text

);
}
```

### Props

To set configuration use these props:

- `width: number` - required
- `height: number` - required
- `size: ("fixed", "stretch")` - default: `"fixed"` Whether the book will be stretched under the parent element or not
- `minWidth, maxWidth, minHeight, maxHeight: number` You must set threshold values ​​with size: `"stretch"`
- `drawShadow: bool` - default: `true` Draw shadows or not when page flipping
- `flippingTime: number` (milliseconds) - default: `1000` Flipping animation time
- `usePortrait: bool` - default: `true` Enable switching to portrait mode
- `startZIndex: number` - default: `0` Initial value to z-index
- `autoSize: bool` - default: `true` If this value is true, the parent element will be equal to the size of the book
- `maxShadowOpacity: number [0..1]` - default: `1` Shadow intensity (1: max intensity, 0: hidden shadows)
- `showCover: boolean` - default: `false` If this value is true, the first and the last pages will be marked as hard and will be shown in single page mode
- `mobileScrollSupport: boolean` - default: `true` disable content scrolling when touching a book on mobile devices
- `swipeDistance: number` - default: `30` (px) minimum distance to detect swipe
- `clickEventForward: boolean` - default: `true` forwarding click events to the page children html elements (only for `a` and `button` tags)
- `useMouseEvents: boolean` - default: `true` using mouse and touch events to page flipping
- `renderOnlyPageLengthChange: boolean` - default: `false` (NEW on 2.0.0) if this flag is active, the book will be updated and re-rendered ONLY if the number of pages has changed

### Events

You can use the following events:

```jsx
...
function DemoBook() {
const onFlip = useCallback((e) => {
console.log('Current page: ' + e.data);
}, []);

return (

/* ... pages */

)
}
```

**Available events:**

- `onFlip: number` - triggered by page turning
- `onChangeOrientation: ("portrait", "landscape")` - triggered when page orientation changes
- `onChangeState: ("user_fold", "fold_corner", "flipping", "read")` - triggered when the state of the book changes
- `onInit: ({page: number, mode: 'portrait', 'landscape'})` - triggered when the book is init and the start page is loaded. Listen (`on`) this event before using the "loadFrom..." methods
- `onUpdate: ({page: number, mode: 'portrait', 'landscape'})` - triggered when the book pages are updated (using the "updateFrom..." methods)

Event object has two fields: `data: number | string` and `object: PageFlip`

### Methods

To use methods, you need to get a `PageFlip` object. This can be done using React `ref` and `pageFlip(): PageFlip` method
For example - flipping to the next page:

```jsx
function DemoBook() {
const book = useRef();

return (
<>

book.current.pageFlip().flipNext()}>Next page


/* ... pages */

>
)
}
```

**Available methods:**

| Method name | Parameters | Return type | Description |
| --------------------- | -------------------------------------------- | ------------------------- | -------------------------------------------------------------- |
| `getPageCount` | ` ` | `number` | Get number of all pages |
| `getCurrentPageIndex` | ` ` | `number` | Get the current page number (starts at 0) |
| `getOrientation` | ` ` | `'portrait', 'landscape'` | Get the current orientation: portrait or landscape |
| `getBoundsRect` | ` ` | `PageRect` | Get current book sizes and position |
| `turnToPage` | `pageNum: number` | `void` | Turn to the specified page number (without animation) |
| `turnToNextPage` | ` ` | `void` | Turn to the next page (without animation) |
| `turnToPrevPage` | ` ` | `void` | Turn to the previous page (without animation) |
| `flipNext` | `corner: ['top', 'bottom']` | `void` | Turn to the next page (with animation) |
| `flipPrev` | `corner: ['top', 'bottom']` | `void` | Turn to the previous page (with animation) |
| `flip` | `pageNum: number, corner: ['top', 'bottom']` | `void` | Turn to the specified page (with animation) |
| `loadFromImages` | `images: ['path-to-image1.jpg', ...]` | `void` | Load page from images |
| `loadFromHtml` | `items: NodeListOf, HTMLElement[]` | `void` | Load page from html elements |
| `updateFromHtml` | `items: NodeListOf, HTMLElement[]` | `void` | Update page from html elements |
| `updateFromImages` | `images: ['path-to-image1.jpg', ...]` | `void` | Update page from images |
| `destroy` | ` ` | `void` | Destructor. Removes Parent HTML Element and all event handlers |

### Contacts

Oleg,

https://github.com/Nodlik/react-pageflip

[![Buy me a coffee][buymeacoffee-shield]][buymeacoffee]

[buymeacoffee]: https://www.buymeacoffee.com/nndlik
[buymeacoffee-shield]: https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png