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
- Host: GitHub
- URL: https://github.com/nodlik/react-pageflip
- Owner: Nodlik
- License: mit
- Created: 2020-06-10T13:07:28.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2023-08-26T14:53:16.000Z (about 2 years ago)
- Last Synced: 2025-05-30T03:40:03.537Z (4 months ago)
- Topics: animation, book, effects, flip, fold, javascript, page, react, reactjs
- Language: TypeScript
- Homepage: https://nodlik.github.io/react-pageflip/
- Size: 11.3 MB
- Stars: 539
- Watchers: 7
- Forks: 102
- Open Issues: 45
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
README
[](https://github.com/Nodlik/react-pageflip/blob/master/LICENSE) [](https://www.npmjs.com/package/react-pageflip) [](https://npmcharts.com/compare/react-pageflip?minimal=true) [](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

### 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 dependenciesLive 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