js拖拽事件实现简单选课功能

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        html, body {
            width: 100%;
            height: 100%;
            min-width: 1100px;
            background-color: rgb(87, 202, 11);
        }
        .content {
            border-radius: 5px;
            color: #fff;
            font-weight: bolder;
            display: flex;
            align-items: center;
            justify-content: center;
            height: 100%;
            padding: 30px 50px;
        }
        .list {
            width: 130px;
            flex: none;
            background: rgb(212, 195, 109);
            border-radius: 10px;
            margin-right: 20px;
            padding: 10px 0;
        }
        .item {
            background-color: cornflowerblue;
            width: 80px;
            height: 45px;
            line-height: 45px;
            color: #fff;
            font-size: 18px;
            font-weight: bolder;
            border-radius: 10px;
            text-align: center;
            cursor: pointer;
            margin: 10px auto;
        }
        .courses-box {
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: antiquewhite;
            border-radius: 10px;
            flex: none;
            width: 900px;
            height: 600px;
            box-sizing: border-box;
            padding: 30px;
        }
        .time-box {
            width: 30px;
            flex: none;
            margin-right: 30px;
            padding-top: 30px;
        }
        .time {
            width: 30px;
            height: 200px;
            background-color: rgb(10, 164, 112);
            border-radius: 10px;
            margin-top: 15px;
            /* 文字排列方向 */
            writing-mode: vertical-lr;
            text-align: center;
            letter-spacing: 10px;
            padding-left: 3px;
        }
        .day-box {
            flex: 1;
            height: 100%;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            border-radius: 10px;
        }
        .day {
            width: 100%;
            flex: none;
            display: flex;
            align-items: center;
            justify-content: space-around;
        }
        .day span {
            width: 80px;
            height: 35px;
            line-height: 35px;
            margin-bottom: 10px;
            background-color: rgb(10, 164, 112);
            border-radius: 5px;
            text-align: center;
        }
        .courses {
            flex: 1;
            width: 100%;
            background-color: rgb(10, 164, 112);
            border-radius: 10px;
            display: flex;
            align-items: center;
            justify-content: space-around;
            padding: 10px;
        }
        .course-box {
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: space-around;
        }
        .course {
            width: 90px;
            height: 50px;
            background-color: beige;
            margin: 5px 0;
            border-radius: 5px;
            display: flex;
            align-items: center;
        }
        .course:nth-child(4) {
            margin-bottom: 15px;
        }
        .drag-over {
            background-color: rgb(159, 69, 69);
        }
    </style>
</head>
<body>
    <div class="content">
        <div class="list" data-allowed="move">
        	<!-- draggable为true元素才能拖拽 -->
            <div class="item" draggable="true" data-effect="copy">语文</div>
            <div class="item" draggable="true" data-effect="copy">数学</div>
            <div class="item" draggable="true" data-effect="copy">英语</div>
            <div class="item" draggable="true" data-effect="copy">科学</div>
            <div class="item" draggable="true" data-effect="copy">体育</div>
            <div class="item" draggable="true" data-effect="copy">地理</div>
            <div class="item" draggable="true" data-effect="copy">历史</div>
            <div class="item" draggable="true" data-effect="copy">物理</div>
        </div>
        <div class="courses-box">
            <div class="time-box">
                <div class="time">上午</div>
                <div class="time">下午</div>
            </div>
            <div class="day-box">
                <div class="day">
                    <span>星期一</span>
                    <span>星期二</span>
                    <span>星期三</span>
                    <span>星期四</span>
                    <span>星期五</span>
                    <span>星期六</span>
                    <span>星期日</span>
                </div>
                <div class="courses"></div>
            </div>
        </div>
    </div>
    <script src="./drag.js"></script>
</body>
</html>

js

const content = document.querySelector('.content');
const coursesDom = document.querySelector('.courses');
const courses = new Array(7).fill({
    morning: new Array(4).fill(''),
    afternoon: new Array(4).fill(''),
})

const renderCourses = () => {
    courses.forEach((dayCourse) => {
        const { morning, afternoon } = dayCourse;
        const div = document.createElement('div');
        div.classList.add('course-box');
        [...morning, ...afternoon].forEach((course) => {
            const span = document.createElement('span');
            span.textContent = course;
            span.classList.add('course');
            span.dataset.allowed = 'copy';
            div.appendChild(span);
        });
        coursesDom.appendChild(div);
    });
}

