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进行定位。
相关推荐
程序猿的程2 小时前
开源一个 React 股票 K 线图组件,传个股票代码就能画图
前端·javascript
大雨还洅下3 小时前
前端JS: 虚拟dom是什么? 原理? 优缺点?
javascript
唐叔在学习3 小时前
[前端特效] 左滑显示按钮的实现介绍
前端·javascript
青青家的小灰灰3 小时前
深入理解事件循环:异步编程的基石
前端·javascript·面试
前端Hardy4 小时前
HTML&CSS&JS:打造丝滑的3D彩纸飘落特效
前端·javascript·css
前端Hardy4 小时前
HTML&CSS&JS:丝滑无卡顿的明暗主题切换
javascript·css·html
UIUV6 小时前
node:child_process spawn 模块学习笔记
javascript·后端·node.js
烛阴7 小时前
Three.js 零基础入门:手把手打造交互式 3D 几何体展示系统
javascript·webgl·three.js
颜酱7 小时前
单调栈:从模板到实战
javascript·后端·算法
_AaronWong9 小时前
Electron 实现仿豆包划词取词功能:从 AI 生成到落地踩坑记
前端·javascript·vue.js