微信小程序實現拖拽的小球

????????

目錄

前言?

js?

獲取微信小程序中獲取系統信息

觸摸移動事件的處理函數

觸摸結束事件的處理函數

?用于監聽頁面滾動事件

全局參數?

html

CSS


前言?

小程序開發提供了豐富的API和事件處理函數,使得開發者可以方便地實現各種交互功能。其中,拖拽功能是一個在許多應用場景中常見的需求,例如拖拽按鈕、拖拽圖片等。本文將介紹一個小程序頁面中實現拖拽移動元素的功能的代碼示例,并解析其實現原理。

js?

這段代碼主要是一個小程序頁面中實現了拖拽移動元素的功能。具體解釋如下:

  1. getSysdata?函數:該函數使用?wx.getSystemInfo?方法獲取系統的相關信息,如窗口寬度和高度,并將其存儲到?that.data.window?數組中。之后根據一定的比例計算出一個定位值?write,再通過?that.setData?方法將?write?設置為頁面的數據,在回調函數中使用?wx.createSelectorQuery?方法獲取元素的寬度和高度,存儲到?that.data.writesize?數組中。

  2. touchmove?函數:該函數是拖拽過程中觸發的事件處理函數。通過獲取觸摸點的坐標減去元素寬度和高度的一半,再減去頁面的滾動距離,得到當前元素的位置。然后判斷該位置是否超出屏幕范圍,如果超出則將位置設置為邊界值。最后通過?that.setData?方法將最新的位置信息存儲到頁面數據中。

  3. onPageScroll?函數:該函數用于監聽頁面滾動事件,并將滾動距離存儲到?this.data.scrolltop?中。

  4. touchend?函數:該函數是拖拽結束時觸發的事件處理函數。首先獲取當前元素的位置和窗口的寬度、高度以及元素的大小。如果當前位置在屏幕的左、右、上、下邊緣處,則直接返回,不執行回到邊緣的邏輯。否則,通過計算最近的水平邊緣和垂直邊緣的位置,并判斷最近的邊緣是水平邊緣還是垂直邊緣,將元素位置設置為最近邊緣的位置。最后通過?that.setData?方法將最新的位置信息存儲到頁面數據中。

獲取微信小程序中獲取系統信息

這段代碼是一個小程序(微信小程序)中的 JavaScript 代碼段,用于獲取系統信息和元素尺寸,并做一些相關的計算和操作。具體來說,它執行以下操作:

  1. 首先,定義了一個函數?getSysdata,這個函數似乎是用來獲取系統信息和元素尺寸的。

  2. 在函數內部,通過調用?wx.getSystemInfo?函數來獲取系統信息。這個函數的結果會在?success?回調函數中被處理。

  3. 在?success?回調函數中,將獲取到的系統窗口寬高(windowWidth?和?windowHeight)存儲在?that.data.window?數組中。

  4. 接下來,根據一定的邏輯計算得到一個名為?write?的數組,其中?write[0]?是系統窗口寬度的某個百分比(that.data.writePosition[0])以像素為單位的值,而?write[1]?則是系統窗口高度的某個百分比(that.data.writePosition[1])以像素為單位的值。

  5. 使用?that.setData?函數來更新小程序的數據,將?write?數組設置為新的數據。在這里還提供了一個回調函數,在這個回調函數中執行如下操作:

    • 使用?wx.createSelectorQuery()?創建一個查詢對象。
    • 使用?.select(".kefuBtn")?選擇頁面中類名為?.kefuBtn?的元素。
    • 調用?.boundingClientRect?方法獲取該元素的寬度和高度,并將結果存儲在?that.data.writesize?數組中。
    • 最后,通過調用?.exec()?執行上述查詢操作。

總之,這段代碼用于在微信小程序中獲取系統信息(窗口尺寸)和特定元素的尺寸,并進行一些相關的計算和操作,可能是為了適應不同尺寸的設備和顯示效果。

