移動(dòng)端拖拽懸浮按鈕如何用vue實(shí)現(xiàn),下面看看具體內(nèi)容:
功能介紹:
開發(fā)中,要考慮用戶體驗(yàn),懸浮按鈕不僅要顯示在側(cè)邊,更是可以允許隨意拖拽換位。
需求描述:
1、按鈕懸浮顯示在頁面?zhèn)冗叄?/p>
2、當(dāng)手指長按左鍵按鈕,即可允許拖拽改變位置;
3、按鈕移動(dòng)結(jié)束,手指松開,計(jì)算距離左右兩側(cè)距離并自動(dòng)移動(dòng)至側(cè)邊顯示;
4、移動(dòng)至側(cè)邊后,按鈕根據(jù)具體左右兩次位置判斷改變現(xiàn)實(shí)樣式;
整體思路:
1、按鈕實(shí)行position:fixed布局,在頁面兩側(cè)最上層懸浮顯示;
2、手指長按可使用定時(shí)器來判斷,若手指松開,則關(guān)閉定時(shí)器,等待下次操作再啟用;
3、跟隨手指移動(dòng)計(jì)算按鈕與頁面兩側(cè)的距離,判斷手指松開時(shí)停留的位置;
效果展示:
具體實(shí)現(xiàn):
一、position:fixed布局:
使用定位實(shí)現(xiàn)
<!-- 外層ul控制卡片范圍 --> <div> <div :class="[{moveBtn: longClick}, `${btnType}Btn`]"> <span>懸浮按鈕</span> </div> </div>
<style scoped> @mixin notSelect{ -moz-user-select:none; /*火狐*/ -webkit-user-select:none; /*webkit瀏覽器*/ -ms-user-select:none; /*IE10*/ -khtml-user-select:none; /*早期瀏覽器*/ user-select:none; } @mixin not-touch { -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .floatBtn { @include notSelect; @include not-touch(); position: fixed; z-index: 1; overflow: hidden; width: 100px; left: calc(100% - 100px); top: calc(100% - 100px); color: #E0933A; background: #FCEBD0; font-size: 14px; height: 36px; line-height: 36px; text-align: center; box-sizing: border-box; display: flex; justify-content: center; align-items: center; padding: 10px; &.rightBtn { border-radius: 20px 0 0 20px; } &.leftBtn { border-radius: 0 20px 20px 0; } &.moveBtn { border-radius: 20px; } } </style>
二、touch事件綁定:
應(yīng)用到touchstart,touchmove,touchend事件,使用定時(shí)器實(shí)現(xiàn)長按效果:
<div class="floatBtn" :class="[{moveBtn: longClick}, `${btnType}Btn`]" @touchstart="touchstart($event)" @touchmove="touchMove($event)" @touchend="touchEnd($event)" > <span>懸浮按鈕</span> </div>
<script> export default { data() { return { timeOutEvent: 0, longClick: 0, // 手指原始位置 oldMousePos: {}, // 元素原始位置 oldNodePos: {}, btnType: 'right' }; }, touchstart(ev) { // 定時(shí)器控制長按時(shí)間,超過500毫秒開始進(jìn)行拖拽 this.timeOutEvent = setTimeout(() => { this.longClick = 1; }, 500); const selectDom = ev.currentTarget; const { pageX, pageY } = ev.touches[0]; // 手指位置 const { offsetLeft, offsetTop } = selectDom; // 元素位置 // 手指原始位置 this.oldMousePos = { x: pageX, y: pageY }; // 元素原始位置 this.oldNodePos = { x: offsetLeft, y: offsetTop }; selectDom.style.left = `${offsetLeft}px`; selectDom.style.top = `${offsetTop}px`; }, touchMove(ev) { // 未達(dá)到500毫秒就移動(dòng)則不觸發(fā)長按,清空定時(shí)器 clearTimeout(this.timeOutEvent); if (this.longClick === 1) { const selectDom = ev.currentTarget; // x軸偏移量 const lefts = this.oldMousePos.x - this.oldNodePos.x; // y軸偏移量 const tops = this.oldMousePos.y - this.oldNodePos.y; const { pageX, pageY } = ev.touches[0]; // 手指位置 selectDom.style.left = `${pageX - lefts}px`; selectDom.style.top = `${pageY - tops}px`; } }, touchEnd(ev) { // 清空定時(shí)器 clearTimeout(this.timeOutEvent); if (this.longClick === 1) { this.longClick = 0; const selectDom = ev.currentTarget; const {clientWidth, clientHeight} = document.body; const {offsetLeft, offsetTop} = selectDom; selectDom.style.left = (offsetLeft + 50) > (clientWidth / 2) ? 'calc(100% - 100px)' : 0; if (offsetTop < 90) { selectDom.style.top = '90px'; } else if (offsetTop + 36 > clientHeight) { selectDom.style.top = `${clientHeight - 36}px`; } this.btnType = (offsetLeft + 50) > (clientWidth / 2) ? 'right' : 'left'; } }, }; </script>
三、頁面引入:
單個(gè)頁面引入
<template> <floatBtn/> </template>
<script> import floatBtn from './floatBtn'; export default { components: { floatBtn }, }; </script>
以上就是相關(guān)內(nèi)容,請(qǐng)大家繼續(xù)關(guān)注。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/127698.html
摘要:基于實(shí)現(xiàn)的移動(dòng)端的可吸附懸浮按鈕預(yù)覽地址移動(dòng)端源碼地址安裝使用 基于react實(shí)現(xiàn)的移動(dòng)端的可吸附懸浮按鈕 預(yù)覽地址(移動(dòng)端): https://kkfor.github.io/suspe... 源碼地址: https://github.com/kkfor/susp... 安裝 npm install suspend-button -S 使用 import React, { Compo...
摘要:基于實(shí)現(xiàn)的移動(dòng)端的可吸附懸浮按鈕預(yù)覽地址移動(dòng)端源碼地址安裝使用 基于react實(shí)現(xiàn)的移動(dòng)端的可吸附懸浮按鈕 預(yù)覽地址(移動(dòng)端): https://kkfor.github.io/suspe... 源碼地址: https://github.com/kkfor/susp... 安裝 npm install suspend-button -S 使用 import React, { Compo...
摘要:全家桶仿騰訊體育一年一度的總決賽,相信球迷用的最多的就是騰訊體育這款,剛好上手,當(dāng)練手就把這個(gè)仿下來。這樣剛進(jìn)去的時(shí)候頁面加載時(shí)間明顯減短??梢园我猱惒讲僮?。 Vue2.0全家桶仿騰訊體育APP 一年一度的NBA總決賽,相信球迷用的最多的就是騰訊體育這款A(yù)PP,剛好上手Vue,當(dāng)練手就把這個(gè)APP仿下來。 showImg(https://segmentfault.com/img/r...
前言:前段時(shí)間負(fù)責(zé)公司的運(yùn)營管理后臺(tái)項(xiàng)目,通過運(yùn)營后臺(tái)的PC端拖拽配置布局,達(dá)到App首頁模板的動(dòng)態(tài)UI界面配置,生成頁面。趁著周末,整理一下當(dāng)時(shí)所了解到的拖拽。文章會(huì)根據(jù)大家的反饋或者自己學(xué)習(xí)經(jīng)驗(yàn)的累積成長不定期更新豐富。如果你想了解更多PC端的拖拽開發(fā),歡迎點(diǎn)贊關(guān)注或者收藏一波[鞠躬]。 之前在掘金一篇文章里看到這段話: UI 開發(fā)的三種模式 1.手寫標(biāo)簽和樣式代碼,生成頁面 2.可視化拖拽 ...
摘要:今天寫了一個(gè)仿蘋果的懸浮按鈕,由于只在右側(cè)展開,所以只能上下拖拽,展開效果入下拖拽如果這個(gè)元素的位置內(nèi)只有一個(gè)手指的話阻止瀏覽器默認(rèn)事件,重要超過頂部超過底部 今天寫了一個(gè)仿蘋果的懸浮按鈕,由于只在右側(cè)展開,所以只能上下拖拽,展開效果入下 showImg(https://segmentfault.com/img/bVZgLZ?w=376&h=404);1.html ...
閱讀 566·2023-03-27 18:33
閱讀 755·2023-03-26 17:27
閱讀 656·2023-03-26 17:14
閱讀 608·2023-03-17 21:13
閱讀 541·2023-03-17 08:28
閱讀 1829·2023-02-27 22:32
閱讀 1324·2023-02-27 22:27
閱讀 2207·2023-01-20 08:28