美文网首页
全屏拖动div元素,释放时不超出浏览器范围(使用draggabi

全屏拖动div元素,释放时不超出浏览器范围(使用draggabi

作者: 山上风大 | 来源:发表于2019-11-16 17:55 被阅读0次

html结构

<!DOCTYPE html>
<html lang="en">
<head></head>
<body ontouchstart>
    <div class="页面主体部分" style="width: 100%;height: 9999px">
        <p>测试内容</p>
        <p>测试内容</p>
        <p>测试内容</p>
    </div>
    <!-- 最好放到外层,不然可能被覆盖而无法拖动-->
    <!-- 至少给定一个max-width,最好给一个固定width-->
    <div class="被拖动元素" id="dragBtn"
         style="position: fixed; z-index: 999; width: 4em; text-align: center; background-color: #000; color: #fff; right: 0; bottom: 0">
        <a style="display: block;border-bottom: #fff 1px solid"><span>咨询<br>服务</span></a>
        <a style="display: block"><span>个人<br>中心</span></a>
    </div>
</body>
</html>

页面效果图

image.png

JS 插件(draggabilly)主要实现方法

// 通过被拖动元素的id获取元素节点并创建一个拖动对象
let dragObj = new Draggabilly(document.querySelector('#dragBtn'));
/**
 * 实现拖动事件结束时的回调
 * 主要操作为
 *     1.获取浏览器窗口可用宽高
 *     2.获取元素宽高
 *     3.获取元素拖动结束时的上下左右边距
 *     4.设置计算后的上下左右边距(当元素某一项当前边距小于0时,
 *        设置当前边距为auto,对边距为实际边距)
*/
dragObj.on("dragEnd", () => {
    dragObj.element.style.opacity = 1;//恢复拖动时的透明度

    // 边界计算函数
    let setBoundary = (a, b) => a < 0 ? '0px' : b < 0 ? "auto" : toString(Math.ceil(a)).concat('px');

    // 获取浏览器可用宽高
    let _w = window ? window.innerWidth : document.documentElement.offsetWidth;
    let _h = window ? window.innerHeight : document.documentElement.offsetHeight;
    // 获取被拖动元素宽高
    let w = parseFloat(window.getComputedStyle(dragObj.element).getPropertyValue("width").split("px")[0]);
    let h = parseFloat(window.getComputedStyle(dragObj.element).getPropertyValue("height").split("px")[0]);
    // 获取被拖动元素释放时的left,top,right,bottom
    let l = parseFloat(dragObj.element.style.left.split("px")[0]);
    let t = parseFloat(dragObj.element.style.top.split("px")[0]);
    let r = _w - l - w;
    let b = _h - t - h;

    console.log(_w, _h, w, h, l, t, r, b);
    // 使用边界计算函数并设置定位
    dragObj.element.style.left = setBoundary(l, r);
    dragObj.element.style.right = setBoundary(r, l);
    dragObj.element.style.top = setBoundary(t, b);
    dragObj.element.style.bottom = setBoundary(b, t);

    console.log(
        dragObj.element.style.left,
        dragObj.element.style.right,
        dragObj.element.style.top,
        dragObj.element.style.bottom
    );
});

最终代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
    <meta name="format-detection" content="telephone=no">
    <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
</head>
<body ontouchstart>
    <div class="页面主体部分"></div>
    <!--最好放到外层,不然可能无法拖动-->
    <div class="被拖动元素" id="dragBtn" 
         style="position: fixed; z-index: 999; background-color: #000; color: #fff">
        <a><span>咨询<br>服务</span></a>
        <a><span>个人<br>中心</span></a>
    </div>

</body>
<!--这里使用draggabilly插件-->
<script src="https://cdn.bootcss.com/draggabilly/2.2.0/draggabilly.pkgd.min.js"></script>
<script>
    // 一般的拖动元素的初始化配置
    // let drag_param_config = {
    //     containment: true,// 边界容器,true为父元素 boolean|"selector"
    //     handle: false,//使用其他元素执行拖动 false|"selector"
    //     axis: false,//拖动的轴 false|"x"|"y"
    //     grid: false,//网格 false|"[x,y]"
    // };

    // 通过被拖动元素的id获取元素节点并创建一个拖动对象
    let dragObj = new Draggabilly(document.querySelector('#dragBtn'));

    // 事件回调
    dragObj.on('dragMove', () => {
    });

    // 事件回调
    dragObj.on('staticClick', (instance, ev) => {
        console.log('单击拖动元素')
    }).on("dragStart", function () {
        // 拖动开始事件回调
        this.element.style.opacity = .5;//设置拖动时的透明度
        this.element.style.bottom = 'auto';
    });

    // 拖动结束事件回调,主要实现这里
    dragObj.on("dragEnd", () => {
        dragObj.element.style.opacity = 1;//恢复拖动时的透明度

        // 边界计算函数
        let setBoundary = (a, b) => a < 0 ? '0px' : b < 0 ? "auto" : toString(Math.ceil(a)).concat('px');

        // 获取浏览器可用宽高
        let _w = window ? window.innerWidth : document.documentElement.offsetWidth;
        let _h = window ? window.innerHeight : document.documentElement.offsetHeight;
        // 获取被拖动元素宽高
        let w = parseFloat(window.getComputedStyle(dragObj.element).getPropertyValue("width").split("px")[0]);
        let h = parseFloat(window.getComputedStyle(dragObj.element).getPropertyValue("height").split("px")[0]);
        // 获取被拖动元素释放时的left,top,right,bottom
        let l = parseFloat(dragObj.element.style.left.split("px")[0]);
        let t = parseFloat(dragObj.element.style.top.split("px")[0]);
        let r = _w - l - w;
        let b = _h - t - h;

        console.log(_w, _h, w, h, l, t, r, b);
        // 使用边界计算函数并设置定位
        dragObj.element.style.left = setBoundary(l, r);
        dragObj.element.style.right = setBoundary(r, l);
        dragObj.element.style.top = setBoundary(t, b);
        dragObj.element.style.bottom = setBoundary(b, t);

        console.log(
            dragObj.element.style.left,
            dragObj.element.style.right,
            dragObj.element.style.top,
            dragObj.element.style.bottom
        );
    });
</script>
</html>

拖动到边界时效果图

image.png

释放后效果图

image.png

相关文章

  • 全屏拖动div元素,释放时不超出浏览器范围(使用draggabi

    html结构 页面效果图 JS 插件(draggabilly)主要实现方法 最终代码 拖动到边界时效果图 释放后效果图

  • CSS实现全屏切换效果

    如何通过CSS使div实现全屏效果 全屏要素 全屏的元素及其父元素都要设置height:100% 将html、bo...

  • h5笔记

    div中嵌套div,如果子div显示范围超出父div,子div超出部分仍然正常显示,父div也保持其设置的宽高 n...

  • 2018-07-27

    ondrag事件在元素或者选取的文本被拖动时触发 在拖动目标上触发事件(源元素): 2.释放目标时触发的事件 在拖...

  • HTML笔记16:HTML5拖放

    拖动事件 拖动实例 拖动元素添加属性 拖动我! 定义拖动ondragstart 设置目标释放后,放置的位置ondr...

  • 08-scroll属性

    1. 内容没有超出元素范围时scrollWidth: = 元素宽度 + 内边距宽度 == clientWidths...

  • js的拖动相关

    拖动相关的事件 dragstart: 被拖动元素 开始拖动 时触发的事件。 drag: 被拖动元素 拖动过程 触发...

  • DIV下面子元素的颜色被页面背景颜色覆盖问题|css?

    问题详述:当设置块级元素div颜色为粉色,页面背景颜色为白色时,div子元素比如 段落内容在浏览器界面没有显示出父...

  • Javascript知识整理——拖放

    拖放事件 拖动某元素时,将依次触发下列事件(被拖动元素): dragstart按下鼠标并开始移动鼠标时在被拖动元素...

  • js实现拖拽事件

    拖放事件 拖放是由拖动与释放两部分组成,拖放事件也分为被拖动元素的相关事件,和容器的相关事件。 被拖动元素的相关事...

网友评论

      本文标题:全屏拖动div元素,释放时不超出浏览器范围(使用draggabi

      本文链接:https://www.haomeiwen.com/subject/rmiyictx.html