微信小程序手势冲突?不存在的!

原生的应用经常会有页面嵌套列表,滚动列表能够改变列表大小,然后还能支持列表内下拉刷新等功能。看了很多的小程序好像都没有这个功能,难道这个算是原生独享的吗,难道是由于手势冲突无法实现吗,冷静的思考了一下,又看了看小程序的手势文档(文档地址),感觉我又行了。

实现效果如下:

a.gif

页面区域及支持手势

  • 红色的是列表未展开时内容展示,无手势支持
  • 绿色部分是控制部分,支持上拉下拉手势,对应展开列表及收起列表
  • 蓝色列表部分,支持上拉下拉手势,对应展开列表,上拉下拉刷新等功能
  • 浅蓝色部分是展开列表后的小界面内容展示,无手势支持

原理实现

主要是根据事件系统的事件来自行处理页面应当如何响应,原理其实同原生的差不多。
主要涉及 touchstart、touchmove、touchend、touchcancel 四个

另外的scrollview的手势要借助于 scroll-y、refresher-enable 属性来实现。

之后便是稀疏平常的数学加减法计算题环节。根据不同的内容点击计算页面应当如何绘制显示。具体的还是看代码吧,解释起来又要吧啦吧啦了。

Talk is cheap, show me the code

代码部分

wxml

<!--index.wxml-->
<view><view class="header" style="opacity: {{headerOpacity}};height:{{headerHeight}}px;"></view><view class="toolbar"data-type="toolbar"style="bottom: {{scrollHeight}}px;height:{{toolbarHeight}}px;"catch:touchstart="handleToolbarTouchStart"catch:touchmove="handleToolbarTouchMove"catch:touchend="handleToolbarTouchEnd"catch:touchcancel="handleToolbarTouchEnd"></view><scroll-view class="scrollarea" type="list"scroll-y="{{scrollAble}}"refresher-enabled="{{scrollAble}}"style="height: {{scrollHeight}}px;"bind:touchstart="handleToolbarTouchStart"bind:touchmove="handleToolbarTouchMove"bind:touchend="handleToolbarTouchEnd"bind:touchcancel="handleToolbarTouchEnd"bindrefresherrefresh="handleRefesh"refresher-triggered="{{refreshing}}"><view class="item" wx:for="{{[1,2,3,4,5,6,7,8,9,0,1,1,1,1,1,1,1]}}"></view></scroll-view><view class="mini-header"style="height:{{miniHeaderHeight}}px;"wx:if="{{showMiniHeader}}"></view>
</view>

ts

// index.ts
// 获取应用实例
const app = getApp<IAppOption>()Component({data: {headerOpacity: 1,scrollHeight: 500,windowHeight: 1000,isLayouting: false,showMiniHeader: false,scrollAble: false,refreshing: false,toolbarHeight: 100,headerHeight: 400,miniHeaderHeight: 200,animationInterval: 20,scrollviewStartY: 0,},methods: {onLoad() {let info = wx.getSystemInfoSync()this.data.windowHeight = info.windowHeightthis.setData({scrollHeight: info.windowHeight - this.data.headerHeight - this.data.toolbarHeight})},handleToolbarTouchStart(event) {this.data.isLayouting = truelet type = event.currentTarget.dataset.typeif (type == 'toolbar') {} else {this.data.scrollviewStartY = event.touches[0].clientY }},handleToolbarTouchEnd(event) {this.data.isLayouting = falselet top = this.data.windowHeight - this.data.scrollHeight - this.data.miniHeaderHeight - this.data.toolbarHeightif (top > (this.data.headerHeight - this.data.miniHeaderHeight) / 2) {this.tween(this.data.windowHeight - this.data.scrollHeight, this.data.headerHeight + this.data.toolbarHeight, 200)} else {this.tween(this.data.windowHeight - this.data.scrollHeight, this.data.miniHeaderHeight + this.data.toolbarHeight, 200)}},handleToolbarTouchMove(event) {if (this.data.isLayouting) {let type = event.currentTarget.dataset.typeif (type=='toolbar') {this.updateLayout(event.touches[0].clientY + this.data.toolbarHeight / 2)} else {if (this.data.scrollAble) {return} else {this.updateScrollViewLayout(event.touches[0].clientY)}}}},handleRefesh() {let that = thissetTimeout(() => {that.setData({refreshing: false})}, 3000);},updateLayout(top: number) {if (top < this.data.miniHeaderHeight + this.data.toolbarHeight) {top = this.data.miniHeaderHeight + this.data.toolbarHeight} else if (top > this.data.headerHeight + this.data.toolbarHeight) {top = this.data.headerHeight + this.data.toolbarHeight}let opacity = (top - (this.data.miniHeaderHeight + this.data.toolbarHeight)) / (this.data.miniHeaderHeight + this.data.toolbarHeight)let isReachTop = opacity == 0 ? true : falsethis.setData({scrollHeight: this.data.windowHeight - top,headerOpacity: opacity,showMiniHeader: isReachTop,scrollAble: isReachTop})},updateScrollViewLayout(offsetY: number) {let delta = offsetY - this.data.scrollviewStartYif (delta > 0) {return}delta = -deltaif (delta > this.data.headerHeight - this.data.miniHeaderHeight) {delta = this.data.headerHeight - this.data.miniHeaderHeight}let opacity = 1 - (delta) / (this.data.headerHeight - this.data.miniHeaderHeight)let isReachTop = opacity == 0 ? true : falsethis.setData({scrollHeight: this.data.windowHeight - this.data.headerHeight - this.data.toolbarHeight + delta,headerOpacity: opacity,showMiniHeader: isReachTop,scrollAble: isReachTop})},tween(from: number, to: number, duration: number) {let interval = this.data.animationIntervallet count = duration / intervallet delta = (to-from) / countthis.tweenUpdate(count, delta, from)},tweenUpdate(count: number, delta: number, from: number) {let interval = this.data.animationIntervallet that = thissetTimeout(() => {that.updateLayout(from + delta)if (count >= 0) {that.tweenUpdate(count-1, delta, from + delta)}}, interval);}},
})

