HTML笔记()蜘蛛纸牌之卡牌拖拽

效果

代码

html 复制代码
<!DOCTYPE html>
<html>
    <head>
        <style>
            body{
                display: flex;
                justify-content: center;
                align-items: center;
                height: 100vh;
                background-color: #2b2b2b;
                position: relative;
            }
            .card{
                /*设置卡牌的外观*/
                width: 150px;
                height: 200px;
                background-color: #00ffcc;
                border-radius: 10px;
                /*为卡牌中间的图案设置格式*/
                font-size: 100px;
                font-weight: bold;
                display: flex;
                justify-content: center;
                align-items: center;
                /*方便左上角和右下角的数字定位*/
                position: absolute;
                /*避免选择到文本*/
                user-select: none;
            }
            /*设置卡牌两个对角的数字格式*/
            .pos-TL{
                position: absolute;
                font-size: 20px;
                top: 5px;
                left: 5px;
            }
            .pos-BR{
                position: absolute;
                font-size: 20px;
                bottom: 5px;
                right: 5px;
                transform: rotateZ(180deg);
            }
        </style>
    </head>
    <body>
        <div id="card" class="card">♠️
            <div class="card-num pos-TL">6</div>
            <div class="card-num pos-BR">6</div>
        </div>
        <script>
            let offsetX, offsetY, isDragging = false;
            const card = document.getElementById("card");

            card.addEventListener("mousedown", (e) => {
                isDragging = true;
                const cardrect = card.getBoundingClientRect(); // 每次拖动开始时更新位置
                offsetX = e.clientX - cardrect.left;
                offsetY = e.clientY - cardrect.top;
            });

            document.addEventListener("mousemove", (e) => {
                if (isDragging) {
                    card.style.left = `${e.clientX - offsetX}px`;
                    card.style.top = `${e.clientY - offsetY}px`;
                }
            });

            document.addEventListener("mouseup", () => {
                isDragging = false;
            });
        </script>
    </body>
</html>

总结

  • const只能申明单个变量,否则报错
html 复制代码
<script>
	const offsetX,offsetY = false;//❌
	let offsetX,offsetY = false //✅
</script>
  • 不要实时获取的值赋给其他变量
html 复制代码
cardrect = card.getBoundingClientRect();\\之前写了这句,只会获得点击时候的鼠标位置,而无法获取到拖拽过程中的鼠标位置
  • 忘记在<div class = "card">里添加id="card"
  • 属性为absolute的元素的定位不是取决于离他最近的含有relative的父元素,而是取决于离他最近的还有position的父元素。所以我们的代码里既能让card相对body移动,又能让cardnum相对card进行定位。
相关推荐
阿珊和她的猫3 小时前
IIFE:JavaScript 中的立即调用函数表达式
开发语言·javascript·状态模式
智商偏低3 小时前
JSEncrypt
javascript
hssfscv4 小时前
Javaweb学习笔记——后端实战2_部门管理
java·笔记·学习
2501_944711435 小时前
构建 React Todo 应用:组件通信与状态管理的最佳实践
前端·javascript·react.js
困惑阿三5 小时前
2025 前端技术全景图:从“夯”到“拉”排行榜
前端·javascript·程序人生·react.js·vue·学习方法
苏瞳儿5 小时前
vue2与vue3的区别
前端·javascript·vue.js
于越海5 小时前
材料电子理论核心四个基本模型的python编程学习
开发语言·笔记·python·学习·学习方法
我命由我123455 小时前
开发中的英语积累 P26:Recursive、Parser、Pair、Matrix、Inset、Appropriate
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法
北岛寒沫5 小时前
北京大学国家发展研究院 经济学原理课程笔记(第二十三课 货币供应与通货膨胀)
经验分享·笔记·学习
wdfk_prog6 小时前
[Linux]学习笔记系列 -- [fs][proc]
linux·笔记·学习