HTML学习笔记(六) 元素拖放

简介: HTML学习笔记(六) 元素拖放

在 HTML5 中,任何元素都能够被拖放

要使得一个元素是可拖动的,必须将它的 draggable 属性设置为 true

<div draggable="true">我是可以被拖动的</div>


在拖动元素的过程中,会触发相关的事件,与源对象(被拖动元素)相关的事件如下:

  • ondragstart:开始拖动元素时触发
  • ondrag:元素正在拖动时触发
  • ondragend:完成元素拖动后触发
<!DOCTYPE html>
<html>
<head>
    <title>Drag Demo</title>
    <head>
        <style>
            #source-object {
                width: 50px;
                height: 50px;
                border: 1px solid red;
                background-color: red;
            }
        </style>
        <script>
            function dragstart(event) { console.log('dragstart') }
            function drag(event) { console.log('drag') }
            function dragend(event) { console.log('dragend') }
        </script>
    </head>
</head>
<body>
    <div id="source-object"
         draggable="true"
         ondragstart="dragstart(event)"
         ondrag="drag(event)"
         ondragend="dragend(event)" >
    </div>
</body>
</html>


另外,我们还能监听在元素释放时触发的事件,与目标对象(其实就是释放区域)相关的事件如下:


  • ondragenter:当被拖动元素进入释放区域时触发
  • ondragover  :当被拖动元素在释放区域移动时触发
  • ondragleave:当被拖动元素离开释放区域时触发
  • ondrop:当被拖动元素在释放区域释放时触发
<!DOCTYPE html>
<html>
<head>
    <title>Drop Demo</title>
    <head>
        <style>
            #source-object {
                width: 50px;
                height: 50px;
                border: 1px solid red;
                background-color: red;
            }
            #target-object {
                width: 100px;
                height: 100px;
                border: 1px solid blue;
                background-color: blue;
            }
        </style>
        <script>
            function dragenter(event) { console.log('dragenter') }
            function dragover(event) {
                // dragover 事件的默认行为是阻止数据或元素放置到其他元素中
                // 如果想要避免这种情况,就必须阻止 dragover 的默认行为
                // 只有这样,才能触发 drop 事件
                event.preventDefault()
                console.log('dragover')
            }
            function dragleave(event) { console.log('dragleave') }
            function drop(event) {
                // 对于图片等元素,drop 事件的默认行为是以链接的形式打开
                // 如果想要避免这种情况,就必须阻止 drop 的默认行为
                event.preventDefault()
                console.log('drop')
            }
        </script>
    </head>
</head>
<body>
    <div>请将红色方框移入蓝色方框</div>
    <br />
    <div id="source-object" draggable="true"></div>
    <br />
    <div id="target-object"
         ondragenter="dragenter(event)"
         ondragover="dragover(event)"
         ondragleave="dragleave(event)"
         ondrop="drop(event)" >
    </div>
</body>
</html>


拖放事件还有一个新的属性 dataTransfer,用于在源对象和目标对象之间传递数据

dataTransfer 它是一个对象,常用的方法有两个:


  • setData(key, value):在源对象设置数据
  • getData(key):在目标对象获取数据
<!DOCTYPE html>
<html>
<head>
    <title>Drag And Drop Demo</title>
    <head>
        <style>
            #source-object {
                width: 50px;
                height: 50px;
                border: 1px solid red;
                background-color: red;
            }
            #target-object {
                width: 100px;
                height: 100px;
                border: 1px solid blue;
                background-color: blue;
            }
        </style>
        <script>
            // 源对象事件
            function dragstart(event) {
                event.dataTransfer.setData('elemId', event.target.id)
            }
            // 目标对象事件
            function dragover(event) {
                event.preventDefault()
            }
            function drop(event) {
                event.preventDefault()
                var elemId = event.dataTransfer.getData('elemId')
                var elem = document.getElementById(elemId)
                event.target.appendChild(elem)
            }
        </script>
    </head>
</head>
<body>
    <div>请将红色方框移入蓝色方框</div>
    <br />
    <div id="source-object"
         draggable="true"
         ondragstart="dragstart(event)" >
    </div>
    <br />
    <div id="target-object"
         ondragover="dragover(event)"
         ondrop="drop(event)">
    </div>
</body>
</html>


最后来一个拖放在实际应用中的例子,实现文件拖拽上传功能

<!DOCTYPE html>
<html>
<head>
    <title>Drag And Drop Demo</title>
    <head>
        <style>
            #file-input {
                width: 300px;
                height: 100px;
                border-radius: 50px;
                border: 1px dashed black;
                display: flex;
                flex-direction: row;
                justify-content: center;
                align-items: center;
            }
        </style>
        <script>
            window.onload = function() {
                var fileInput = document.getElementById('file-input')
                fileInput.ondragover = function(event) {
                    event.preventDefault()
                }
                fileInput.ondrop = function(event) {
                    event.preventDefault()
                    // 每次只获取第一个文件对象
                    var file = event.dataTransfer.files[0]
                    // 检查
                    let isRightType = checkFileType(file)
                    let isRightSize = checkFileSize(file)
                    // 提示
                    if (isRightType && isRightSize) {
                        alert('上传文件成功')
                    } else if (!isRightType) {
                        alert('只支持 DOCX、TXT、MD 文件格式')
                    } else if (!isRightSize) {
                        alert('文件不能大于 2 M')
                    }
                }
                function checkFileType(file) {
                    let allowedTypes = ['DOCX', 'TXT', 'MD']
                    let fileInfo = file.name.split('.')
                    let fileType = fileInfo[fileInfo.length - 1].toUpperCase()
                    return allowedTypes.includes(fileType)
                }
                function checkFileSize(file) {
                    let maxSize = 2 * 1024 * 1024
                    let fileSize = file.size
                    return fileSize <= maxSize
                }
            }
        </script>
    </head>
