当前位置: 首页 > 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://www.lryc.cn/news/588641.html

相关文章:

  • 《汇编语言:基于X86处理器》第8章 高级过程(1)
  • 基于UDP/IP网络游戏加速高级拥塞控制算法(示意:一)
  • 力扣-使用双指针的方法的题们(持续更新中。。。
  • 一、CV_图像分类简介
  • Typecho插件开发:优化文章摘要处理短代码问题
  • 基于redis的分布式锁 lua脚本解决原子性
  • 银河麒麟服务器版挂载镜像文件
  • sqli-labs靶场通关笔记:第18-19关 HTTP头部注入
  • exe直接传输会导致文件损坏
  • 【html常见页面布局】
  • AI应用服务
  • Axios 完整功能介绍和完整示例演示
  • 分布式全局唯一ID生成:雪花算法 vs Redis Increment,怎么选?
  • gRPC实战指南:像国际快递一样调用跨语言服务 —— 解密Protocol Buffer与HTTP/2的完美结合
  • TCP可靠性设计的核心机制与底层逻辑
  • Java基础(八):封装、继承、多态与关键字this、super详解
  • Java全栈工程师面试实录:从电商系统到AIGC的层层递进
  • 通用综合文字识别联动 MES 系统:OCR 是数据流通的核心
  • 在百亿流量面前,让“不存在”无处遁形——Redis 缓存穿透的极限攻防实录
  • 【Ubuntu22.04】repo安装方法
  • 1.2 vue2(组合式API)的语法结构以及外部暴露
  • 如何把手机ip地址切换到外省
  • 【深度学习优化算法】06:动量法
  • 从springcloud-gateway了解同步和异步,webflux webMvc、共享变量
  • iOS V2签名网站系统源码/IPA在线签名/全开源版本/亲测
  • iOS 抓包工具精选对比:不同调试需求下的工具适配策略
  • 项目总体框架(servlet+axios+Mybatis)
  • 【解决】联想电脑亮度调节
  • iOS高级开发工程师面试——多线程
  • Axios 和 Promise 区别对比