npmjs: https://www.npmjs.com/package/epubjs
npm i epubjs
src/hooks/
- import Epub from "epubjs";
- import type { Book, Rendition } from 'epubjs'
- import type { BookOptions } from 'epubjs/types/book'
- import type { RenditionOptions } from 'epubjs/types/rendition'
-
- export function useEpub() {
- let book: Book
- let rendition: Rendition
-
- function createBook(urlOrData?: string | ArrayBuffer, options?: BookOptions) {
- if(!urlOrData) {
- book = Epub(options)
- } else {
- book = Epub(urlOrData, options)
- }
- return book
- }
-
- function render(element: Element | string, options?: RenditionOptions) {
- if(!book) return
- if(typeof element === 'string') {
- rendition = book.renderTo(element, options)
- } else {
- rendition = book.renderTo(element, options)
- }
- return rendition
- }
-
- function display() {
- if(!rendition) return
- return rendition.display()
- }
-
- function getBook() {
- return book
- }
-
- function getRendition() {
- return rendition
- }
-
- return { createBook, render, display, getBook, getRendition }
- }
- <div class="main">
- <div id="epub">div>
- <div class="btn">
- <button @click="pre">prebutton>
- <button @click="next">nextbutton>
- div>
- div>
- <script setup lang="ts">
- import { useEpub } from '../hooks'
- import { onMounted } from 'vue'
-
- const { createBook, render, display, getRendition } = useEpub()
-
- onMounted(() => {
- createBook('static/example.epub')
- render('epub', { width: '100%', height: '100%' })
- display()
- })
-
- // 上一页
- const pre = async () => {
- await getRendition().prev()
- }
-
- // 下一页
- const next = async () => {
- await getRendition().next()
- }
- script>
- <style scoped>
- .main {
- width: 100%;
- height: 100%;
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
- }
-
- .main > #epub {
- width: 500px;
- height: 500px;
- border: 1px dashed red;
- box-sizing: border-box;
- }
- .main .btn {
- display: flex;
- justify-content: space-between;
- margin-top: 5px;
- }
- .main .btn button {
- padding: 7px 15px;
- margin-left: 20px;
- }
- style>
这个示例电子书地址:https://example-files.online-convert.com/ebook/epub/example.epub
直接下载下来,放在public/static下。
这篇只是简单写一下使用,还没有正式用到
写的相对更详细一些,也可以看着源码调用对应方法来实现对应功能。