uniapp 拖拽小球編寫

編寫floatButton組件兄朋,主要代碼如下

<template>
    <view>
        <view class="float-button"
        :style="{
            left: safeLeft,
            top: safeTop,
            width: width + 'px',
            height: height + 'px',
            'transition': isMove ? 'none' : 'all .2s',
            'display': isShow ? 'block' : 'none'
        }"
        @touchstart.prevent.stop="dragStart" 
        @touchmove.prevent.stop="dragMove"
        @touchend.prevent.stop="dragStop"
        :animation="animation">
            <slot></slot>
        </view>
    </view>
</template>

<script>
    export default {
        props: {
            //  距離左邊的百分比
            x: {
                type: Number,
                default: 0
            },
            //  距離右邊的百分比
            y: {
                type: Number,
                default: 0
            },
            //  寬度
            width: {
                type: Number,
                default: 50
            },
            //  高度
            height: {
                type: Number,
                default: 50
            },
            //  離頁面邊上的距離
            padding: {
                type: Number,
                default: 10
            }
        },
        data () {
            return {
                isShow: false,
                isMove: false,
                start: [0, 0],
                moveY: null,
                moveX: null,
                windowWidth: null,
                windowHeight: null,
                animation: {},
                timeout: null
            }
        },
        computed: {
            safeLeft () {
                let maxX = this.windowWidth - this.width - this.padding
                let minX = this.padding
                if (this.moveX == null) {
                    let safeX = (this.x / 100) * this.windowWidth
                    return safeX > maxX ? maxX + 'px' : (safeX < minX) ? minX + 'px' : safeX + 'px'
                }
                return this.moveX > maxX ? maxX + 'px' : (this.moveX < minX) ? minX + 'px' : this.moveX + 'px'
            },
            safeTop () {
                let maxY = this.windowHeight - this.height - this.padding
                let minY = this.padding
                if (this.moveY == null) {
                    let safeY = (this.y / 100) * this.windowHeight
                    return safeY > maxY ? maxY + 'px' : (safeY < minY) ? minY + 'px' : safeY + 'px'
                }
                return this.moveY > maxY ? maxY + 'px' : (this.moveY < minY) ? minY + 'px' : this.moveY + 'px'
            }
        },
        mounted () {
            const {
                windowWidth,
                windowHeight
            } = uni.getSystemInfoSync()
            this.windowWidth = windowWidth
            this.windowHeight = windowHeight
            this.$nextTick(() => {
                this.isShow = true
            })
        },
        methods: {
            dragStart(event) {
                this.start[0] = event.touches[0].clientX - event.target.offsetLeft;
                this.start[1] = event.touches[0].clientY - event.target.offsetTop;
            },
            //判斷防止懸浮球被拖出頁面
            dragMove(event) {
                this.isMove = true
                const touch = event.touches[0] || event.changedTouches[0]
                this.moveX = touch.clientX - this.start[0]
                this.moveY = touch.clientY - this.start[1]
            },
            dragStop (event) {
                // 判斷在左側(cè)還是右側(cè)
                if (this.isMove) {
                    this.isMove = false
                    if (this.moveX > this.windowWidth / 2) {
                        this.moveX = this.windowWidth - this.width - this.padding
                    } else {
                        this.moveX = 0
                    }
                } else {
                    this.$emit('click')
                }
            }
        }
    }
</script>

<style lang="scss" scoped>
    .float-button{
        position: fixed;
        z-index: 999;
        transition: all .2s;
    }
</style>

使用

<floatButton :width="40" :height="40" :x="90" :y="90" @click="clickFun">
  // 這里放置需要的內(nèi)容
</floatButton>

效果如圖所示

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市怜械,隨后出現(xiàn)的幾起案子颅和,更是在濱河造成了極大的恐慌,老刑警劉巖缕允,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峡扩,死亡現(xiàn)場離奇詭異,居然都是意外死亡障本,警方通過查閱死者的電腦和手機教届,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人巍佑,你說我怎么就攤上這事茴迁。” “怎么了萤衰?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵堕义,是天一觀的道長。 經(jīng)常有香客問我脆栋,道長倦卖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任椿争,我火速辦了婚禮怕膛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秦踪。我一直安慰自己褐捻,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布椅邓。 她就那樣靜靜地躺著典唇,像睡著了一般术吝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天升熊,我揣著相機與錄音盲再,去河邊找鬼周崭。 笑死哑诊,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的透葛。 我是一名探鬼主播笨使,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼僚害!你這毒婦竟也來了阱表?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤贡珊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后涉馁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體门岔,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年烤送,在試婚紗的時候發(fā)現(xiàn)自己被綠了寒随。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖妻往,靈堂內(nèi)的尸體忽然破棺而出互艾,到底是詐尸還是另有隱情,我是刑警寧澤讯泣,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布纫普,位于F島的核電站,受9級特大地震影響好渠,放射性物質(zhì)發(fā)生泄漏昨稼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一拳锚、第九天 我趴在偏房一處隱蔽的房頂上張望假栓。 院中可真熱鬧,春花似錦霍掺、人聲如沸匾荆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牙丽。三九已至,卻和暖如春连躏,著一層夾襖步出監(jiān)牢的瞬間剩岳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工入热, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拍棕,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓勺良,卻偏偏與公主長得像绰播,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子尚困,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • 商城首頁App的編寫蠢箩,首先我們要確定我們需要確定一下大框架: 如圖所示,我們可以看到事甜,首先我們需要一個內(nèi)容根布局谬泌,...
    仲夏之雪夢旅人閱讀 860評論 0 1
  • 協(xié)程屬于Kotlin中非常有特色的一項技術(shù),因為大部分編程語言中是沒有協(xié)程這個概念的逻谦。 那么什么是...
    隨風(fēng)cvil閱讀 881評論 0 1
  • 用兩張圖告訴你掌实,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,745評論 2 59
  • 通過第 12 章的學(xué)習(xí)邦马,大家已經(jīng)知道后臺的請求處理方法可以包含多種參數(shù)類型贱鼻。 在實際的項目開發(fā)中宴卖,多數(shù)情況下客戶端...
    遼A丶孫悟空閱讀 530評論 1 12
  • 第一章 初識Flink 大數(shù)據(jù)開發(fā)總體架構(gòu) 數(shù)據(jù)傳輸層:常用的數(shù)據(jù)傳輸工具有Flume、Sqoop邻悬、Kafka症昏。F...
    日落_3d9f閱讀 9,569評論 0 9