getSysdata: function () {var that = this;wx.getSystemInfo({success: function (e) {that.data.window = [e.windowWidth, e.windowHeight];var write = [];write[0] = (that.data.window[0] * that.data.writePosition[0]) / 100;write[1] = (that.data.window[1] * that.data.writePosition[1]) / 100;console.log(write, 45);that.setData({write: write,},function () {// 獲取元素寬高wx.createSelectorQuery().select(".kefuBtn").boundingClientRect(function (res) {console.log(res.width);that.data.writesize = [res.width, res.height];}).exec();});},fail: function (e) {console.log(e);},});},

觸摸移動事件的處理函數

這段代碼是一個用來處理觸摸移動事件的函數。當用戶在頁面上進行觸摸移動操作時,該函數會被觸發。

代碼中的各個部分的功能如下所示:

  1. 首先,通過var that = this;將當前上下文的this對象賦值給變量that,以確保在后續的代碼中能夠正確訪問到頁面的數據。

  2. 然后,通過e.touches[0].pageXe.touches[0].pageY獲取當前觸摸點相對于頁面的水平和垂直位置,并將其分別存儲在數組position的第一個和第二個元素中。同時,通過減去寫作框的寬度的一半(that.data.writesize[0] / 2)和減去垂直滾動的偏移量(this.data.scrolltop)來調整寫作框的中心位置。

  3. 接下來,通過that.data.window[0]that.data.window[1]分別獲取屏幕的寬度和高度,以便后續判斷寫作框是否超出屏幕范圍。

  4. 使用條件語句判斷寫作框的水平和垂直位置是否超出屏幕范圍。如果水平位置小于0,則將其設為0,以保證寫作框不會超出屏幕左側邊界。如果水平位置大于屏幕寬度減去寫作框寬度,則將其設為屏幕寬度減去寫作框寬度,以保證寫作框不會超出屏幕右側邊界。對于垂直位置,也進行了類似的判斷和限制。

  5. 最后,通過that.setData()方法將更新后的寫作框位置應用到頁面上,即將position賦值給write,以使得寫作框顯示在調整后的位置上。

綜上所述,這段代碼的主要功能是根據用戶的觸摸移動操作來調整寫作框的位置,并保證寫作框不會超出屏幕范圍。

  //開始拖拽touchmove: function (e) {var that = this;var position = [e.touches[0].pageX - that.data.writesize[0] / 2,e.touches[0].pageY - that.data.writesize[1] / 2 - this.data.scrolltop,];// 獲取屏幕寬高var windowWidth = that.data.window[0];var windowHeight = that.data.window[1];// 判斷是否超出屏幕范圍if (position[0] < 0) {position[0] = 0;} else if (position[0] > windowWidth - that.data.writesize[0]) {position[0] = windowWidth - that.data.writesize[0];}if (position[1] < 0) {position[1] = 0;} else if (position[1] > windowHeight - that.data.writesize[1]) {position[1] = windowHeight - that.data.writesize[1];}that.setData({write: position,});

觸摸結束事件的處理函數

這段代碼是一個用于處理觸摸結束事件的函數。在移動設備的觸摸屏上,當用戶的手指從屏幕上抬起時,會觸發這個事件。代碼的目的是確保用戶在寫字過程中,當觸摸結束時,字的位置會自動靠近最近的屏幕邊緣。

具體的步驟如下:

  1. 通過touchend事件處理函數來執行以下操作。

  2. 從事件對象中獲取當前寫字的位置,這個位置信息保存在position變量中。

  3. 獲取屏幕的寬度和高度,并將它們分別保存在windowWidthwindowHeight變量中。

  4. 獲取寫字區域的尺寸,這個尺寸信息保存在writesize變量中。

  5. 如果當前寫字位置已經在屏幕的左、右邊緣或上、下邊緣,那么直接返回,不執行后續的將位置回到邊緣的邏輯。

  6. 如果當前寫字位置不在邊緣,那么計算離當前位置最近的水平邊緣和垂直邊緣。

  7. 判斷最近的邊緣是水平邊緣還是垂直邊緣,通過比較寫字位置與屏幕中心的距離來決定。

  8. 如果最近的邊緣是水平邊緣,將寫字位置的水平坐標設置為最近水平邊緣的值,使得字能夠貼近水平邊緣。

  9. 如果最近的邊緣是垂直邊緣,將寫字位置的垂直坐標設置為最近垂直邊緣的值,使得字能夠貼近垂直邊緣。

  10. 最后,更新寫字位置的數據,將位置信息設置為回到邊緣后的位置。

總之,這段代碼的作用是確保在用戶停止觸摸屏幕后,寫字位置會自動靠近離它最近的屏幕邊緣,從而使得寫字的體驗更加舒適和方便。

  touchend: function (e) {var that = this;var position = that.data.write;var windowWidth = that.data.window[0];var windowHeight = that.data.window[1];var writesize = that.data.writesize;// 如果位置在屏幕左、右邊緣或上、下邊緣,直接返回,不執行回到邊緣的邏輯if (position[0] === 0 ||position[0] === windowWidth - writesize[0] ||position[1] === 0 ||position[1] === windowHeight - writesize[1]) {return;}// 如果位置不是邊緣,則自動回到最近的邊緣var closestHorizontalEdge =Math.abs(position[0] - windowWidth / 2) < Math.abs(position[0])? windowWidth - writesize[0]: 0;var closestVerticalEdge =Math.abs(position[1] - windowHeight / 2) < Math.abs(position[1])? windowHeight - writesize[1]: 0;// 檢查最近的邊緣是水平邊緣還是垂直邊緣if (Math.abs(closestHorizontalEdge - position[0]) <Math.abs(closestVerticalEdge - position[1])) {position[0] = closestHorizontalEdge;} else {position[1] = closestVerticalEdge;}that.setData({write: position,});},

?用于監聽頁面滾動事件

onPageScroll?函數:該函數用于監聽頁面滾動事件,并將滾動距離存儲到?this.data.scrolltop?中。?

  onPageScroll(e) {this.data.scrolltop = e.scrollTop;},

全局參數?

  data: {// 拖拽參數writePosition: [85, 35], //默認定位參數writesize: [0, 0], // 元素大小window: [0, 0], //屏幕尺寸write: [0, 0], //定位參數scrolltop: 0, //據頂部距離},

html
?

這段代碼是一個 HTML 的按鈕元素,在頁面上顯示為一個按鈕圖標。按鈕具有以下特性和功能:

  • open-type="contact":表示按鈕的點擊行為,當點擊按鈕時,會打開客服對話框,用戶可以與客服進行溝通。
  • bindtouchmove="touchmove"、catch:touchmove:表示當按鈕被觸摸移動時觸發 touchmove 方法,這個方法可能是由程序定義和實現的。
  • style="left:{{write[0]}}px;top:{{write[1]}}px;":表示按鈕的定位樣式,left 和 top 樣式用于指定按鈕的水平和垂直位置。{{write[0]}} 和 {{write[1]}} 是可能由程序動態設置的變量。
  • catch:touchend="touchend":表示當按鈕觸摸結束時觸發 touchend 方法,這個方法可能是由程序定義和實現的。
<button class='kefuBtn' open-type="contact"  bindtouchmove="touchmove" catch:touchmove style="left:{{write[0]}}px;top:{{write[1]}}px;" catch:touchend="touchend"><image class="kefu" src="../../iimage/kefu.png" />
</button>

CSS

.kefuBtn {position: absolute;background-color: transparent;border: none;outline: none;background: #fff !important;border-radius: 0rpx;padding: 0rpx;margin: 0rpx;display: inline-block;line-height: 1;width: 112rpx !important;height: 112rpx !important;border-radius: 50%;box-shadow: 0 4px 12px 0 rgba(0, 0, 0, 0.15)
}button::after {/*button的邊框樣式是通過::after方式實現的*/border: none;
}.kefuBtn image {width: 112rpx;height: 112rpx;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42007.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42007.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42007.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

無涯教程-Perl - tell函數

描述 此函數返回指定FILEHANDLE中讀取指針的當前位置(以字節為單位)。如果省略FILEHANDLE,則它將返回上次訪問的文件中的位置。 語法 以下是此函數的簡單語法- tell FILEHANDLEtell返回值 此函數以字節為單位返回當前文件位置。 例 以下是顯示其基本用法的示例代碼,要檢…

leetcode473. 火柴拼正方形(回溯算法-java)

火柴拼正方形 leetcode473 火柴拼正方形題目描述回溯算法 上期經典算法 leetcode473 火柴拼正方形 難度 - 中等 原題鏈接 - leetcode473 火柴拼正方形 題目描述 你將得到一個整數數組 matchsticks &#xff0c;其中 matchsticks[i] 是第 i 個火柴棒的長度。你要用 所有的火柴棍…

BC119 小樂樂與字符串

描述 在慶祝祖國母親70華誕之際&#xff0c;老師給小樂樂出了一個問題。大家都知道China的英文縮寫是CHN&#xff0c;那么給你一個字符串s&#xff0c;你需要做的是統計s中子序列“CHN”的個數。子序列的定義&#xff1a;存在任意下標a < b < c&#xff0c;那么“s[a]s[b…

微服務—Eureka注冊中心

eureka相當于是一個公司的管理人事HR,各部門之間如果有合作時&#xff0c;由HR進行人員的分配以及調度&#xff0c;具體選哪個人&#xff0c;全憑HR的心情&#xff0c;如果你這個部門存在沒有意義&#xff0c;直接把你這個部門撤銷&#xff0c;全體人員裁掉&#xff0c;所以不想…

計算機網絡筆記

TCP有連接可靠服務 TCP特點&#xff1a; 1.TCP是面向連接的傳輸層協議&#xff1b; 2.每條TCP連接只能有兩個端點&#xff0c;每條TCP連接是一對一的&#xff1b; 3.TCP提供可靠交付&#xff0c;保證傳送數據無差錯&#xff0c;不丟失&#xff0c;不重復且有序&#xff1b; 4.…

Android Studio瀑布流實現

效果&#xff1a; ImageDetail class package com.example.waterfallflow; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.ImageView;public class ImageDetail extends Activity{Overrideprotected void …

DNNGP、DeepGS 和 DLGWAS模型構成對比

一、DNNGP DNNGP 是基于深度卷積神經網絡&#xff0c;這個結構包括一個輸入層&#xff0c;三個卷積層&#xff0c;一個批標準化層&#xff0c;兩個dropout層&#xff0c;一個平坦化層&#xff0c;一個 dense層。 dropout層&#xff1a;在神經網絡中,dropout層是一個非常有效的正…

信息與通信工程面試準備——數學知識|正態分布|中心極限定理

目錄 正態分布 正態分布的參數 正態分布的第一個參數是均值 正態分布的第二個參數是標準差SD 所有正態分布的共同特征 標準正態分布&#xff1a;正態分布的特例 中心極限定理 理解定義 示例# 1 示例# 2 知道樣本均值總是正態分布的實際含義是什么&#xff1f; 正態分…

Scala 如何調試隱式轉換--隱式轉換代碼的顯示展示

方法1 在需要隱式轉換的地方&#xff0c;把需要的參數顯示的寫出。 略方法2&#xff0c;查看編譯代碼 在terminal中 利用 scalac -Xprint:typer xxx.scala方法打印添加了隱式值的代碼示例。 對于復雜的工程來說&#xff0c;直接跑到terminal執行 scalac -Xprint:typer xxx.…

JVM——類文件結構

文章目錄 一 概述二 Class 文件結構總結2.1 魔數2.2 Class 文件版本2.3 常量池2.4 訪問標志2.5 當前類索引,父類索引與接口索引集合2.6 字段表集合2.7 方法表集合2.8 屬性表集合 一 概述 在 Java 中&#xff0c;JVM 可以理解的代碼就叫做字節碼&#xff08;即擴展名為 .class …

winform 封裝unity web player 用戶控件

環境&#xff1a; VS2015Unity 5.3.6f1 (64-bit) 目的&#xff1a; Unity官方提供的UnityWebPlayer控件在嵌入Winform時要求讀取的.unity3d文件路徑&#xff08;Src&#xff09;必須是絕對路徑&#xff0c;如果移動代碼到另一臺電腦&#xff0c;需要重新修改src。于是考慮使…

elementUI 的上傳組件<el-upload>,自定義上傳按鈕樣式

方法一&#xff1a; 原理&#xff1a;調用<el-upload>組件的方法喚起選擇文件事件 效果&#xff1a; 頁面代碼&#xff1a; 1、選擇圖片按鈕 <div class"flex_row_spacebetween btn" click"chooseImg"><span class"el-icon-plus ic…

matlab機器人工具箱基礎使用

資料&#xff1a;https://blog.csdn.net/huangjunsheng123/article/details/110630665 用vscode直接看工具箱api代碼比較方便&#xff0c;代碼說明很多 一、模型設置 1、基礎效果 %采用機器人工具箱進行正逆運動學驗證 a[0,-0.3,-0.3,0,0,0];%DH參數 d[0.05,0,0,0.06,0.05,…

教育行業軟文怎么寫,媒介盒子無償分享

隨著產業升級和技術變革、信息的智能化、數字化發展&#xff0c;也為教育行業帶來了新的增長點&#xff0c;在線教育課程類型豐富多元&#xff0c;新課程不斷涌現。在激烈的市場競爭環境下&#xff0c;教育機構如何根據市場實行差異化戰略并加強自身品牌建成為挑戰。 如今&…

微服務-Ribbon(負載均衡)

負載均衡的面對多個相同的服務的時候&#xff0c;我們選擇一定的策略去選擇一個服務進行 負載均衡流程 Ribbon結構組成 負載均衡策略 RoundRobinRule&#xff1a;簡單的輪詢服務列表來選擇服務器AvailabilityFilteringRule 對兩種情況服務器進行忽略&#xff1a; 1.在默認情…

Php“牽手”拼多多商品詳情頁數據采集方法,拼多多API接口申請指南

拼多多詳情接口 API 是開放平臺提供的一種 API 接口&#xff0c;它可以幫助開發者獲取商品的詳細信息&#xff0c;包括商品的標題、描述、圖片等信息。在電商平臺的開發中&#xff0c;詳情接口API是非常常用的 API&#xff0c;因此本文將詳細介紹詳情接口 API 的使用。 一、拼…

315官方點贊!多燕瘦或將成酵素選購唯一標準

食用酵素及其衍生產品&#xff0c;是近年來國內主流電商平臺的主要增長類目之一。在全球范圍內&#xff0c;酵素的流行由來已久&#xff0c;其中在日本、北美、歐洲等發達國家和地區尤為風靡。據不完全統計&#xff1a;歐洲酵素市場規模約占全球酵素市場份額的40%以上&#xff…

【Linux】一切皆文件

Linux 下一切皆為文件&#xff0c; 文件包括頭文件&#xff0c;庫文件&#xff08;靜態庫和共享庫&#xff09;&#xff0c;可執行文件&#xff0c;目錄文件&#xff0c;軟鏈接文件&#xff0c;配置文件等。 每個文件都依據權限分為用戶、用戶組和其他人三個身份&#xff0c;…

webpack相關面試

運行 npm run xxx 的時候發生了什么&#xff1f; npm run xxx的時候&#xff0c;首先會去項目的package.json文件里找scripts 里找對應的xxx&#xff0c;然后執行 xxx的命令 npm i 的時候&#xff0c;npm 讀到該配置后&#xff0c;就將該文件軟鏈接到 ./node_modules/.bin 目錄…

vscode conda activate激活環境出錯

vscode conda activate 出錯 conda-script.py: error: argument COMMAND: invalid choice: ‘activate’ To initialize your shell, run$ conda init <SHELL_NAME>Currently supported shells are:- bash- fish- tcsh- xonsh- zsh- powershellSee conda init --help f…