小说阅读翻页分页实现思路

最近想做一个小说阅读APP,在阅读界面的编写上卡住了。

使用CSS column 进行分页,数据会集中到一个div里面,可以实现平移,无法实现仿真翻页。

分析小说阅读APP,重点在于对小说内容的切分。

如果按每个字对内容进行切分,阅读加载超慢,每一章大于2千字左右,加上换行,空格等格式字符,切分效率很低

如果小说内容带有格式,可以对内容进行<br>进行切分,没有格式对空格进行切分,我这里对<br>进行切分,段落进行切分让整体长度比较小

数据切分好后,需要对数据进行装载。核心也就是对数据渲染到div的高度进行计算,是否超过容器高度。

这里我使用一个隐藏的DIV,来计算每一页的高度,循环填充分段数据到div里面,并判断div是否超过当前容器高度。

该页的最后一段,极大可能会超出容器高度,所有我们需要对最后一段进行切分,切分成每个字,循环对div进行填充,

直到超出容器高度,回滚div到上一次的没超出的状态,进行一页提交,开始下一页。

大概思路就这里。

伪代码:

var height = window.innerHeight

var data = content.split('<br>')

var firstText = []

for(var i = 0; i < data.length; i++){

    var over = firstText.pop();
	if(over){
		$('div').append(over+"<br>")
	}
    
    var content = $('div').text()  

    $('div').append(data[i] + '<br>')
    
    if($('div').height() > height){
        //还原div上一次状态
        $('div').text(content)
        //段落切分成字
        var words = data[i].split('')   
        for(var j = 0 ; j < words.length; j++){
            $('div').append(words[i])
            if($('div').height() > height){
                 $('div').text(content)
                 firstText.push(data[i].substr(j,data[i].length))   
                 //新的一页 渲染dom 
                 // div -> newDiv
				 // ....
                 $('div').empty()
                 break;
            }else{
                content+=words[i]
            }
        }
    }  
}

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue.js 实现本地数据的筛选和分页功能,可以分为以下几个步骤: 1. 准备数据 首先需要准备一份数据,可以是数组或者对象,包含了需要筛选和分页展示的数据。 2. 筛选数据 在 Vue 组件中,可以使用计算属性 computed 来筛选数据。在计算属性中,使用 JavaScript 数组的 filter 方法过滤数据。例如,如果需要根据关键字筛选数据,可以这样实现计算属性: ```javascript computed: { filteredData() { return this.data.filter(item => item.title.indexOf(this.keyword) !== -1); } } ``` 这里假设数据中每个对象都有一个 title 属性,我们通过输入框绑定的 keyword 来过滤 title 中包含关键字的数据。 3. 分页数据 分页功能可以使用第三方组件库,例如 Element UI 的分页组件,也可以自己实现。自己实现分页功能的思路,主要包括以下几个步骤: - 定义每页展示的数据条数 pageSize。 - 根据 pageSize 计算出总页数 totalPage。 - 定义当前页码 currentPage,默认为 1。 - 根据 currentPage 和 pageSize,计算出当前页展示的数据列表 currentData。 - 点击页码时,改变 currentPage 的值,从而更新 currentData。 具体实现可以参考下面的代码示例: ```javascript <template> <div> <input v-model="keyword" placeholder="请输入关键字"> <ul> <li v-for="item in currentData" :key="item.id">{{ item.title }}</li> </ul> <el-pagination :current-page="currentPage" :page-size="pageSize" :total="filteredData.length" @current-change="handlePageChange" /> </div> </template> <script> export default { data() { return { keyword: '', pageSize: 10, currentPage: 1, data: [ { id: 1, title: 'Vue.js 实战教程' }, { id: 2, title: 'JavaScript 高级编程' }, ... ], }; }, computed: { filteredData() { return this.data.filter(item => item.title.indexOf(this.keyword) !== -1); }, currentData() { const startIndex = (this.currentPage - 1) * this.pageSize; const endIndex = startIndex + this.pageSize; return this.filteredData.slice(startIndex, endIndex); }, }, methods: { handlePageChange(currentPage) { this.currentPage = currentPage; }, }, }; </script> ``` 在上面的代码中,我们使用了计算属性 filteredData 来筛选数据,用 currentData 来分页展示数据。在分页组件上,监听 current-change 事件,调用 handlePageChange 方法来更新 currentPage 的值,从而更新 currentData。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值