前端实现类似于iBooks的图书翻页效果的网络阅读软件(一)

昨天晚上在群里交流各种脑动大开的题目,我顺手也提了一个问题: JS如何做“字符分页“

原意是源于我4年前公司项目,我负责开发1年的样子,后来各种原因就没有然后了…

http://reader.appcarrier.com/

   

以上图片是手机上的截图,Metro风格当前可是风靡一时,软件本身是类似现在的”追书神器”

通过书名,在网络上搜索到对应的内容,之后保存到本地数据库。在通过JS获取数据再处理

自己装好测了下,貌似下载服务器已经挂了~

程序采用PhoneGap打包的,数据采集是用底层完成的,其余的都是通过前端处理

规定:采集到一本书内容,按照书的章节分数据块,写入到本地数据库中,数据库可以用SQLite,webkit是支持的

前端层面需要处理的几个重要问题:

  • 字符分页:一个页面到底可以容纳多少字符(文字,符号,空格等等)
  • 性能问题:如何快速生成指定页面
  • 模拟翻页:类似ibooks翻页效果,页正反页面都有文字

由于时间太久了,我也没仔细去查阅代码了,这里只能凭记忆描述下

原理:

要实现类似于图书的效果,首先要进行的,就是分页操作。也就是说,需要把一段长长的文字,分解成若干个页面。

分页背景知识:

表面上来看,分页操作并不复杂,但实际上分页是非常复杂的功能,这个想靠js去计算文字占用的空间,难,非常难

我在问的时候,大家脑洞打开,比如:用一个不换行的宽度100%的容器,计算什么时候scrollwidth 大于width,那么就可以计算出  标点需要多少个填满,等等之类的答案

现在站在我的理解层次简单描述下:

纯文本:

纯文本是最简单的情况。纯文本的高度是固定的,因此,只要能计算出每一行的高度,就可以进行分页。但是,中文排版也不是一件简单的事情,因为中文的标点是很有讲究的:

  • 某些标点不能出现在行的开头,例如“逗号”就不应该出现在行首。有些标点不能出现在行的结尾,例如“正引号”就不应该出现在行的结尾。这个叫做标点的“避头尾”。
  • 如果出现连续的标点,例如冒号后面跟着引号,那么这两个标点不应该占据2个字符的位置,而应该合并起来占据一个字符的位置。这个叫做标点的“压缩”。

html格式:

对于html格式,情况就复杂很多,因此此时行距不固定了,段前、段后间距可能是任意值,而且每行的文字的字体、字号都有可能不一样,这样,计算每一行的高度,就要考虑到种种细微的因素。

如果中间再有图像,情况就会进一步复杂。图像的高度,图像和文字的边距等等。

服务器计算:

如果在服务器里面,提前计算好分页呢?也有问题, 因为要适合不同的手机分辨率,软件本身还可以设置字体的大小,等等

因此:

  • 即使是纯文本,高度的计算也是有一个复杂度的。当然,有些软件可能不考虑这些中文特性,胡乱计算。
  • 不管采用底层的Java语言,还是采用客户端的Javascript语言,要实现精致的分页算法都是很难的。
  • 可能有人想问,如果分页分得不好会出现什么情况。最常见的,是最下面以行,某些文字只能显示“半行”。而且显而易见,出现半行的几率,远远大于正好是整行的几率。

总结:通过纯理论去计算分页,和自己写一个文字排版软件区别已经不大了,这绝不是短期的工作能够完成的。况且我也写不出~

HTML对分页的支持

HTML并不直接支持分页。