</head>
<body>
    <div id="file-input">请将文件拖动到此处</div>
</body>
</html>

目录
相关文章
|
4月前
|
JavaScript 前端开发 开发者
Vue 动态添加 HTML 元素组件封装使用方法及长尾关键词优化指南
本文详细介绍了Vue中动态添加HTML元素的使用方法与组件封装技巧。内容涵盖条件渲染(v-if/v-show)、列表渲染(v-for)、动态组件(:is)、手动操作DOM及动态创建组件实例等核心方法。同时,通过动态表单、弹窗组件和动态加载组件的封装示例,展示如何提升代码复用性和可维护性。最后,总结性能优化策略与注意事项,如批量更新DOM、懒加载大型组件及避免直接操作DOM等,帮助开发者在实际项目中灵活应用Vue动态元素管理功能。
96 15
|
4月前
|
JavaScript 前端开发 开发者
Vue 动态添加 HTML 元素组件封装使用方法及长尾关键词优化指南
本文详细介绍了Vue中动态添加HTML元素的多种方法与组件封装技巧,涵盖条件渲染(v-if/v-show)、列表渲染(v-for)、动态组件(:is)、手动DOM操作及动态创建组件实例等内容。同时提供了性能优化建议,如批量更新DOM、使用v-show代替v-if以及懒加载大型组件等。通过合理封装组件,可提高代码复用性和维护性。文中还附有具体示例代码,帮助开发者更好地理解和应用相关技术。适用于前端开发人员学习和实践Vue动态元素处理与组件设计。
110 19
|
4月前
|
缓存 JavaScript 前端开发
Vue 项目中动态添加 HTML 元素的方法与实践
本文探讨了 Vue 中动态添加 HTML 元素的多种技术方案,包括条件渲染(v-if/v-show)、动态组件(component :is)、手动挂载($mount)及 Vuex 状态管理等方法。通过实例分析,如动态表单生成器与全局模态框服务,展示了这些方案在实际开发中的应用。同时提供了性能优化建议和注意事项,帮助开发者根据需求选择最佳方式,在保持 Vue 响应式特性的同时实现灵活交互。附带代码示例,便于理解和实践。
100 2
|
10月前
|
存储 移动开发 数据处理
HTML5 元素2
HTML5引入了多个新元素以增强表单功能和用户体验。`&lt;keygen&gt;`元素用于生成密钥对,提交表单时生成私钥和公钥,私钥保存在客户端,公钥发送至服务器,用于后续的身份验证。`&lt;output&gt;`元素则用于展示计算结果或其他脚本输出,如表单数据处理的结果。此外,`&lt;datalist&gt;`元素可与`&lt;input&gt;`元素结合使用,提供预定义的选项列表,增强输入的便捷性和准确性。这些元素共同提升了网页的交互性和安全性。
|
9月前
|
移动开发 前端开发 JavaScript
HTML5 <nav> 元素2
HTML5中的`&lt;nav&gt;`标签用于定义页面的导航链接部分,但并非所有链接都需置于其中。`&lt;aside&gt;`标签定义页面主内容外的相关信息,如侧边栏。`&lt;header&gt;`标签描述文档或节的头部区域,可用于定义内容的介绍展示区。示例包括导航、家庭旅行记录和IE9发布信息等。
|
10月前
|
移动开发 UED HTML5
HTML5 表单元素1
HTML5引入了新的表单元素,如`&lt;datalist&gt;`、`&lt;keygen&gt;`和`&lt;output&gt;`,以增强表单的功能性和用户体验。
|
10月前
|
移动开发 HTML5
HTML5 拖放(Drag 和 Drop)2
为了实现元素的可拖放功能,首先需将元素的 `draggable` 属性设为 `true`。接着,使用 `ondragstart` 事件指定拖动开始时的动作,通过 `dataTransfer.setData()` 设置拖动数据的类型和值。`ondragover` 事件用于确定放置位置,并通过 `event.preventDefault()` 允许放置。最后,`ondrop` 事件触发时执行放置操作,使用 `dataTransfer.getData()` 获取拖动数据并将其追加到目标元素中。
|
10月前
|
Web App开发 移动开发 iOS开发
HTML5 拖放(Drag 和 Drop)1
HTML5拖放功能是标准的一部分,允许用户将任何元素从一个位置拖放到另一个位置。此功能在主流浏览器如IE、Firefox、Chrome和Safari中得到支持(注意Safari 5.1.2除外)。通过拖放,可以实现更直观的交互体验,例如将RUNOOB.COM图标拖入指定矩形框内。
|
11月前
HTML 元素
HTML文档由HTML元素定义,元素包括开始标签、内容和结束标签。某些元素内容为空,可在开始标签中关闭。大多数元素可拥有属性,且元素间可相互嵌套,形成复杂结构。
|
9月前
|
Web App开发 移动开发 iOS开发
HTML5 语义元素1
HTML5引入了语义元素,如`&lt;nav&gt;`、`&lt;header&gt;`、`&lt;footer&gt;`等,这些元素能清晰地向浏览器和开发者传达其内容的意义,如导航链接、头部和尾部。与非语义元素(如`&lt;div&gt;`)不同,语义元素使网页结构更加明确,有助于提升可读性和可访问性。例如,`&lt;section&gt;`标签用于定义文档中的节,而`&lt;article&gt;`标签则用于定义独立的内容,如论坛帖子、博客文章等。这些新元素在IE9及更高版本、Firefox、Chrome、Safari和Opera中得到支持。