renderCourses();

const clearStyle = () => {
    const doms = document.querySelectorAll('.drag-over');
    doms.forEach((dom) => {
        dom.classList.remove('drag-over');
    });
}

// 当前在拖拽的元素变量
let source = null;
content.ondragstart = (e) => {
    // e.target为当前拖拽的元素
    console.log('srart', e.target);
    // 改变鼠标样式为copy样式,为一个加号
    e.dataTransfer.effectAllowed = e.target.dataset.effect;  // 取值:move、copy等
    source = e.target;
};

content.ondragover = function(e) {
    e.preventDefault();
    // e.target为当前停留的元素,不停触发
    console.log('over', e.target);
};

const findParentNode = (node) => {
    while(node) {
        if (node.dataset && node.dataset.allowed) {
            return node;
        }
        node = node.parentNode;
    }
}

content.ondragenter = (e) => {
    e.preventDefault();
    // e.target为当前进入的元素
    console.log('enter', e.target);
    clearStyle();
    const node = findParentNode(e.target);
    if (!node) {
        return;
    }
    if (source.dataset.effect === node.dataset.allowed) {
        e.target.classList.add('drag-over');
    }
};

content.ondragleave = (e) => {
    // e.target为当前离开的元素
    console.log('leave', e.target);
};

content.ondrop = (e) => {
    clearStyle();
    // e.target松开鼠标时所在的元素,这个方法能被触发,要确保ondragover中 e.preventDefault();因为元素默认是不允许其他元素拖到上面的
    console.log('drop', e.target);
    if (source.dataset.effect === e.target.dataset.allowed) {
        if (source.dataset.effect === 'copy') {
            e.target.innerHTML = '';
            const dom  = source.cloneNode(true);
            dom.dataset.effect = 'move';
            e.target.appendChild(dom);
        } else {
            // 清空所有子元素
            source.remove();
        }
    }
};

效果图
在这里插入图片描述

### 关于 Keil 5 的使用教程开发指南 #### 工具概述 Keil MDK (Microcontroller Development Kit) 是一款专为 ARM 微控制器设计的强大集成开发环境,其中包含了编译器、调试器以及仿真工具等功能模块。它支持多种微处理器架构,并广泛应用于嵌入式系统的开发过程中[^1]。 #### 安装流程概览 对于初次接触该软件的用户而言,可以从官方渠道或者可信第三方资源获取最新版本的安装文件。按照所提供的保姆图文指导文档逐步操作即可顺利完成部署过程。具体步骤包括但不限于解压压缩包、运行设置向导直至确认许可协议等内容;期间需注意选择合适的组件选项以满足特定需求场景下的功能扩展要求。 #### 基础界面介绍与基本操作说明 启动程序后会进入主窗口,在这里可以创建新工程或是打开已有项目。主要组成部分有菜单栏、工具条、编辑区等多个区域构成。利用这些控件能够实现源码编写、参数调整等一系列活动: - **新建工程项目**: 用户可以通过 File -> New Project 来初始化一个新的应用程序框架结构。 - **添加目标设备**: 在弹出对话框里指定所使用的 MCU 类型以便后续生成适配硬件特性的链接脚本及其他必要配置项。 - **导入C/C++源文件**: 将预先准备好的算法逻辑片段拖拽至相应目录下并建立关联关系便于统一管理维护。 - **构建执行映像**: 调用 Build 功能触发整个流水线作业链条运作起来——预处理、翻译转换成机器可读形式最后打包封装成为最终产物供实际测试验证环节调用[^2]。 #### 高效技巧分享 为了进一步提升工作效率还可以学习掌握一些高特性比如宏定义批量替换字符串模式匹配查找定位错误位置等等实用技能点位来辅助日常编码任务开展得更加顺畅高效: ```c #define DEBUG_PRINT(fmt, ...) printf("[DEBUG] " fmt "\n", ##__VA_ARGS__) // Example usage of the macro defined above. DEBUG_PRINT("Variable value is %d.", variable); ``` 上述代码展示了如何自定义打印函数用于调试目的同时保持良好的格式化输出效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊啊啊~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值