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进行定位。
相关推荐
codingWhat3 小时前
介绍一个手势识别库——AlloyFinger
前端·javascript·vue.js
Lee川3 小时前
深度拆解:基于面向对象思维的“就地编辑”组件全模块解析
javascript·架构
进击的尘埃3 小时前
Web Worker 与 OffscreenCanvas:把主线程从重活里解放出来
javascript
codingWhat3 小时前
手撸一个「能打」的 React Table 组件
前端·javascript·react.js
进击的尘埃3 小时前
用 TypeScript 的 infer 搓一个类型安全的深层路径访问工具
javascript
yuki_uix3 小时前
Object.entries:优雅处理 Object 的瑞士军刀
前端·javascript
Lee川3 小时前
JavaScript 面向对象编程全景指南:从原始字面量到原型链的终极进化
javascript·面试
Neptune17 小时前
JavaScript回归基本功之---类型判断--typeof篇
前端·javascript·面试
进击的尘埃7 小时前
微前端沙箱隔离:qiankun 和 wujie 到底在争什么
javascript
子兮曰8 小时前
后端字段又改了?我撸了一个 BFF 数据适配器,从此再也不怕接口“屎山”!
前端·javascript·架构