您好,登錄后才能下訂單哦!
這篇文章主要講解了“vue如何實現移動端拖拽懸浮按鈕”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“vue如何實現移動端拖拽懸浮按鈕”吧!
在移動端開發中,實現懸浮按鈕在側邊顯示,為不遮擋頁面內容,允許手指拖拽換位。
1、按鈕在頁面側邊懸浮顯示;
2、手指長按按鈕,按鈕改變樣式,允許拖拽改變位置;
3、按鈕移動結束,手指松開,計算距離左右兩側距離并自動移動至側邊顯示;
4、移動至側邊后,按鈕根據具體左右兩次位置判斷改變現實樣式;
1、按鈕實行position:fixed布局,在頁面兩側最上層懸浮顯示;
2、手指長按可使用定時器來判斷,若手指松開,則關閉定時器,等待下次操作再啟用;
3、跟隨手指移動計算按鈕與頁面兩側的距離,判斷手指松開時停留的位置;
簡單效果展示:
使用定位實現
<!-- 外層ul控制卡片范圍 --> <div> <div class="floatBtn" :class="[{moveBtn: longClick}, `${btnType}Btn`]"> <span>懸浮按鈕</span> </div> </div>
<style lang="scss" 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>
應用到touchstart,touchmove,touchend事件,使用定時器實現長按效果:
<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) { // 定時器控制長按時間,超過500毫秒開始進行拖拽 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) { // 未達到500毫秒就移動則不觸發長按,清空定時器 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) { // 清空定時器 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>
單個頁面引入
<template> <floatBtn/> </template>
<script> import floatBtn from './floatBtn'; export default { components: { floatBtn }, }; </script>
感謝各位的閱讀,以上就是“vue如何實現移動端拖拽懸浮按鈕”的內容了,經過本文的學習后,相信大家對vue如何實現移動端拖拽懸浮按鈕這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。