当前位置: 首页 > news >正文

微信小程序翻书效果

微信小程序翻书效果

wxml

<viewwx:for="{{imgList}}" hidden="{{pagenum > imgList.length - index - 1}}"wx:key="index"class="list-pape" style="{{index == imgList.length - pagenum - 1 ? clipPath1 : ''}}"bindtouchstart="touchstart"bindtouchmove="touchmove"bindtouchend="touchend"><image src="{{item}}" mode="aspectFit"  data-src="{{item}}"  bindtap="previewImage"></image></view><!-- 背面部分 --><view wx:if="{{transformCss}}" class="page-back" style="{{transformCss}};{{clipPath2}};{{transformOrigin}}"><image src="{{pageBackImage}}" mode="aspectFit"></image></view>

js

data:{imgList:[ ],pageBackImage: '',transformCss: '', transformOrigin: '',clipPath2: '',clipPath1: '',pagenum: 0,startPoint: 0, //记录滑动的初始位置slipFlag: false, //定义 滑动事件 节流阀, 防止一次滑动触发多次滑动事件imgboxh: 0,imgboxw: 0,
}
touchstart:function(e) {this.setData({startPoint: e.touches[0],slipFlag: true})},touchmove:function(e) {let clientX = e.touches[0].clientX;let clientY = e.touches[0].clientY;if (((this.data.startPoint.clientX - clientX) > 80) && this.data.slipFlag) {console.log("左滑事件");this.setData({slipFlag: false})this.next()} else if (((this.data.startPoint.clientX - clientX) < -80) &&  this.data.slipFlag) {console.log("右滑事件");this.setData({slipFlag: false})this.prev()}},touchend:function() {this.setData({pageBackImage: this.data.imgList[this.data.imgList.length - this.data.pagenum - 1],transformCss: '', transformOrigin: '',clipPath2: 'clip-path: polygon(100% 100%, 100% 100%, 100% 100%)',clipPath1: '',})},//计算翻书效果flippingPage:function(clientX,clientY){// 本人比较懒,这里写死了书的宽度和高度let width = this.data.imgboxw; let height = this.data.imgboxh;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.imgList[this.data.imgList.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%)',})},animate1(callback) {let clientX = this.data.imgboxw;let clientY = this.data.imgboxh;let timer = setInterval(() => {clientX -= 30;clientY -= 1;if (clientX < -this.data.imgboxw) {clientX = -this.data.imgboxw;clientY = this.data.imgboxh-1;this.flippingPage(clientX, clientY)clearInterval(timer);this.setData({transformCss: '', transformOrigin: '',clipPath2: 'clip-path: polygon(100% 100%, 100% 100%, 100% 100%)',clipPath1: '',})callback && callback();}this.flippingPage(clientX, clientY)}, 20);},animate2(callback) {let clientX = -this.data.imgboxw;let clientY = this.data.imgboxh;let timer = setInterval(() => {clientX += 30;clientY -= 1;if (clientX > this.data.imgboxw) {clientX = this.data.imgboxw;clientY = this.data.imgboxh-1;this.flippingPage(clientX, clientY)clearInterval(timer);this.setData({transformCss: '', transformOrigin: '',clipPath2: 'clip-path: polygon(100% 100%, 100% 100%, 100% 100%)',clipPath1: '',})callback && callback();}this.flippingPage(clientX, clientY)}, 20);},toHomePage() {this.setData({pagenum: 0})},toLastPage() {this.setData({pagenum: this.data.imgList.length - 1})},next() {let pagenum = this.data.pagenumif (pagenum > this.data.imgList.length - 2) return;this.animate1(() => {this.data._timer = setTimeout(()=>{clearTimeout(this.data._timer)pagenum++;this.setData({pagenum,clipPath1: ''})},0)})},prev() {let pagenum = this.data.pagenumif (pagenum <= 0) return;pagenum--;this.setData({pagenum,})this.animate2(() => {})},

css

.imgbox {width: 100%;position: relative;transform-style: preserve-3d;overflow: hidden;height: calc(100% - 170px);padding: 40rpx 0;background-color: #000000;
}
.list-pape,
.page-back {overflow: hidden;width: 100%;height: calc(100% - 80rpx);position: absolute;left: 0;top: 40rpx;/* box-shadow: 3px 0px 8px 0px #0000004d; */
}
.list-pape image,
.page-back image {width: 100%;height: 100%;
}.page-back {transform-origin: right bottom;pointer-events: none;filter: contrast(0.4);
}

文章转载自:
http://abreact.aaladrg.cn
http://bahai.aaladrg.cn
http://agp.aaladrg.cn
http://bumpety.aaladrg.cn
http://cardamom.aaladrg.cn
http://autostability.aaladrg.cn
http://carborne.aaladrg.cn
http://carrom.aaladrg.cn
http://atechnic.aaladrg.cn
http://chipmuck.aaladrg.cn
http://asepticism.aaladrg.cn
http://catchwater.aaladrg.cn
http://budgeteer.aaladrg.cn
http://chrisom.aaladrg.cn
http://amateurism.aaladrg.cn
http://blackness.aaladrg.cn
http://antiphonary.aaladrg.cn
http://barleycorn.aaladrg.cn
http://cg.aaladrg.cn
http://canonise.aaladrg.cn
http://abetment.aaladrg.cn
http://cesti.aaladrg.cn
http://capon.aaladrg.cn
http://catgut.aaladrg.cn
http://bipod.aaladrg.cn
http://character.aaladrg.cn
http://angular.aaladrg.cn
http://cerotype.aaladrg.cn
http://brimful.aaladrg.cn
http://cackle.aaladrg.cn
http://www.dtcms.com/a/280784.html

相关文章:

  • 面试遇到的问题
  • 服务器上PHP环境安装与更新版本和扩展(安装PHP、Nginx、Redis、Swoole和OPcache)
  • 如何解决服务器频繁重启的问题?
  • Linux修改ssh默认端口,禁止root登录,禁止密码登录并同时开启公钥认证
  • session与cookie的区别
  • 55 个热门网络面试问题及答案
  • KMP (Knuth-Morris-Pratt) 算法详解
  • UE5多人MOBA+GAS 23、制作一个地面轰炸的技能
  • NE综合实验3:链路聚合、VLAN与Trunk、STP、DHCP、OSPF及PPP整合部署
  • Redis 数据持久化
  • 渲染设计图的空间革命:可视化技术如何重塑设计决策
  • WPF中ListView控件详解
  • 阿里云ssh证书过期,如果更换并上传到服务器
  • 3D数据:从数据采集到数据表示,再到数据应用
  • 服务器、花生壳一个端口部署前后端分离项目
  • 微算法科技技术突破:用于前馈神经网络的量子算法技术助力神经网络变革
  • 从基础到进阶:MyBatis-Plus 分页查询封神指南
  • 暑期算法训练.1
  • redis的安装
  • 【Docker基础】Dockerfile指令速览:高级构建指令详解
  • Flink Watermark原理与实战
  • [Pytest][Part 5]单条测试和用例集测试
  • 工业喷涂机器人的革新:艾利特协作机器人引领人机交互新纪元
  • 基于强化学习的智能体设计与实现:以CartPole平衡任务为例
  • 物联网系统中“时序数据库(TSDB)”和“关系型数据库(RDBMS)”
  • GD32VW553-IOT LED呼吸灯项目
  • 软考高级网络规划设计师2009-2024历年真题合集下载
  • AWS中国区资源成本优化全面指南:从理论到实践
  • 板凳-------Mysql cookbook学习 (十一--------11)
  • QT——QComboBox组合框控件