pc 移動端 防iPhone懸浮球效果

<!DOCTYPE html>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    <title>pc 移動端 仿iPhone懸浮球效果</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .assistive-wrap {
            width: 58px;
            height: 58px;
            position: fixed;
            top: 50%;
            margin-top: -29px;
            left: 1px;
        }

        .assistive-touch {
            width: 100%;
            height: 100%;
            background: #343434;
            border-radius: 10px;
            opacity: .3;
            position: relative;
        }

        .assistive-touch:before,
        .assistive-touch:after,
        .assistive-touch span {
            content: '';
            position: absolute;
            border-radius: 100%;
            box-shadow: 0 0 2px rgba(30, 30, 30, .5);
            display: block;
            background: rgba(255, 255, 255, .6);
        }

        .assistive-touch:before {
            width: 42px;
            height: 42px;
            left: 8px;
            top: 8px;
            opacity: .5;
        }

        .assistive-touch span {
            width: 34px;
            height: 34px;
            left: 12px;
            top: 12px;
        }

        .assistive-touch:after {
            width: 26px;
            height: 26px;
            left: 16px;
            top: 16px;
            background: #fff;
        }

        .animate {
            transition: 0.4s;
        }
    </style>
    <script>
        window.onload = function () {
            var startEvt, moveEvt, endEvt
            var clientWidth = document.documentElement.clientWidth;
            var clientHeight = document.documentElement.clientHeight;

            if ('ontouchstart' in window) {
                startEvt = 'touchstart'
                moveEvt = 'touchmove'
                endEvt = 'touchend'
            } else {
                startEvt = 'mousedown'
                moveEvt = 'mousemove'
                endEvt = 'mouseup'
            }
            var drag = document.getElementById("assistive-wrap");
            drag.style.position = 'absolute'
            drag.style.cursor = 'move';
            // 標(biāo)記是拖曳還是點擊
            var isClick = true
            var disX, disY, left, top, starX, starY
            drag.addEventListener(startEvt, function (e) {
                // 阻止頁面的滾動斗躏,縮放
                e.preventDefault()
                // 兼容IE瀏覽器
                var e = e || window.event
                isClick = true
                // 手指按下時的坐標(biāo)
                starX = e.touches ? e.touches[0].clientX : e.clientX
                starY = e.touches ? e.touches[0].clientY : e.clientY
                // 手指相對于拖動元素左上角的位置
                disX = starX - drag.offsetLeft
                disY = starY - drag.offsetTop
                // 按下之后才監(jiān)聽后續(xù)事件
                document.addEventListener(moveEvt, moveFun)
                document.addEventListener(endEvt, endFun)
            })

            function moveFun(e) {
                drag.classList.remove("animate");
                // 兼容IE瀏覽器
                var e = e || window.event
                // 防止觸摸不靈敏,拖動距離大于20像素就認(rèn)為不是點擊铭腕,小于20就認(rèn)為是點擊跳轉(zhuǎn)
                if (
                    Math.abs(starX - (e.touches ? e.touches[0].clientX : e.clientX)) > 20 ||
                    Math.abs(starY - (e.touches ? e.touches[0].clientY : e.clientY)) > 20
                ) {
                    isClick = false
                }
                left = (e.touches ? e.touches[0].clientX : e.clientX) - disX
                top = (e.touches ? e.touches[0].clientY : e.clientY) - disY
                // 限制拖拽的X范圍裕坊,不能拖出屏幕
                if (left < 0) {
                    left = 0
                } else if (left > clientWidth - drag.offsetWidth) {
                    left = clientWidth - drag.offsetWidth
                }
                // 限制拖拽的Y范圍俐筋,不能拖出屏幕
                if (top < 0) {
                    top = 0
                } else if (top > document.documentElement.clientHeight - drag.offsetHeight) {
                    top = document.documentElement.clientHeight - drag.offsetHeight
                }
                drag.style.left = left + 'px'
                drag.style.top = top + 'px'
            }

            function endFun(e) {
                drag.classList.add('animate');
                var dargCenterX = drag.offsetLeft + drag.offsetWidth / 2;
                console.log(drag.offsetWidth / 2);
                console.log(dargCenterX);
                if (dargCenterX < clientWidth / 2) {
                    //吸附左側(cè)
                    drag.style.left = 0;
                } else {
                    //吸附在右側(cè)
                    drag.style.left = clientWidth - drag.offsetWidth + "px";
                }

                document.removeEventListener(moveEvt, moveFun)
                document.removeEventListener(endEvt, endFun)
                if (isClick) { // 點擊
                    // window.location.href = dragLink
                }
            }


        }
    </script>
</head>

<body>

    <div class="assistive-wrap" id="assistive-wrap">
        <div class="assistive-touch">
            <span></span>
        </div>
    </div>


</body>

</html>

image.png

參考 https://juejin.cn/post/6854573211284144135
https://www.bbsmax.com/A/qVden0DMzP

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末愉择,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子膊畴,更是在濱河造成了極大的恐慌掘猿,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唇跨,死亡現(xiàn)場離奇詭異稠通,居然都是意外死亡,警方通過查閱死者的電腦和手機买猖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門改橘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人政勃,你說我怎么就攤上這事唧龄。” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵既棺,是天一觀的道長讽挟。 經(jīng)常有香客問我,道長丸冕,這世上最難降的妖魔是什么耽梅? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮胖烛,結(jié)果婚禮上眼姐,老公的妹妹穿的比我還像新娘。我一直安慰自己佩番,他們只是感情好众旗,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著趟畏,像睡著了一般贡歧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赋秀,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天利朵,我揣著相機與錄音,去河邊找鬼猎莲。 笑死绍弟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的著洼。 我是一名探鬼主播樟遣,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼身笤!你這毒婦竟也來了年碘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤展鸡,失蹤者是張志新(化名)和其女友劉穎屿衅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莹弊,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡涤久,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忍弛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片响迂。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖细疚,靈堂內(nèi)的尸體忽然破棺而出蔗彤,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布然遏,位于F島的核電站贫途,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏待侵。R本人自食惡果不足惜丢早,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秧倾。 院中可真熱鬧怨酝,春花似錦、人聲如沸那先。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽售淡。三九已至盛险,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勋又,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工换帜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留楔壤,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓惯驼,卻偏偏與公主長得像蹲嚣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子祟牲,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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

  • 搭建項目參考 前端 前期準(zhǔn)備 node環(huán)境 搭建腳手架 安裝需要的依賴:vue全家桶(vue-cli隙畜、vue-ro...
    dawsonenjoy閱讀 3,409評論 0 21
  • R語言基礎(chǔ) https://www.cnblogs.com/think-and-do/p/6549422.html...
    挽山閱讀 2,730評論 0 5
  • 夜鶯2517閱讀 127,720評論 1 9
  • 版本:ios 1.2.1 亮點: 1.app角標(biāo)可以實時更新天氣溫度或選擇空氣質(zhì)量,建議處女座就不要選了说贝,不然老想...
    我就是沉沉閱讀 6,896評論 1 6
  • 我是一名過去式的高三狗议惰,很可悲,在這三年里我沒有戀愛乡恕,看著同齡的小伙伴們一對兒一對兒的言询,我的心不好受。怎么說呢傲宜,高...
    小娘紙閱讀 3,388評論 4 7