Adobe正在建议一个新的CSS样式,称为CSS Region(http://www.adobe.com/devnet/html5/articles/css3-regions.html)。

如果这个功能开发成功,就能实现类似于排版软件的排版效果。据说这个功能在新的Chrome测试版中正在开发中,但何时能投入使用并稳定运行,还是未知数。

html5新增加了一个功能,就是分栏(columns)。分栏功能可以制作类似于Word中的分栏效果

html5的分栏效果以及CSS代码

如果还不了解分栏,则请阅读如下文章:

分栏虽然不如CSS region那样灵活,但勉强也能够在不同的栏之间,实现文字的拆分。如果我们把每个栏设置成刚好一页的话,就初步模拟了分页的效果

分栏功能的性能及动态结构

虽然分栏功能初步能够模拟分页效果,但还存在着不少问题:

  1. 分栏形成的页面,是连续排列的。也就是说,可以支持滑动操作,但并不能支持“翻页”效果。
  2. 如果栏目过多时,性能会很差。(大约20~30个栏目会有明显性能下降)

我们先讨论第2个问题,就是如何动态切换分栏中的内容。

由于分栏存在性能问题,因此,我们不可能把很长的内容,全部用分栏排列(请注意,这是我们后面进行了复杂设计的原因。如果分栏没有性能问题,自然也不需要那么复杂的设计)。

由于性能问题,我们不能把所有需要的内容,全部放在分栏结构中,只能一段一段地显示在栏目中。也就是说,用于构建分栏的段落,是动态变化的

在这种情况下,对于分页的方式而言,最大的问题,是前面的段落,会影响后面的段落的排列。

考虑如下图所示的情况。

图中两个段落在分栏状态下排列

图中,蓝色段落充满了一个栏后,会挤出一些内容到下一栏。而绿色段落,会从蓝色段落结束的地方继续排列。

现在假设动态切换时,蓝色段落被删除,而在绿色段落后面,增加了红色段落。此时,不能让绿色段落从栏首开始排列,必须在绿色段落的开始,给出一个空白的间隔出来,

如图所示。

图中红色段落的排版

也就是说,虽然蓝色段落被删除,但是其对分栏排版的影响,仍然需要计算在内。就上图来说,第1个栏可以完全忽略,因为不影响后面的排版。第2栏的上半部分,也就是蓝色段落的“剩余影响”,在排版仍然要考虑在内。

如何计算每个段落对后面的段落的“剩余影响”呢?幸好在分栏模式下,提供了获取每个段落的高度的功能,就是用zepto的height()函数就可以获取高度。获取了高度之后,除以栏目高度的余数,就是“剩余影响”。

因此,精确地计算出每个段落的高度,就可以实现动态的分栏排版。

以上就是基于对分栏实现排版的理论,之后涉及

  • 分栏功能对翻页的支持
  • 分页的实现
  • 翻页的效果
  • 性能优化

等等这些知识点,等下一节发布吧

时间: 2024-12-21 00:25:10

前端实现类似于iBooks的图书翻页效果的网络阅读软件(一)的相关文章

turn.js 图书翻页效果

今天用turn.js 做图书的翻页效果遇到问题: 图片路径总是出错 调了一天,总算调出来了 我用的thinkphp,其他的不知道是不是一样 两个地方要改动: 1.后台查出地址 注意的地方:1.地址要完全的 2.js要用json格式的数据 $more = M('File')->where(array('id'=>$id))->find(); $more1 = json_decode($more['more'],true); foreach($more1 as $k => $v){ /

Android翻页效果原理实现之翻页的尝试

尊重原创转载请注明:From AigeStudio(http://blog.csdn.net/aigestudio)Power by Aige 侵权必究! 炮兵镇楼 在<自定义控件其实很简单>系列的前半部分中我们用了整整六节近两万字两百多张配图讲了Android图形的绘制,虽然篇幅很巨大但仍然只是图形绘制的冰山一角,旨在领大家入门,至于修行成果就看各位的了--那么这个些列主要是通过前面学习到的一些方法来尝试完成一个翻页的效果. 对于我个人来说,我是不太建议大家在没自己去尝试前看本文的,因为你看

android开发教程:android手势翻页效果

听麦子学院android开发老师说要实现手势翻页效果,主要用到ViewFlipper和GestureDetector.  ViewFlipper变化当前显示内容,GestureDetector监听手势.  用于多页的展示非常酷.  现在我就给大家简单说明下,  首先创建工程:TestFlip,创建主Activity:TestFlip.  在res/layout/main.xml中添加flipper信息,如下:  Java代码   1. <?xml version="1.0" en

微信里经常看到的滑动翻页效果,slide

上个星期我们的产品姐姐让我帮她写个微信里经常看到的滑动翻页效果,今天抽空写了3个小demo(只写了webkit需要chrome模拟手机看 开启touch事件), 故此写个随笔. 1.demo1,整个大容器tranlateY(性能应该是最好的,但是如果增删一页的话对css影响很大,如果用sass或less除外) html: <!DOCTYPE html> <html> <head> <title></title> <meta name=&qu

微信翻页效果

今天闲得蛋疼,重构了之前写的微信翻页效果. 先上地址,觉得可以给颗星星,觉得有问题请大力吐槽. github:https://github.com/skyweaver213/slide 3个demo地址:http://skyweaver213.github.io/slide/widget/slide1/slide.htmlhttp://skyweaver213.github.io/slide/widget/slide2/slide.htmlhttp://skyweaver213.github.i

CSS3-----图片翻页效果的展示

在开发一个网站的过程中各种翻页效果数不胜数,在这里我将介绍一下简单的一种方法就是使用css3的旋转即可实现这种常见的效果: 显示效果如下: 首先是页面的布局,不用那么复杂; a标签的href属性,一般指向一个URL地址,也可以调用javascript,如href="javascript:xxx();",但是文档中推荐这样写<a href="http://www.111cn.net/zhongxing/U880/ javascript:void(0)" oncl

子数涵数&#183;PS ——翻页效果

一.首先在网络上下载一张图片,作为素材.这是我下载的素材,至于为什么选择这张照片呢,当然不是因为自己的一些羞羞的念头啦. 二.打开Photoshop,我使用的版本是CS3(因为CS3所占的磁盘空间较小,CS4与其就有天壤之别) 三.进入PS之后,打开之前下载好的素材,图如下: 四.复制一个图层,快捷键为Ctrl+J(在每次P图之前复制一个图层是一个好习惯) 五.然后将“背景”图层的可视取消(就是点击一下“背景”图层左边的那个小眼睛) 六.使用矩形选框工具,快捷键为M,在你所想要实现翻页效果的地方

transform3D实现翻页效果

---恢复内容开始--- 闲篇 最近升级了下百度音乐,唯一的感觉就是动画效果很炫丽.我不是个对产品很敏感的人,但是这段时间观察一些大厂的产品发现现在的APP越来越重视动画效果了.大家可能没有注意过,连支付宝的一个很边缘很边缘的小角落(“财富 ->芝麻信用分 ->信用猜猜”)动画也是很炫的.随着手机硬件的增强以及广大苦逼程序员的不懈努力与钻研,APP的会越来越强调交互性,物理效果(UIDynamic)和动画效果(CoreAnimation)会越来越受欢迎. 准备 好吧,闲话不说了,首先跟大家坦白

Android用悬浮按钮实现翻页效果

今天给大家分享下自己用悬浮按钮点击实现翻页效果的例子. 首先,一个按钮要实现悬浮,就要用到系统顶级窗口相关的WindowManager,WindowManager.LayoutParams.那么在AndroidManifest.xml中添加权限: ? 1 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 然后,我们要对WindowManager,WindowManager.La