JavaScript - 基于拖放(Drag and Drop) API 拖动一个元素

文章目录

谷歌浏览器版本信息:版本 96.0.4664.45(正式版本) (64 位)

示例

思路

  1. 在拖动开始时,记录被拖动元素的起始坐标;
  2. 在拖动结束之后,计算元素的终点坐标与起始坐标的偏移,然后修改元素的位置。
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <style type="text/css">
            div {
                position: fixed;
                top: 10px;
                left: 10px;
                width: 200px;
                padding: 5px;
                border: 1px solid rgba(34, 34, 34, 0.8);
                border-radius: 5px;
                background: rgba(34, 34, 34, 0.7);
                color: #FFFFFF;
                text-align: center;
                user-select: none;
                z-index: 20211208;
            }
        </style>
    </head>
    <body>
        <div id="time-container" draggable="true"></div>

        <script type="text/javascript">
            let timerContainer;
            const origin = { x: 0, y: 0 };
            
            window.onload = (event) => {
                // console.log(event);
                main();
            }
            
            // 拖动开始
            document.addEventListener("dragstart", function(event) {
                console.log(event.type, event);
                const target = event.target;
                
                if(target.id !== timerContainer.id) {
                    return;
                }
                
                // 记录被拖动的元素的起始坐标
                origin.x = event.clientX;
                origin.y = event.clientY;
                
                console.log("Origin:", origin.x, origin.y);
                
                target.style.opacity = 0.8;
            }, false);
            
            // 拖动结束
            document.addEventListener("dragend", function(event) {
                console.log(event.type, event);
                const target = event.target;
                
                if(target.id !== timerContainer.id) {
                    return;
                }
                
                target.style.opacity = "";
                
                // 计算拖动结束之后,元素的终点坐标与起始坐标的偏移
                const offsetX = event.clientX - origin.x;
                const offsetY = event.clientY - origin.y;
                
                console.log("Offset:", offsetX, offsetY);
                
                // 修改元素的位置
                target.style.setProperty("top", `${target.offsetTop + offsetY}px`);
                target.style.setProperty("left", target.offsetLeft + offsetX + "px");
            }, false);
            
            document.addEventListener("dragover", function(event) {
                event.preventDefault();
            }, false);
            
            function main() {
                timerContainer = document.getElementById("time-container");
                timerContainer.innerText = getFormatedDateTime();
                
                window.setInterval(() => {
                    timerContainer.innerText = getFormatedDateTime();
                }, 1000);
            }
            
            function getFormatedDateTime() {
                const now = new Date();
                
                const fullYear = now.getFullYear();
                const month = now.getMonth();
                const date = now.getDate();
                const hour = now.getHours();
                const minutes = now.getMinutes();
                const seconds = now.getSeconds();
                
                const formatedDateTime = `${fullYear}.${month}.${date} ${hour}:${minutes}:${seconds}`;
                
                return formatedDateTime;
            }
        </script>
    </body>
</html>

效果

在这里插入图片描述

参考

Web technology for developers > Web APIs > HTML Drag and Drop API

Web technology for developers > Web APIs > Document > Document: drag event

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值