turnjs fabricjs canvas 翻书
最近做了一个翻书效果的项目, 来总结一下实现过程和遇到的一些问题, 供自己以后快速解决问题, 希望也能帮到同样遇到此类问题的同学, 如果有更好的方法,希望你能分享给我
git地址
插件:
Turn.js, Fabric.js, Touch.js, jQuery.js, jQuery-ui.js, ES6-Promise
问题都是些自己觉的比较难解决的, 比较片面, 如有其他疑问可以留言交流或者Bing
Turn.js
当你从Turn官网下载下来文件后它里面会提供5种事例代码, 根据需求我用的是docs, 先看一段简单的事例代码:
- HTML
<div id="flipbook"></div>
- JS
$('#flipbook').turn({
width: width,
height: height,
pages: length,
autoCenter: true,
when: { // 处理事件
missing: function(e, pages) { // e:(event), pages:(type:arr,需要添加的页数)
var book = $(this)
pages.forEach(function(item, i) {
addPage(item, i, data)
})
}
}
})
把你的内容放在flipbook下面, 然后通过turn(object)来初始化你的数据, 当然你也可以使用DOM添加数据, 然后再初始化数据.区别可能是通过missing事件监听可以及时知道数据变化, 而通过DOM则不能(只是猜想没有验证).
Fabric.js
这里每一页内容都是由图片, 文字, 线段组成的, 所以用了canvas.
第一个问题是背景平铺问题, 因为在Fabric文档中好像不支持背景平铺, 也可能是我没有找到, 所以就用了这种方式, 直接给画布加背景:
$('#canvas').css({
'background-image':'url(' + url + ')',
'background-size': 'size'
})
第二个问题是绘制贝塞尔曲线问题, 在绘制贝塞尔曲线用的是Path方法, 先看段代码:
var path = new fabric.Path('C43,128,28,143,17,153C14,156,12,158,12,158z', {
opacity: .5, // 线条透明度
stroke: '#e4393c', // 颜色
strokeLineCap: 'round', // 线头样式
strokeWidth: 3, // 线宽
fill: false, // 填充透明
strokeLineJoin: 'round' // 交点样式
})
canvas.add(path) // 添加到canvas上
你可以通过这种方式来加曲线, 其实完整写法是new Path('M0,0L100,100C50,50,60,60,70,70z', {})
其中字母也可以小写, 逗号可以用空格代替或者短横线, 应该也支持其他的(我没试过)M代表将点移动那里然后L画出一条线, C代表开始画贝塞尔曲线, 是三次贝赛尔曲线(还有二次的,不知道Bing下), 三次贝塞尔曲线需要4个点来控制, 第一个点就是代码里面的(100,100), 紧接着是第一个控制点(50,50), 第二个控制点(60,60), 最后一个点(70,70)结束点z封闭一下. 你想在C后面加8个数? 别试了, 我试过没用. 在绘制过程中你会发现绘制出来的曲线总是首尾相连,如果不合需求你在绘制的最后就不能加z, 同时把fill设置为false.
第三个问题是层级问题, 你想文字在图片上面, 你想小的logo在最顶部但是往往绘制出来并不是你想要的效果, 这是因为图片和logo大部分都是图片, 请求是异步的, 你把异步拿来的图片画上去设置zindex并不能达到预期的效果, 先看代码:
var stepCounter = {}, layerArr = [], promiseArr = []
function adjustment(canvas, img, index) {
var obj = new Object()
obj.canvas = canvas
obj.img = img
obj.index = index
return obj
}
function draw() {
var promise = new Promise(function(res, rej) {
var img = new Image()
stepCounter[num] += 1
img.src = url
img.onload = function() {
res(img)
}
})
promise.then(function(img) {
Img = new fabric.Image(img, {
... // 设置一些属性
})
canvas.add(Img)
obj = adjustment(canvas, Img, -50)
layerArr.push(obj)
promiseArr.push(promise)
})
}
setTimeout(function() {
if (stepCounter[i] == promiseArr.length) {
Promise.all(promiseArr).then(function() {
layerArr.sort(function(a, b) {
return a.index - b.index
})
layerArr.forEach(function(item, i) {
var c = item.canvas
c.moveTo(item.img, i)
c.renderAll()
})
})
return
}
setTimeout(arguments.callee, 50)
}, 50)
整体思路是这样的:
- 用
Promise加载图片, 同时将promisepush到数组promiseArr中, 可以用来判断图片是否都下载完和做对比判断. - 假设第一页有20个图片, 每创建一个
Promise就在stepCounter中对应的属性记录一下, 对比判断. - 把图片的
zIndex和一些必要信息放在一个数组中(layerArr), 图片下载完调整zIndex.
最后用setTimeout检测当页绘制的图片与promise.length是否相同, 相同就证明所有图片都在加载中, 再用Promise.all()确定图片加载完成后就可以调整图片的zIndex了, 我参考了stackoverflow0, stackoverflow1, 考虑到Promise的兼容性, 需要引入ES6-Promise
翻书区域
用了Touchjs模拟, 就不多说了, 很简单.
分享
原来用的是jiathis分享, https后不能用了, 可能是不支持.
var qzone = 'http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url={url}&title={title}&pics={pic}&summary={content}';
var sina = 'http://service.weibo.com/share/share.php?url={url}&title={title}&pic={pic}&searchPic=false';
var weixin = 'http://qr.liantu.com/api.php?text={url}';
所以直接调接口自己写了个
turnjs fabricjs canvas 翻书的更多相关文章
- winrt 上的翻书特效组件 源码分享 转载请说明
http://blog.csdn.net/wangrenzhu2011/article/details/10207413 (转) [TemplatePart(Name = A_PARTNAME, Ty ...
- turn.js实现翻书效果
JS插件网 http://www.ijquery.cn/?p=173 描述:Turn.js 是一个轻量级的 (15kb) jQuery/html5 插件用来创建类似书本和杂志翻页效果,支持触摸屏设备. ...
- Turn.js 实现翻书效果的学习与总结
最近CTO给我分配了一个移动端H5开发的任务,主要功能是需要实现翻书效果,我听过主要需求后,当时是呀!!!接下来自己尝试使用fullPage.js和Swiper来实现翻书效果,结果效果都不是非常的理想 ...
- JQuery的turn.js实现翻书效果
前言: hello大家好~好久没更博了……今天来和大家分享下JQ的turn.js,下面我先来简单介绍下我们今天的主角turn.js. Turn.js是一个JavaScript库,它集合了HTML5的所 ...
- 翻书插件:bookblock.js
BookBlock 是一个 jQuery插件,用来制作带有翻页效果的小书册.可以用任何形式的内容,比如图像或文本.插件会在翻页时利用变形模拟手工翻页,并产生重叠的阴影以达到更逼真的效果. 基本页面 & ...
- jQuery+turn.js翻书、文档和杂志3种特效演示
很好用的一款插件jQuery+turn.js翻书.文档和杂志3种特效演示 在线预览 下载地址 实例代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...
- Unity3d:megaFierstext(翻书效果插件)
附件中是一款翻书效果插件,由于附件上传大小限制,在下载完后,需要在megaFierstext_BHYF\Assets\Resources\Textures下添加图片精灵并修改属性为Texture,即可 ...
- 基于CSS3新属性Animation及transform实现类似翻书效果
注:本实例JS部分均以原生JS编写,不善用原生JS的,可用jQuery等对三方框架改写 先上效果图:(样式有点丑,可以忽略一下下,效果出来了就好,后期加到其他项目中方便更改0.0) 类似翻书效果,原本 ...
- 【原创】jQuery插件 - Booklet翻书特效教程(一) 一般设置
jQuery插件 - Booklet翻书特效教程(一) 一般设置 本文由五月雨恋提供,转载请注明出处. 一.宽高(width/height) 1.自定义大小 $(function(){ // 自定义页 ...
随机推荐
- git命令合集
##快捷键 ##一. 快捷键 1. 清屏快捷键 control+L 2. vim快捷操作 * control+b 往上翻页 * Control+f 往下翻页 * shift+g 回到末尾 3. oh ...
- JZ-067-剪绳子
剪绳子 题目描述 给你一根长度为n的绳子,请把绳子剪成整数长的m段(m.n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],...,k[m]. 请问k[1]x... ...
- 搞懂MySQL(各种)索引类型及其区别
索引的概念介绍: 1.聚集索引 聚集索引:指索引项的排序方式和表中数据记录排序方式一致的索引 也就是说聚集索引的顺序就是数据的物理存储顺序.它会根据聚集索引键的顺序来存储表中的数据,即对表的数据按索 ...
- sklearn.preprocessing.LabelEncoder_标准化标签,将标签值统一转换成range(标签值个数-1)范围内
. LabelEncode(),标签值编码用在将一些类别型的列进行编码,方便用于训练
- Java实例变量、局部变量、静态变量
实例变量(成员变量) 成员变量定义在类中,在整个类中都可以被访问,但在方法.构造方法和语句块之外 当一个对象被实例化之后,每个实例变量的值就跟着确定 实例变量在对象创建的时候创建,在对象被销毁时销毁 ...
- C++设计模式 - 备忘录模式(Memento)
状态变化模式 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?"状态变化"模式为这一问题提供了一种解决方案. 典型模式 Sta ...
- 超详细GoodSync11.2.7.8单机、两个服务器之间的文件同步使用教程
GoodSync安装教程 第一步:双机GoodSync_v11.2.7.8.exe文件 链接:https://pan.baidu.com/s/16FVater4f9vu07QiGGIK9A 提取码:b ...
- 同一局域网ping ip 失败(可能是你的路由器坑了你)
事件起源:手机需要通过fiddler代理抓包 一顿操作猛如虎,手机输入ip+端口,芭比q了,连接不上.. 解决思路: 一.保证双方处于同一局域网内 二.查看电脑配置,找到 防火墙,关闭防火墙,再试 三 ...
- First Note
第一篇博客 入驻博客园.
- vue学习过程总结(02)- 网上开源项目vue-element-admin的启动
1.功能丰富的项目:https://github.com/PanJiaChen/vue-element-admin.git 因为我配置的时候,遇到许多的问题,用了一天半才启动的,所以安着他文档一步一步 ...