商业级web阅读器项目(下)

4.阅读器–阅读进度、目录、全文搜索功能开发

4-1 阅读进度功能实现(进度面板+分页逻辑)

	<template>
	    <transition name="slide-up">
	        <div class="setting-wrapper">
	            <div class="setting-progress">
	                <div class="read-time-wrapper">
	                    <span class="read-time-text">111</span>
	                    <span class="icon-forward"></span>
	                </div>
	                <div class="progress-wrapper">
	                    <div class="progress-icon-wrapper">
	                        <span class="icon-back" @click="prevSection"></span>
	                    </div>
	                    <input class="progress" type="range"
	                           max="100"
	                           min="0"
	                           step="1"
	                           @change="onProgressChange($event.target.value)" @input="onProgressInput($event.target.value)"
	                           :value="progress"
	                           :disabled="!bookAvailable"
	                           ref="progress">
	                    <div class="progress-icon-wrapper">
	                        <span class="icon-forward" @click="nextSection"></span>
	                    </div>
	                </div>
	                <div class="text-wrapper">
	                    <span>{
  {bookAvailable ? progress + '%' : '加载中...'}}</span>
	                </div>
	            </div>
	        </div>
	    </transition>
	</template>
	
	<script>
	    import {
    ebookMixin} from "./../../utils/mixin"
	    export default {
    
	        name: "EbookSettingProgress",
	        mixins:[ebookMixin],
	        data(){
    
	            return{
    
	
	            }
	        },
	        methods:{
    
	            onProgressChange(){
    
	
	            },
	            onProgressInput(){
    
	
	            },
	            prevSection(){
    
	
	            },
	            nextSection(){
    
	
	            }
	        }
	    }
	</script>
	
	<style scoped lang="scss">
	    @import './../../assets/styles/global';
	    .setting-wrapper {
    
	        position: absolute;
	        bottom: px2rem(48);
	        left: 0;
	        z-index: 101;
	        width: 100%;
	        height: px2rem(90);
	        background: white;
	        box-shadow: 0 px2rem(-8) px2rem(8) rgba(0, 0, 0, .15);
	        .setting-progress {
    
	            position: relative;
	            width: 100%;
	            height: 100%;
	            .read-time-wrapper{
    
	                position: absolute;
	                left: 0;
	                top: 0;
                height: px2rem(40);
                width: 100%;
                @include center;
                font-size: px2rem(12);
            }
            .progress-wrapper {
    
                width: 100%;
                height: 100%;
                @include center;
                padding: 0 px2rem(30);
                box-sizing: border-box;
                .progress-icon-wrapper{
    
                    font-size: px2rem(20);
                }
                .progress {
    
                    margin: 0 px2rem(10);
                    width: 100%;
                    -webkit-appearance: none;
                    height: px2rem(2);
                    background: -webkit-linear-gradient(#999, #999) no-repeat, #ddd;
                    background-size: 0 100%!important;
                    &:focus {
    
                        outline: none;
                    }
                    &::-webkit-slider-thumb {
    
                        -webkit-appearance: none;
                        height: px2rem(20);
                        width: px2rem(20);
                        border-radius: 50%;
                        background: white;
                        box-shadow: 0 4px 4px 0 rgba(0, 0, 0, .15);
                        border: px2rem(1) solid #ddd;
                    }
                }
            }
            .text-wrapper {
    
                position: absolute;
                left: 0;
                bottom: px2rem(10);
                width: 100%;
                color: #333;
                font-size: px2rem(12);
                text-align: center;
            }
        }
    }
</style>

这是基础界面,还没实现交互功能

接下来 分析分页逻辑
页数会随着字体的大小,以及屏幕的大小改变

this.book.ready.then(()=>{
   
                    return this.book.locations.generate(750 * (window.innerWidth/375)*(getFontSize(this.fileName)/16)) //分页算法
                }).then(locations=>{
   
                    //当分页完毕后,允许拖动进度条
                    this.setBookAvailable(true)
                })

4-2 阅读进度功能实现(进度拖动功能)

主要就是通过progress的值来控制和反应进度条以及当前页数
这是实现的方法

  displayProgress(){
   
                console.log(this.progress);
                const cfi = this.currentBook.</
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值