91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue如何實現移動端拖拽懸浮按鈕

發布時間:2022-07-14 13:52:11 來源:億速云 閱讀:964 作者:iii 欄目:開發技術

這篇文章主要講解了“vue如何實現移動端拖拽懸浮按鈕”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“vue如何實現移動端拖拽懸浮按鈕”吧!

功能介紹:

在移動端開發中,實現懸浮按鈕在側邊顯示,為不遮擋頁面內容,允許手指拖拽換位。

大致需求:

1、按鈕在頁面側邊懸浮顯示;
2、手指長按按鈕,按鈕改變樣式,允許拖拽改變位置;
3、按鈕移動結束,手指松開,計算距離左右兩側距離并自動移動至側邊顯示;
4、移動至側邊后,按鈕根據具體左右兩次位置判斷改變現實樣式;

整體思路:

1、按鈕實行position:fixed布局,在頁面兩側最上層懸浮顯示;
2、手指長按可使用定時器來判斷,若手指松開,則關閉定時器,等待下次操作再啟用;
3、跟隨手指移動計算按鈕與頁面兩側的距離,判斷手指松開時停留的位置;

簡單效果展示:

vue如何實現移動端拖拽懸浮按鈕

vue如何實現移動端拖拽懸浮按鈕

vue如何實現移動端拖拽懸浮按鈕

具體實現:

一、position:fixed布局:

使用定位實現

<!-- 外層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>

二、touch事件綁定:

應用到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如何實現移動端拖拽懸浮按鈕這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

vue
AI

和田县| 青田县| 三门县| 沈丘县| 岱山县| 宁南县| 固安县| 太仆寺旗| 会泽县| 景谷| 兴义市| 雷山县| 崇左市| 德化县| 房产| 揭阳市| 霍山县| 临汾市| 志丹县| 瑞金市| 乐东| 新余市| 会宁县| 广元市| 五常市| 阳东县| 当雄县| 盘山县| 贞丰县| 平利县| 南陵县| 隆安县| 山东省| 博白县| 如皋市| 大丰市| 繁昌县| 长泰县| 石景山区| 黄大仙区| 辉南县|