less

/**index.less**/
.header {height: 400px;background-color: red;
}
.scrollarea {position: fixed;left: 0;right: 0;bottom: 0;background-color: blue;
}
.toolbar {height: 100px;position: fixed;left: 0;right: 0;background-color: green;
}
.mini-header {position: fixed;top: 0;left: 0;right: 0;height: 200px;background-color: cyan;
}
.item {width: 670rpx;height: 200rpx;background-color: yellow;margin: 40rpx;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/711614.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Google验证码,扫描绑定,SpringBoot+ vue

文章目录 后端1.使用Google工具类这个 类的 verifyTest 方法可以判断扫描绑定之后的app上面验证码的准确性。这个类通过g_user,g_code(就是谷歌验证器的secret,这个你已经插入到数据库 中)来生成相关二维码。2.用工具类自带的g_user,g_code来生成二维码2.1通过请求来生成相关二…

你知道vector底层是如何实现的吗?

你知道vector底层是如何实现的吗&#xff1f; vector底层使用动态数组来存储元素对象&#xff0c;同时使用size和capacity记录当前元素的数量和当前动态数组的容量。如果持续的push_back(emplace_back)元素&#xff0c;当size大于capacity时&#xff0c;需要开辟一块更大的动态…

【InternLM 实战营笔记】XTuner 大模型单卡低成本微调实战

XTuner概述 一个大语言模型微调工具箱。由 MMRazor 和 MMDeploy 联合开发。 支持的开源LLM (2023.11.01) InternLM Llama&#xff0c;Llama2 ChatGLM2&#xff0c;ChatGLM3 Qwen Baichuan&#xff0c;Baichuan2 Zephyr 特色 傻瓜化&#xff1a; 以 配置文件 的形式封装了大…

WebGIS----wenpack

学习资料&#xff1a;https://webpack.js.org/concepts/ 简介&#xff1a; Webpack 是一个现代化的 JavaScript 应用程序的模块打包工具。它能够将多个 JavaScript 文件和它们的依赖打包成一个单独的文件&#xff0c;以供在网页中使用。 Webpack 还具有编译和转换其他类型文…

自学新标日第六课(单词部分 未完结)

第六课 单词 单词假名声调词义来月らいげつ1下个月先月せんげつ1上个月夜中よなか3午夜昨夜ゆうべ0昨天晚上コンサートこんさーと1音乐会クリスマスくりすます3圣诞季誕生日たんじょうび&#xff13;生日こどもの日こどものひ&#xff15;儿童节夏休みなつやすみ&#xff13;…

看待事物的层与次 | DBA与架构的一次对话交流

前言 在计算机软件业生涯中,想必行内人或多或少都能感受到系统架构设计与数据库系统工程的重要性,也能够清晰地认识到在计算机软件行业中技术工程师这个职业所需要的专业素养和必备技能! 背景 通过自研的数据库监控管理工具,发现 SQL Server 数据库连接数在1-2K之间,想…

Yii2中如何使用scenario场景,使rules按不同运用进行字段验证

Yii2中如何使用scenario场景&#xff0c;使rules按不同运用进行字段验证 当创建news新闻form表单时&#xff1a; 添加新闻的时候执行create动作。 必填字段&#xff1a;title-标题&#xff0c;picture-图片&#xff0c;description-描述。 这时候在model里News.php下rules规则…

星座每日运势 api接口

接口数据api 接口平台&#xff1a;https://api.yuanfenju.com/ 开发文档&#xff1a;https://doc.yuanfenju.com/zhanbu/yunshi.html 支持格式&#xff1a;JSON 请求方式&#xff1a;HTTP POST <?php//您的密钥 $api_secret "wD******XhOUW******pvr"; //请…

利用coze 搭建“全功能“微信客服(2)

紧跟上篇 利用coze 搭建"全功能"微信客服&#xff08;1&#xff09;&#xff0c;不知道来龙去脉自行查阅 先表扬下coze: coze 是国内少数开放平台之一&#xff0c;里面提供各种插件还可以开发工作流&#xff0c;让你可以实现多模态全功能大模型 吐槽 没有API开放接口…

国外最流行的是AI,国内最流行的是AI培训教程

国外最流行的是AI&#xff0c;国内最流行的是AI培训教程。 最近李一舟AI教程事件&#xff0c;验证了这句话。 如今给客户做方案项目里能加点AI色彩&#xff0c;立项的成功率都变大(特别是事业单位)。 正因如此&#xff0c;大家都在狂补AI的知识&#xff0c;不然肚子里没点墨水&…

2024亚马逊全球开店注册前需要准备什么?

在2023年出海四小龙SHEIN、Temu、速卖通AliExpress、TikTok Shop快速增长扩张&#xff0c;成为了中国跨境卖家“逃离亚马逊”的新选择。但是&#xff0c;跨境电商看亚马逊。当前&#xff0c;亚马逊仍然是跨境电商行业的绝对老大&#xff0c;占有将近70%成以上的业务份额。 作为…

threejs显示本地硬盘上的ply文件,通过webapi

由于ply文件是第三方提供的&#xff0c;threejs无法用绝路路径的方式显示ply 所以想通过webapi把ply通过url地址的方式给threejs 1.webapi部分 /// <summary>/// 获取PLY文件/// </summary>/// <returns></returns>[HttpPost(Name "GetPly&qu…

分享fastapi低级错误

我是创建表的时候把__tablename__ 写成__table__然后一直报这个错误

Android Activity跳转详解

在Android应用程序中&#xff0c;Activity之间的跳转是非常常见的操作&#xff0c;通过跳转可以实现不同界面之间的切换和交互。在本篇博客中&#xff0c;我们将介绍Android中Activity跳转的相关知识&#xff0c;包括基本跳转、传递参数、返回数据以及跳转到浏览器、拨号应用和…

端游如何防破解

在2023年这个游戏大年中&#xff0c;诸多热门大作涌现&#xff0c;作为世界级IP哈利哈利波特的衍生游戏——《霍格沃茨之遗》毫无悬念地成为2023年游戏圈的首款爆款作品&#xff0c;斩获了一众玩家的青睐。 在众多光环的加持下&#xff0c;《霍格沃茨之遗》很快被著名游戏破解…

【每日前端面经】2024-03-01

题目来源: 牛客 MVVM怎么实现 MVVM分别指View、Model、ViewModel&#xff0c;View通过View-Model的DOM监听器将事件绑定到Model上&#xff0c;而Model则通过Data Bindings来管理View中的数据&#xff0c;View-Model从中起到一个连接的作用 响应式: vue如何监听data的属性变化…

深入 Starknet 去中心化世界,探秘实用开发利器

Starknet 近期开放空投&#xff0c;面向 130 万地址总量发放超 7 亿枚 Token&#xff0c;让 ECMP 早期贡献者、GitHub 开源开发者、Starknet 用户等各个层面的生态参与者都得以深度参与。 盛宴的背后&#xff0c;是 Starknet 正迎来发展的关键机遇。在今年以太坊坎昆升级的背景…

从别人的开源项目学习并吸收经验,然后逐步搭建自己的Java项目是一个很好的学习方法

从别人的开源项目学习并吸收经验&#xff0c;然后逐步搭建自己的Java项目是一个很好的学习方法。以下是一些建议的步骤&#xff0c;帮助你从0开始搭建并不断完善自己的Java项目&#xff0c;直至达到高可靠、高稳定、高并发、高数据安全&#xff0c;并可以拆分为微服务的大型高质…

【漏洞复现】某厂商上网行为管理系统static_convert命令执行漏洞

Nx01 产品简介 天融信上网行为管理系统是天融信公司凭借多年来的安全产品研发经验&#xff0c;为满足各行各业进行网络行为管理和内容审计的专业产品。 Nx02 漏洞描述 天融信上网行为管理系统老版本static_convert.php接口存在RCE漏洞&#xff0c;攻击者利用此漏洞可以获取服务…

超强预测算法:XGBoost预测模型

目录 往期精彩内容&#xff1a; 多变量特征序列、单序列数据预测实战 前言 1 风速数据预处理与数据集制作 1.1 导入数据 1.2 多变量数据预处理与数据集制作 1.3 单序列数据预处理与数据集制作 2超强模型XGBoost——原理介绍 3 模型评估和对比 3.1 随机森林预测模型 3…