微信小程序实现翻效果
最近要在微信小程序里实现一个类似翻页的场景,网上翻看了多个案例无非就两种实现,第一种通过css 3d变换 动画实现,第二使用Turn.js现成库。前者实现效果一般,后者js库是基于古老的JQuery来实现的并没办法移植到小程序了里。
下面就自己调研了一下turnjs来实现小程序的简单版本
turnjs效果截图
我的实现思路:
- 排版布局,通过绝对定位方式实现书页堆叠到一起就行(随意发挥)
- 监听touchmove事件,来确定拖拽时的动态坐标
- 根据拖拽页角的位置来计算翻页的角度和大小
- 通过css transfrom来创建一个背面露出来的部分
- 通过css clip-path来切出来下页露出来的部分(这里我的实现方案和turnjs不太一致,因为我在开发过程中发现clip-path这个属性实现起来更方便)
- 最后实现自动翻页
上代码:
WXML:
-
<!-- 书页 -->
-
<view
-
wx:for="{{paper}}"
-
hidden="{{pagenum > paper.length - index - 1}}"
-
wx:key="index"
-
class="list-pape"
-
style="{{index == paper.length - pagenum - 1 ? clipPath1 : ''}}"
-
catchtouchstart="touchstart"
-
catchtouchmove="touchmove"
-
catchtouchend="touchend">
-
<image src="{{item}}"></image>
-
</view>
-
<!-- 背面部分 -->
-
<view class="page-back" style="{{transformCss}};{{clipPath2}};{{transformOrigin}}">
-
<image src="{{pageBackImage1}}"></image>
-
</view>
JS(核心代码):
-
touchmove(e){
-
let clientX = e.touches[0].clientX;
-
let clientY = e.touches[0].clientY;
-
this.flippingPage(clientX,clientY);
-
},
-
//计算翻书效果
-
flippingPage(clientX,clientY){
-
// 本人比较懒,这里写死了书的宽度和高度
-
let width = 287;
-
let height = 450;
-
-
let x = width - clientX;
-
let y = height - clientY;
-
-
let a = ((x/2 * x/2) (y/2 * y/2)) / (x/2);
-
let b = ((x/2 * x/2) (y/2 * y/2)) / (y/2);
-
a = a > width ? width : a;
-
-
let angle = (Math.atan(a / b) * (180 / Math.PI));
-
angle = 180 - angle * 2;
-
-
this.setData({
-
pageBackImage: this.data.paper[this.data.paper.length - this.data.pagenum - 1],
-
transformCss: 'transform: rotateX(180deg) rotateZ(' angle 'deg)',
-
transformOrigin: 'transform-origin: right ' (height - b) 'px',
-
clipPath2: 'clip-path: polygon(100% 100%, ' (width-a) 'px 100%, 100% ' (height - b) 'px)',
-
clipPath1: 'clip-path: polygon(0% 0%, 0% 100%, ' (width-a) 'px 100%, 100% ' (height - b) 'px, 100% 0%)',
-
})
-
},
解释下这里的计算逻辑:
- 这里的clipPath1是示例图1的露出部分的裁剪区域,实现这里效果,其实就是对上一页的(p1-p2-p3-p4-p5)坐标的裁剪
- 那剩下的关键就是算出O-P3和O-P4的距离(三角函数自行推导)
- 最后得出P1-P5的所有坐标,所得样式为: 'clip-path: polygon(p1,p2,p3,p4,p5)'
- 这里的clipPath2是示例图2的背面部分的裁剪区域
- 这里做红色背面部分其实也是对上一页进行 (镜像 - 旋转 - 裁剪) 所得
- 旋转角度为:2倍的∠ap4p3
- 裁剪区域为红色区 a-p4-p3
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfigee
系列文章
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13