国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 熱點 > 微信 > 正文

vue 實現微信浮標效果

2024-07-22 01:17:36
字體:
來源:轉載
供稿:網友

微信的浮窗,大伙應該都用過,當我們正在閱讀一篇公眾號文章時,突然需要處理微信消息,點擊浮窗,在微信上會有個浮標,點擊浮標可以再次回到文章。

我們今天打算擼一個類似微信的浮標組件,我們期望組件有以下功能

支持拖拽 支持左右吸附 支持頁面上下滑動時隱藏

效果預覽

 

拖拽事件

浮標的核心功能的就是拖拽,對鼠標或移動端的觸摸的事件來說,有三個階段,鼠標或手指接觸到元素時,鼠標或手指在移動的過程,鼠標或手指離開元素。這個三個階段對應的事件名稱如下:

mouse: {  start: 'mousedown',  move: 'mousemove',  stop: 'mouseup'},touch: {  start: 'touchstart',  move: 'touchmove',  stop: 'touchend'}

元素定位

滑動容器我們采用絕對定位,通過設置 top 和 left 屬性來改變元素的位置,那我們怎么獲取到新的 top 和 left 呢?

我們先看下面這張圖

 

黃色區域是拖拽的元素,藍色的點就是鼠標或手指觸摸的位置,在元素移動的過程中,這些值也會隨著發生改變,那么我們只要計算出新的觸摸位置和最初觸摸位置的橫坐標和豎坐標的變化,就可以算出移動后的 top left ,因為拖拽的元素不隨著頁面滾動而變化,所以我們采用 pageX pageY 這兩個值。用公式簡單描述就是;

newTop = initTop + (currentPageY - initPageY)newLeft = initLeft + (currentPageX - initPageX)

拖拽區域

拖拽區域默認是在拖拽元素的父級元素內,所以我們需要計算出父級元素的寬高。這里有一點需要注意,如果父級的寬高是由異步事件來改變的,那么獲取的時候就會不準確,這種情況就需要改變下布局。

private getParentSize() {  const style = window.getComputedStyle(    this.$el.parentNode as Element,    null  );  return [    parseInt(style.getPropertyValue('width'), 10),    parseInt(style.getPropertyValue('height'), 10)  ];}

拖拽的前中后

有了上面的基礎,我們分析下拖拽的三個階段我們需要做哪些工作

觸摸元素,即開始拖拽,將當前元素的 top left 和觸摸點的 pageX pageY 用對象存儲起來,然后監聽移動和結束事件
元素拖拽過程,計算當前的 pageX pageY 與 初始的 pageX pageY 的差值,算出當前的 top left ,更新元素的位置
拖拽結束,重置初始值

左右吸附

在手指離開后,若元素偏向某一側,便吸附在該側的邊上,那么在拖拽事件結束后,根據元素的X軸中心的與父級元素的X軸中心點做比較,就可知道往左還是往右移動

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新乐市| 萝北县| 繁昌县| 环江| 奎屯市| 石河子市| 巴中市| 凤城市| 彝良县| 青铜峡市| 漯河市| 甘孜县| 梨树县| 平顶山市| 尼玛县| 河南省| 岢岚县| 景德镇市| 保山市| 安阳市| 信宜市| 循化| 旅游| 南漳县| 象山县| 栖霞市| 华安县| 汾阳市| 永济市| 莎车县| 西贡区| 宁河县| 凤山市| 苍南县| 饶阳县| 浙江省| 泊头市| 龙口市| 海安县| 敦化市| 饶阳县|