微信小程序手勢沖突?不存在的!

原生的應用經常會有頁面嵌套列表,滾動列表能夠改變列表大小,然后還能支持列表內下拉刷新等功能。看了很多的小程序好像都沒有這個功能,難道這個算是原生獨享的嗎,難道是由于手勢沖突無法實現嗎,冷靜的思考了一下,又看了看小程序的手勢文檔(文檔地址),感覺我又行了。

實現效果如下:

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.pswp.cn/news/711614.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711614.shtml
英文地址,請注明出處:http://en.pswp.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…