拖拽:从Dojo到HTML5
v-draggable的用法
`v-draggable` 是一个Vue.js 的指令,它用于在元素上添加可拖动的能力。
这个指令是基于HTML5 的拖放API 实现的。
使用`v-draggable` 指令,你可以使一个元素具有可拖动的行为,例如在一个列表中拖动元素来重新排序。
用法:1. 在需要拖动的元素上添加`v-draggable` 指令。
```html<div v-draggable="list"><div>Item 1</div><div>Item 2</div><div>Item 3</div></div>```在上面的例子中,`v-draggable="list"` 将元素及其子元素设置为可拖动。
`list` 是一个数组,用于存储元素的顺序。
当元素被拖动时,数组的顺序会相应地更新。
2. 你还可以使用`v-model` 绑定一个数组,以存储元素的顺序。
```html<div v-model="list"><div v-for="(item, index) in list" :key="index">{{ item }}</div></div>```在上面的例子中,`v-model="list"` 将元素的顺序与`list` 数组进行双向绑定。
当元素被拖动时,数组的顺序会自动更新,反之亦然。
3. 如果你只想在特定条件下启用或禁用拖动,你可以使用`v-if` 或`v-show` 指令。
```html<div v-if="isDraggable"><!-- 当isDraggable 为true 时才启用拖动--><div v-draggable="list"><div>Item 1</div><div>Item 2</div><div>Item 3</div></div></div>以上是`v-draggable` 的基本用法,如果你想更深入了解它的详细用法和选项,你可以查阅Vue.js 的官方文档或相关教程。
elementui 拖拽指令
elementui 拖拽指令ElementUI是一套基于Vue.js 2.0的组件库,提供了许多UI组件和工具,其中包括拖拽指令。
拖拽是一种常用的用户交互方式,可以让用户方便地将元素从一个位置拖到另一个位置,ElementUI的拖拽指令可以非常方便地实现这种交互。
1. 基本用法ElementUI的拖拽指令是el-draggable,可以用在任何可以拖拽的元素上。
例如,我们有一个div元素,需要使它可以被拖拽,只需添加el-draggable指令即可:```<template><div v-el-draggable>Drag Me</div></template>```这样就可以使这个div元素可以被拖拽了。
如果需要设置更多的拖拽选项,可以在指令中传递一个对象配置:这个配置中指定了一个分组为“items”,拖拽动画时间为200毫秒。
2. 高级用法除了基本的拖拽功能外,ElementUI的拖拽指令还支持一些高级用法,例如拖拽限制、拖拽排序等。
2.1. 拖拽限制如果希望在拖拽时只能在指定的区域内拖拽,可以指定一个限制区域。
限制区域可以是选择器字符串或一个DOM元素,这个区域内的元素才可以被拖拽。
有时候需要对拖拽的元素进行排序,可以利用ElementUI的拖拽排序功能。
拖拽排序需要使用另一个指令el-sortable,并且是在多个元素之间进行的。
```<template><div v-el-sortable="{ group: 'items' }"><div v-el-draggable class="item">Item 1</div><div v-el-draggable class="item">Item 2</div><div v-el-draggable class="item">Item 3</div></div></template>```这个例子中,使用了el-sortable指令来对多个元素进行拖拽排序,并指定了分组为“items”。
html5菜鸟教程
html5菜鸟教程
HTML5 菜鸟教程(无标题)
HTML5 是一种用于构建和呈现网页的标准化语言。
它具有很
多新特性和语法,能够满足不同需求的网页开发。
HTML5 的语法结构与以前的 HTML 版本有所不同。
它提供了更加语义化的标签,例如 `<header>`、`<nav>`、`<section>` 等,这样可以更清晰地表示网页的结构。
在 HTML5 中,可以使用 `<video>` 和 `<audio>` 标签直接在网
页中嵌入视频和音频文件,而不需要借助插件。
这极大地简化了网页开发的流程。
此外,在 HTML5 中也新增了很多表单元素和属性,如
`placeholder`、`required` 等。
这些特性可以提升用户体验,使
网页的交互更加友好。
除了标签和属性的更新外,HTML5 也引入了许多 JavaScript API,如 Geolocation API、Web Storage API、Canvas API 等。
这些 API 扩展了网页的功能,增加了与用户交互的方式。
总结来说,HTML5 是一种强大的网页开发语言,它具有更语
义化的标签结构、嵌入视频和音频的能力以及丰富的JavaScript API。
通过学习和掌握 HTML5,开发者可以创建出
更加现代化、交互性强的网页。
draggable.js 使用实例
一、介绍draggable.jsdraggable.js是一个轻量级的JavaScript库,用于实现网页元素的拖拽功能。
它具有简单易用的特点,可以帮助开发者快速地实现网页元素的拖拽效果。
draggable.js使用纯JavaScript编写,不依赖于任何其他库或框架,可以在任何现代浏览器中运行。
二、draggable.js的使用方法1. 引入draggable.js在HTML文件中引入draggable.js文件,可以通过在<head>标签中添加<script>标签来引入该文件,示例如下:```html<script src="draggable.js"></script>```2. 添加可拖拽的元素在需要实现拖拽功能的元素上,添加draggable属性,示例如下:```html<div draggable="true">这是一个可拖拽的元素</div>```3. 初始化拖拽功能在JavaScript文件中初始化拖拽功能,示例如下:```javascriptconst draggableElement =document.querySelector('[draggable=true]');draggableElement.addEventListener('dragstart', function(event) {event.dataTransfer.setData('text/pl本人n', '这是一个可拖拽的元素');});```4. 添加放置目标如果需要将拖拽元素放置到特定的目标位置,需要在目标位置添加dropzone属性,示例如下:```html<div dropzone="copy">将拖拽元素放置到这里</div>```5. 初始化放置功能在JavaScript文件中初始化放置功能,示例如下:```javascriptconst dropzone = document.querySelector('[dropzone=copy]');dropzone.addEventListener('dragover', function(event) {event.preventDefault();});dropzone.addEventListener('drop', function(event) {const data = event.dataTransfer.getData('text/pl本人n');dropzone.innerText = data;});```6. 配置拖拽属性除了基本的拖拽功能外,draggable.js还支持配置拖拽属性,如拖拽元素的限制范围、拖拽时的样式变化等。
jquery实现鼠标拖拽div改变位置
jquery实现鼠标拖拽div改变位置jQuery是一个JavaScript库,它提供了一些简单而强大的工具,可以方便地操作HTML文档、处理事件以及实现动画效果。
在本文中,将展示如何使用jQuery实现一个鼠标拖拽div改变位置的效果。
这个效果可以让用户通过点击鼠标左键拖动一个div元素,并将其放置到新的位置上。
首先,需要创建一个div元素,并给它添加一个唯一的ID,以便能够通过这个ID获取到该元素。
例如:```html<div id="dragContainer" style="width: 200px; height: 200px; background-color: #ccc; position: absolute; top: 100px; left:100px;"></div>```上述代码创建了一个宽高为200px的div,并设置了背景颜色为灰色。
使用`position: absolute`样式使得该div可以在页面上任意位置显示,初始位置为(100px,100px)。
接下来,需要编写一段jQuery代码,以实现鼠标拖拽效果。
代码如下:```javascript$(document).ready(functiovar isDragging = false;var dragElement;var offsetX, offsetY;$('#dragContainer').mousedown(function(e) isDragging = true;dragElement = $(this);// 计算鼠标相对于div的偏移量offsetX = e.offsetX;offsetY = e.offsetY;});$(document).mousemove(function(e)if (isDragging)// 计算div的新位置var newX = e.pageX - offsetX;var newY = e.pageY - offsetY;// 设置div的新位置dragElement.cssleft: newX + 'px',top: newY + 'px'});}});$(document).mouseup(functioisDragging = false;});});```上述代码首先在document的`ready`事件中定义了一些变量,包括`isDragging`用于判断是否正在拖拽、`dragElement`表示被拖拽的div 元素、`offsetX`和`offsetY`表示鼠标相对于div的偏移量。
HTML5教程
HTML5教程
1.基本语法
- <html> 元素:整个 HTML 文档的根元素。
- <head> 元素:用于定义页面的元数据,如标题、字符集等。
- <body> 元素:用于定义页面的主要内容。
- <header>:定义网页或区域的页眉,通常包含网站的标题、logo 和导航栏等。
- <nav>:定义导航链接的区域。
- <article>:定义独立的自包含内容,如一篇新闻文章、一篇博客等。
- <section>:定义文档中的一个章节或一个相关内容的组合。
- <aside>:定义页面的侧边栏或附加内容。
- <video>:用于嵌入视频文件,并支持各种视频格式和播放控制。
- <audio>:用于嵌入音频文件,并支持各种音频格式和播放控制。
- <canvas>:提供了一个用于绘制图形、动画和游戏的区域,可以使用 JavaScript 进行控制。
- <svg>:用于定义矢量图形,可以在 HTML 文档中嵌入矢量图形。
3.特性
- 本地存储:HTML5 提供了 LocalStorage 和 SessionStorage,可以在客户端存储数据,不需要向服务器发送请求。
-响应式布局:HTML5提供了新的媒体查询功能,可以根据设备的屏幕尺寸和方向来调整网页的布局和样式。
- 可访问性改进:HTML5 引入了一些新的元素和属性,用于更好地支持可访问性,如 aria-* 属性和 <figure> 元素等。
js拖拽方法
js拖拽方法一、拖拽方法概述在JavaScript中,拖拽功能是用户与网页交互的一种常见方式。
通过拖拽,用户可以轻松地完成元素的重排、移动、缩放等操作。
本文将介绍JavaScript拖拽方法的分类及具体实现步骤,并给出两个实用的第三方库拖拽实例。
二、JavaScript拖拽方法分类1.原生拖拽原生拖拽是指使用JavaScript原生实现拖拽功能。
它通过监听鼠标事件(mousedown、mousemove、mouseup)来实现元素的拖拽。
2.第三方库拖拽第三方库拖拽是指使用一些成熟的库(如Dragula、Sortable.js等)来实现拖拽功能。
这些库封装了拖拽的细节,使用起来简单便捷,且具有丰富的功能和良好的可扩展性。
三、原生拖拽实现步骤1.获取元素首先,需要获取需要拖拽的元素。
可以使用getElementById、getElementsByClassName等方法获取。
2.添加事件监听器在获取到元素后,为元素添加mousedown、mousemove、mouseup 事件监听器。
3.实现拖拽功能在mousemove事件中,根据鼠标的移动方向和速度,计算元素的新位置,并更新元素样式。
4.释放事件监听器在mouseup事件中,释放mousedown事件监听器。
四、第三方库拖拽实例1.使用Dragula实现拖拽Dragula是一个轻量级的拖拽库,支持原生拖拽和惯性拖拽。
首先,引入Dragula库,然后为需要拖拽的元素添加dragula事件监听器。
具体使用方法可参考Dragula官方文档。
2.使用Sortable.js实现拖拽Sortable.js是一个基于HTML的拖拽库,支持拖拽列表、网格等多种布局。
首先,引入Sortable.js库,然后根据需求配置相关选项。
具体使用方法可参考Sortable.js官方文档。
五、拖拽应用场景拖拽功能广泛应用于网页设计中,如组件拖拽、文件上传、图片排序等。
通过使用拖拽功能,可以提高用户体验,使界面更加灵活。
html元素拖动互换位置原理
html元素拖动互换位置原理HTML元素拖动互换位置原理介绍在Web开发中,经常会遇到需要实现元素的拖动和互换位置的需求。
这种功能可以为用户提供更好的交互体验,增强网页的可用性。
本文将从浅入深,逐步介绍HTML元素拖动互换位置的原理。
基础知识在深入了解HTML元素拖动互换位置的原理之前,我们首先需要了解一些基础知识。
HTML元素HTML元素是Web页面中的构建块。
它们由标签定义,并包含内容和属性。
常见的HTML元素包括<div>、<span>、<p>等。
DOM (Document Object Model)DOM是用于表示和操控HTML文档的一个API。
它将HTML文档解析为一个树结构,使开发人员可以通过编程方式访问和操作HTML元素。
通过DOM,我们可以动态改变网页的结构和样式。
实现原理鼠标事件要实现拖动元素,我们首先需要监听鼠标事件。
常用的鼠标事件包括:•mousedown:鼠标按下事件,触发时记录鼠标位置和拖动元素的初始位置。
•mousemove:鼠标移动事件,触发时根据鼠标位置计算拖动元素应该移动的距离,并实时更新元素的位置。
•mouseup:鼠标松开事件,触发时停止更新元素位置,拖动结束。
拖动元素当鼠标按下时,我们可以开始拖动元素。
实现拖动元素的关键步骤包括:1.记录鼠标位置和拖动元素的初始位置。
2.监听mousemove事件,根据鼠标位置计算拖动的距离。
3.更新元素的位置,使其跟随鼠标移动。
互换位置通过拖动元素,我们可以将它移动到指定位置。
要实现元素的互换位置,我们可以借助DOM来完成。
实现互换位置的步骤如下:1.监听mouseup事件,拖动结束时执行互换操作。
2.根据鼠标位置确定目标位置。
3.使用DOM操作,将被拖动元素插入到目标位置的前面或后面,从而实现位置的互换。
实际应用HTML元素拖动互换位置的原理在实际应用中非常常见,比如:•排序功能:用户可以通过拖动来改变元素的顺序,从而实现列表的排序。
网页设计与制作教程-Web前端开发 第6版 第11章 HTML5的拖放和画布
第11章 HTML5的拖放和画布
11.2 画布
本节介绍画布。
目录
11.1 拖放 11.2 画布 习题11
第11章 HTML5的拖放和画布
11.2 画布
11.2.1 创建canvas元素 canvas元素的主要属性是画布宽度属性width和高度属性height,单位是像素。 向页面中添加canvas元素的语法格式为: <canvas id="画布标识" width="画布宽度" height="画布高度">
11.2 画布
11.2 画布
11.2.3 绘制图形的步骤 在创建好的canvas上,通过JavaScript绘制图形的步骤如下: 1)创建canvas对象。
2)创建coห้องสมุดไป่ตู้text对象。
3)绘制图形。
11.2 画布
11.2.4 绘制图形 1.绘制矩形 (1)绘制填充的矩形 fillRect()方法用来绘制填充的矩形,语法格式为: fillRect(x, y, weight, height);
… </canvas>
例如,创建一个标识为myCanvas,宽度为200像素,高度为100像素的 <canvas>元素,代码如下:
<canvas id="myCanvas" width="200" height="100"></canvas>
11.2 画布
11.2.2 构建绘图环境 其语法格式为: canvas.getContext(contextID)
(2)绘制矩形轮廓 strokeRect()方法用来绘制矩形的轮廓,语法格式为: strokeRect(x, y, weight, height);
js drag用法举例
js drag用法举例JSdrag用法是指在网页开发中利用JavaScript实现拖拽功能的一种方法。
这种技术可以使用户通过鼠标操作在页面上拖拽元素,实现交互效果。
下面我们来举例说明JS drag用法。
一、基本用法第一步:设置拖拽元素首先,我们需要设置能够被拖拽的元素。
通过以下代码可以实现: var dragElement =document.getElementById('drag-element');其中“drag-element”是我们在HTML中设置的元素ID。
第二步:设置拖拽事件接着,我们需要设置拖拽事件。
通过以下代码可以实现:dragElement.addEventListener('dragstart',function(event) {// 拖拽开始});dragElement.addEventListener('dragend', function(event) {// 拖拽结束});其中“dragstart”表示拖拽开始事件,“dragend”表示拖拽结束事件。
第三步:设置放置区域最后,我们需要设置能够放置拖拽元素的区域。
通过以下代码可以实现:var dropZone = document.getElementById('drop-zone');dropZone.addEventListener('dragover', function(event) { event.preventDefault();});dropZone.addEventListener('drop', function(event) {// 在放置区域放置拖拽元素});其中“dragover”表示拖拽元素经过放置区域时触发的事件,“drop”表示拖拽元素放置在放置区域时触发的事件。
二、实际应用除了基本用法外,JS drag用法还可以用于实现更复杂的交互效果。
v-draggable的基本使用方法
v-draggable的基本使用方法v-draggable 是基于 Vue 的一个指令,用于实现拖拽功能。
它提供了一些钩子函数和参数,可以方便地控制元素的拖拽过程。
基本的使用方法如下:1. 首先,你需要将 v-draggable 引入到你的项目中。
可以通过直接引入 Vue.js,或者使用 Vue CLI 创建项目来获取。
2. 在 HTML 模板中,找到你要添加拖拽功能的元素,添加 v-draggable 指令,并绑定一些参数和事件。
例如:```<template><div><div v-draggable="options" @dragstart="dragStart"@dragend="dragEnd">拖拽我</div></div></template>```3. 在 Vue 的实例中,定义一些参数和事件处理函数。
例如:```<script>export default {data() {return {options: {// 参数配置// 可以在这里定义一些拖拽的限制条件、边界、拖拽方向等}}},methods: {dragStart(event) {// 拖拽开始时的事件处理函数// 可以在这里对元素进行一些样式或数据的修改},dragEnd(event) {// 拖拽结束时的事件处理函数// 可以在这里对拖拽完成后的元素进行一些操作}}}</script>```以上就是 v-draggable 的基本使用方法。
你可以根据自己的需求,通过参数配置和事件处理函数来实现不同的拖拽效果。
draggable和sortable使用方法
draggable和sortable是HTML5中的两个非常重要的拖放API,它们为网页开发者提供了一种方便的方式来处理可拖动元素和列表。
本文将详细介绍这两个API的使用方法。
一、draggable属性draggable属性用于指定元素是否可以被拖动。
当一个元素被设置为draggable属性后,用户就可以通过拖动鼠标来移动该元素。
使用方法:1. 在HTML元素中添加draggable属性,值为true或false。
示例:<div draggable="true">可以被拖动</div>注意事项:* draggable属性只对块级元素有效,对于行内元素和表格单元格不起作用。
* 在某些浏览器中,draggable属性可能受到安全限制,需要进行适当的安全性检查。
二、sortable选项sortable选项提供了一个简单的方式来创建可排序的列表。
用户可以通过拖放来重新排列列表中的项目。
使用方法:1. 在HTML元素中添加一个可拖动元素(如div或li),并为其添加id或其他唯一标识符。
2. 在JavaScript中,使用sortable选项来初始化列表并定义排序规则。
示例:HTML代码:<ul id="myList"><li draggable="true">项目1</li><li draggable="true">项目2</li><li draggable="true">项目3</li></ul>JavaScript代码:var myList =document.getElementById("myList");var options = {itemTagName: "li", revert: true}; // 设置列表标签为li,并允许元素返回原位置var sortable = new Sortable(myList, options); // 初始化列表并应用排序规则注意事项:* sortable选项适用于ul、ol等列表元素,不适用于table元素。
pc前端实现拖拽拼接公式的方法
pc前端实现拖拽拼接公式的方法前端实现拖拽拼接公式可以通过使用HTML、CSS和JavaScript来实现。
下面我将提供一种基本的方法来实现该功能。
首先,在HTML中创建一个可拖拽和可放置的容器,用于显示拼接后的公式。
我们可以使用`<div>`元素作为这个容器,并为其设置一个唯一的`id`属性,以便在后续的JavaScript代码中进行操作。
```html<div id="formula-container" ondrop="drop(event)" ondragover="allowDrop(event)"></div>```在页面上创建一些拖拽源,用于表示公式中的元素。
在这个例子中,我们使用`<span>`元素作为拖拽源,并给它们设置一个唯一的`id`属性,用于标识不同的元素。
```html<span id="element1" draggable="true"ondragstart="drag(event)">Element 1</span><span id="element2" draggable="true"ondragstart="drag(event)">Element 2</span><span id="element3" draggable="true"ondragstart="drag(event)">Element 3</span>```接下来,在JavaScript代码中实现拖拽和放置的功能。
我们需要实现`drag`函数和`drop`函数,并在合适的地方定义一些辅助函数。
HTML5拖放drag及文件拖拽上传
HTML5拖放drag及⽂件拖拽上传HTML5中提供了拖放的api,只需要监听拖放事件,就可以完成相应的功能。
1、可拖放元素默认情况下,img 元素和 a 元素,以及⽂本都是可拖动的,⽽其他元素是不能。
想要拖放某个元素,必须设置该元素的 draggable 属性为 true,当该属性为 false 时,将不允许拖放。
<img src="img/img1.png" alt="" draggable="false">2、拖放事件拖放事件是发⽣在两个地⽅的:⼀个是被拖放的元素上,另⼀个是拖放⽬标元素上的。
dragstart:被拖放元素上发⽣,按下⿏标键并开始移动是触发,此时光标变成”不能放”符号(圆环中有⼀条反斜线)drag:被拖放元素上发⽣,⿏标拖动期间持续触发(类似mousemove)dragend:被拖放元素上发⽣,拖动停⽌时触发dragenter:拖放⽬标元素上发⽣,元素被拖到该⽬标上触发(类似mouseover)dragover:拖放⽬标元素上发⽣,被拖放元素在放置⽬标范围内移动时持续触发dragleave:拖放⽬标元素上发⽣,被拖放元素拖出了放置⽬标范围时触发drop:拖放⽬标元素上发⽣,被拖放元素放置到了⽬标元素中时触发(在⽬标元素范围内释放⿏标键)所有的元素都⽀持放置⽬标事件(dragenter,dragover,dragleave,drop),但只有⼀些元素默认允许放置,如input,⼤多数元素是不允许放置的,即不是有效的放置⽬标,不会发⽣drop事件。
为了让元素变成可放置,可以重写 dragenter 和 dragover 事件的默认⾏为,只要阻⽌他的默认⾏为就可以了。
在Firefox中,drop事件的默认⾏为是打开被放到⽬标元素上的URL。
即把图⽚或链接拖放到⽬标上,页⾯会转向该图⽚或者该链接页⾯;⽽拖放⽂本到⽬标上,则导致url错误。
简洁的drag效果,自由拖拽div的实现及注意点
简洁的drag效果,⾃由拖拽div的实现及注意点偶然间看到了以前做的⼀个简洁的div拖拽效果,修改了⼀下加点注释,经测试完美通过firefox/chrome/ie6-11,现拿来分享⼀下。
先说⼀下实现原理及要点,最主要的有三步。
第⼀步是mousedown事件,⿏标mousedown的时候记录此时的⿏标X轴和Y轴以及拖拽框的left和top,并且给拖拽标记赋值true,代表拖拽动作就绪。
第⼆步是mousemove事件,此时动态获取⿏标的X轴和Y轴,然后计算出来拖拽框新的left和top并赋值使其实现拖拽效果。
第三步是mouseup事件,⿏标弹起时给拖拽标记赋值false,拖拽动作完成。
html代码如下:<div class="divWrap" id="move1" style="width: 200px; height: 200px; background: Green; border: 1px solid red; position: absolute; top: 100px; left: 100px; cursor: move; -moz-user-select: none; -webkit-user-select: none;"></ <div class="divWrap" style="width: 200px; height: 200px; background: brown; border: 1px solid red; position: absolute; top: 300px; left: 100px;"><h3 id="move2" style="height: 45px; line-height: 45px; font-size: 18px; background: red; margin: 0; cursor: move; -moz-user-select: none; -webkit-user-select: none;">Title--Move</h3></div>js代码如下:(function($) {$.fn.dragDiv = function(divWrap) {return this.each(function() {var $divMove = $(this);//⿏标可拖拽区域var $divWrap = divWrap ? $divMove.parents(divWrap) : $divMove;//整个移动区域var mX = 0, mY = 0;//定义⿏标X轴Y轴var dX = 0, dY = 0;//定义div左、上位置var isDown = false;//mousedown标记if(document.attachEvent) {//ie的事件监听,拖拽div时禁⽌选中内容,firefox与chrome已在css中设置过-moz-user-select: none; -webkit-user-select: none;$divMove[0].attachEvent('onselectstart', function() {return false;});}$divMove.mousedown(function(event) {var event = event || window.event;mX = event.clientX;mY = event.clientY;dX = $divWrap.offset().left;dY = $divWrap.offset().top;isDown = true;//⿏标拖拽启动});$(document).mousemove(function(event) {var event = event || window.event;var x = event.clientX;//⿏标滑动时的X轴var y = event.clientY;//⿏标滑动时的Y轴if(isDown) {$divWrap.css({"left": x - mX + dX, "top": y - mY + dY});//div动态位置赋值}});$divMove.mouseup(function() {isDown = false;//⿏标拖拽结束});});};})(jQuery);//$(document).ready(function() {$("#move1").dragDiv();//拖拽整个div$("#move2").dragDiv(".divWrap");//拖拽div头部});最后要说明⼀下,在开始拖拽动作之前,要禁⽌选中内容,否则影响拖拽效果。
html draggable的用法
HTML draggable的用法随着互联网技术的不断发展,HTML5作为最新的网页标准,独特的拖放功能给我们提供了更多的可能性。
其中,draggable属性是HTML5中新增加的一个属性,用来定义元素是否可拖动。
在本文中,我们将详细介绍draggable的用法,包括基本语法、属性值、事件处理以及实际应用等方面。
一、基本语法draggable属性是HTML5中新增的一个属性,用来定义元素是否可以拖动。
在HTML标签中使用draggable属性时,可以通过设置属性值来指定元素的可拖动状态。
基本的语法格式如下所示:<element draggable="true|false">其中,<element>表示需要设置可拖动属性的HTML元素,如<div>、<span>、<img>等;draggable属性指定该元素是否可以被拖动,属性值为true时表示可拖动,为false时表示不可拖动。
二、属性值draggable属性的属性值可以是true或者false。
当属性值为true时,表示元素可以被拖动;当属性值为false时,表示元素不可以被拖动。
需要注意的是,draggable属性的属性值只能是lowercase,即全部小写字母。
三、事件处理在实际应用中,我们通常需要对可拖动元素进行一些事件处理,例如拖动开始、拖动过程中、拖动结束等。
在HTML5中,可以使用一些相关的事件来处理这些操作。
具体来说,与draggable属性相关的事件主要包括以下几种:1. dragstart事件:表示拖动开始时触发的事件,一般用于初始化拖动操作。
2. drag事件:表示拖动过程中触发的事件,一般用于实时更新拖动元素的位置。
3. dragend事件:表示拖动结束时触发的事件,一般用于完成拖动操作后的收尾工作。
通过添加事件监听器,我们可以在相应的事件发生时执行自定义的JavaScript代码,从而实现对可拖动元素的事件处理。
拖拽排序题
拖拽排序题一、基础概念拖拽排序题是一种基于拖拽功能的交互题型,用户可以通过拖拽元素进行排序。
这种题型常用于在线教育、游戏、应用等场景中,以提高用户的参与度和互动性。
二、实现方式1.HTML/CSS/JavaScript2.拖拽排序题的实现通常使用HTML、CSS和JavaScript等技术。
HTML用于构建页面结构,CSS用于样式设计,JavaScript用于实现拖拽功能和排序逻辑。
3.前端框架4.可以使用前端框架如React、Vue等来更高效地实现拖拽排序题。
这些框架提供了丰富的组件和API,可以快速构建出复杂的交互效果。
5.后端技术6.后端技术主要用于存储和获取数据,如使用Node.js、Python等后端语言和数据库技术。
后端可以处理用户提交的答案,并返回分数和反馈信息。
三、性能优化1.减少DOM操作2.在实现拖拽排序题时,应该尽量减少DOM操作,以提高页面的加载速度和响应速度。
可以使用虚拟DOM技术或DOM diffing算法来减少不必要的DOM操作。
3.数据本地存储4.将排序数据存储在本地可以减少后端请求次数,提高性能。
可以使用Web存储(localStorage或sessionStorage)来存储用户数据。
5.使用CDN加速资源加载6.将静态资源如图片、CSS和JavaScript文件部署在CDN上,可以加速资源加载速度,提高用户体验。
四、用户体验1.直观的视觉效果2.拖拽排序题的视觉效果应该直观易懂,元素的大小和颜色应该符合实际含义。
可以使用图标和标签来辅助说明。
3.顺畅的拖拽体验4.拖拽排序题的拖拽效果应该平滑,用户可以轻松地拖拽元素进行排序。
可以使用CSS的transition或animation属性来提高拖拽体验。
5.及时的反馈信息6.在用户进行拖拽排序时,应该及时给出反馈信息,如元素的位置和状态。
同时,当用户提交答案时,应该给出分数和正确答案提示。
五、交互细节1.鼠标悬停效果2.当鼠标悬停在可拖拽元素上时,应该给出明显的悬停效果,如改变颜色或大小,以提示用户该元素可被拖拽。
流程图(HTML5拖拽)
流程图(HTML5拖拽)1<!DOCTYPE html>2<html lang="en">34<head>5<meta charset="UTF-8">6<title>Document</title>7<style type="text/css">8 #d1 {9 width: 800px;10 height: 800px;11 border: 1px solid #ccc;12 position: relative;13 background: #fafafa;14 }1516 #d1>div {17 width: 130px;18 height: 30px;19 border: 1px solid #ccc;20 border-radius: 8px;21 position: absolute;22 z-index: 2;23 text-align: center;24 line-height: 30px;25 background: #fff;26 }2728 #d1>svg {29 width: 100%;30 height: 100%;31 position: absolute;32 z-index: 133 }3435 .input .point {36 position: absolute;37 border: 6px solid transparent;38 border-top: 6px solid #ccc;39 top: 0px;40 left: 58px;41 }4243 .input .circle {44 position: absolute;45 width: 10px;46 height: 10px;47 border: 1px solid #ccc;48 top: -7px;49 left: 60px;50 border-radius: 50%;51 background: #fff;52 }5354 .output .circle {55 position: absolute;56 width: 15px;57 height: 15px;58 border: 1px solid #ccc;59 bottom: -10px;60 left: 57px;61 border-radius: 50%;62 background: #fff;63 cursor: crosshair;64 z-index: 10;65 }6667 .output .circle:hover {68 background: #FC9901;69 }70</style>71</head>7273<body>74<ul class="shuiguo">75<li draggable="true" data-name="ps1">ps1</li>76<li draggable="true" data-name="ps2">ps2</li>77<li draggable="true" data-name="ps3">ps3</li>78<li draggable="true" data-name="ps4">ps4</li>79<li draggable="true" data-name="switch">switch</li>80</ul>81<div id="d1">82<svg>8384</svg>85</div>86<script src="https:///jquery/3.2.1/jquery.min.js"></script>87<script type="text/javascript">88var dragData = [];89//重置拖拽后流程图展⽰90function reload(isend) {91 $(function() {92var html = "";93var g = `94 <defs>95 <marker id="markerArrow1" markerWidth="10" markerHeight="10" refX="0" refY="3" orient="auto" markerUnits="strokeWidth">96 <path d="M0,1 L0,5 L3,3 z" fill="#CCCCCC"></path>97 </marker>98 <marker id="markerArrow2" markerWidth="10" markerHeight="10" refX="0" refY="3" orient="auto" markerUnits="strokeWidth">99 <path d="M0,1 L0,5 L3,3 z" fill="#cccdff"></path>100 </marker>101 <marker id="markerArrow3" markerWidth="10" markerHeight="10" refX="3" refY="2.6" orient="auto" markerUnits="strokeWidth">102 <path fill="#f00" d="m6.75848,4.22161c-0.13193,0.12924 -0.3468,0.12924 -0.47903,0l-3.03436,-2.97252c-0.13193,-0.12953 -0.13223,-0.33974 0,-0.46927c0.13163,-0.12953 0.3465,-0.12953 0.47933,0l3.03406,2.97223c0.13 103 </marker>104 </defs>105 `;106if($('svg').siblings()) { //清除$('svg')范围外的所有元素107var prev = $('svg').siblings();108for(var i = 0; i < prev.length; i++) {109 prev[i].remove();110 }111 }112 console.log(dragData);113for(var i = 0; i < dragData.length; i++) { //循环dragData,重置流程图所有dom节点114if(dragData[i] != undefined) {115var data = dragData[i];116 html +=117 `118 <div class = "${}" data-drag="1" data-id = "${data.id}" data-inx = "${data.inx}" data-iny = "${data.iny}" data-label = "${bel}" ondragstart = "insideDrag(this)" draggable = "true" style = "transform:translate(${d 119 <span class = "${data.icon}" data-id = "${data.id}"></span>120 <span data-id = "${data.id}">${bel}</span>121 <div class = "output">122 <span class = "circle" title = "输出" onmousedown = "noDrag(this)" onmouseup = "addDrag(this)" onmouseleave = "draw(this)" onmouseenter = "noMove()" data-id = "${data.id}"></span>123 </div>124 </div>125 `126if(data.link.length > 0) {127for(var j = 0; j < data.link.length; j++) {128 g +=129 `130 <g id="${data.link[j].name}">131 <path style="cursor:pointer" d = "M${data.outx} ${data.outy} Q${data.link[j].mx1} ${data.link[j].my1} ${data.link[j].mx2} ${data.link[j].my2} T${data.link[j].dx} ${data.link[j].dy}" stroke = "#CCCCCC" fill 132 </g>133 `134 }135 }136 }137 }138 $('svg').before(html);139 $('svg').html(g);140if(isend) {141 $('svg').on('mouseenter', "path", function() {142 $(this).attr({143 "stroke": "#cccdff",144 "marker-end": "url(#markerArrow2)",145 "marker-mid": "url(#markerArrow3)"146 })147 }).on('mouseleave', "path", function() {148 $(this).attr({149 "stroke": "#cccccc",150 "marker-end": "url(#markerArrow1)",151 "marker-mid": ""152 })153 }).on('click', "path", function() {154var $p = $(this).parent();155var id = $p[0].id;156for(var i = 0; i < dragData.length; i++) {157var data = dragData[i];158for(var j = 0; j < data.link.length; j++) {159if(id == data.link[j].name) {160 data.link.splice(j, 1)161 }162 }163for(var j = 0; j < data.linked.length; j++) {164if(id == data.linked[j].name) {165 data.linked.splice(j, 1)166 }167 }168 }169 $p.remove()170 });171 } else {172 $('svg').off('mouseenter mouseleave', "path");173 }174 console.log($('svg').siblings());175 })176 }177//reload();178 document.getElementById('d1').ondragover = function(e) {179 e.preventDefault(); //流程图展⽰区阻⽌默认事件180 }181var dWidth = Number($('#d1').css('width').slice(0, -2)); //流程图展⽰区域宽度182 console.log(dWidth);183var dHeight = Number($('#d1').css('height').slice(0, -2)); //流程图展⽰区域⾼度184 console.log(dHeight);185var dClient = $("#d1").offset().top; //流程图展⽰区偏移位置top186var dLeft = $("#d1").offset().left; //流程图展⽰区偏移位置left187 console.log('顶部位置', dClient);188 console.log('左边位置', dLeft);189190//模块拖进流程图后,初始化拖拽⽅法191/*192 * word:模块名称193 * name:模块数据名称194 * type:拖拽事件类型,⽤于判断来执⾏不同拖拽事件,"outside":拖拽完成,"inside":开始拖拽195 * id:模块id196*/197function drag(word, name, type, id) {198 console.log(type);199 console.log(name);200//在可拖动元素放置在 <div> 元素中时执⾏事件ondrop201 document.getElementById('d1').ondrop = function(e) {202var sTop = $(document).scrollTop(); //⽂档滚动条偏移量top203var sLeft = $(document).scrollLeft(); //⽂档滚动条偏移量left204 console.log('e.target', e.target.dataset.id);205var x, y;206 console.log('e.clientX', e.clientX);207 console.log('e.clientY', e.clientY);208if((dWidth - e.clientX + dLeft + 65) - sLeft >= 132) {209 x = e.clientX - 65 - dLeft + sLeft;210 } else {211 x = dWidth - 133;212 }213if((e.clientX - dLeft) < 65) {214 x = 1;215 }216if((dHeight - e.clientY + dClient + 15) - sTop >= 33) {217 y = e.clientY - 15 - dClient + sTop;218 } else {219 y = dHeight - 33;220 }221if(e.clientY - 15 - dClient + sTop < 0) {222 y = 1;223 }224if(type == "outside") {225 console.log('放下了');226 dragData.push({227 id: dragData.length,228 label: word,229 name: name,230 x: x, //模块相对展⽰区域的位移x231 y: y, //模块相对展⽰区域的位移y232 outx: x + 68, //模块输出点位置x/贝塞尔曲线起点x233 outy: y + 30, //模块输出点位置y/贝塞尔曲线起点y234 inx: x + 65, //模块输⼊点位置x235 iny: y - 1, //模块输⼊点位置y236 link: [], //存放由该模块连接的关联线数据数组237 linked: [], //存放由其他模块连接该模块的关联线数据数组238 dx: 0,239 dy: 0,240 mx1: 0,241 my1: 0,242 mx2: 0,243 my2: 0,244 style: name,245 draw: false,246 icon: name + "Icon"247 });248 console.log(dragData);249 reload(1);250 }251if(type == "inside") {252 console.log(word, name, type, id);253for(var i = 0; i < dragData.length; i++) {254if(id == dragData[i].id) {255 dragData[i].x = x;256 dragData[i].y = y;257 dragData[i].outx = dragData[i].x + 68;258 dragData[i].outy = dragData[i].y + 30;259 dragData[i].inx = dragData[i].x + 65;260 dragData[i].iny = dragData[i].y - 1;261 console.log('dragData[i].link', dragData[i].link);262for(let j = 0; j < dragData[i].link.length; j++) {263 dragData[i].link[j].linkId = parseFloat(dragData[i].link[j].name.split("|")[1]);264 }265for(var k = 0; k < dragData[i].linked.length; k++) {266 console.log('dragData[i].linked[k]', dragData[i].linked[k]);267for(let j = 0; j < dragData.length; j++) {268if(dragData[i].linked[k].linkedNum == dragData[j].id) {269 console.log('ID⼀样了啊');270for(let m = 0; m < dragData[j].link.length; m++) {271if(dragData[i].linked[k].name == dragData[j].link[m].name) {272 console.log("名字⼀样了啊");273 dragData[j].link[m].dx = dragData[i].inx;274 dragData[j].link[m].dy = dragData[i].iny-10;275 dragData[j].link[m].mx1 = dragData[j].outx;276 dragData[j].link[m].my1 = dragData[j].link[m].dy > dragData[j].outy ? dragData[j].outy + (dragData[j].link[m].dy - dragData[j].outy) / 3 : dragData[j].outy - (dragData[j].link[m].dy - dragData[j].outy) 277 dragData[j].link[m].mx2 = dragData[j].outx + (dragData[j].link[m].dx - dragData[j].outx) / 2,278 dragData[j].link[m].my2 = dragData[j].outy + (dragData[j].link[m].dy - dragData[j].outy) / 2279 }280 }281 }282 }283 }284if(dragData[i].link.length > 0) {285for(var j = 0; j < dragData[i].link.length; j++) {286 dragData[i].link[j].mx1 = dragData[i].outx;287 dragData[i].link[j].my1 = dragData[i].link[j].dy > dragData[i].outy ? dragData[i].outy + (dragData[i].link[j].dy - dragData[i].outy) / 3 : dragData[i].outy - (dragData[i].link[j].dy - dragData[i].outy) / 3;288 dragData[i].link[j].mx2 = dragData[i].outx + (dragData[i].link[j].dx - dragData[i].outx) / 2,289 dragData[i].link[j].my2 = dragData[i].outy + (dragData[i].link[j].dy - dragData[i].outy) / 2290 }291 }292 }293 }294 reload(1);295 }296 }297 }298var shuiguo = $('.shuiguo li');299var isondrag = 0;300 console.log(shuiguo);301for(var i = 0; i < shuiguo.length; i++) {302 console.log(shuiguo[i]);303 shuiguo[i].ondragstart = function() {304 console.log('东完了')305 drag(this.innerHTML, , 'outside');306 }307 }308309function insideDrag(item) {310 console.log(item);311if(item.getAttribute('draggable')) {312 drag(bel, item.className, 'inside', item.dataset.id);313 }314 }315316function noDrag(item) {317 event.preventDefault();318 event.stopPropagation();319 console.log(item.parentNode.parentNode);320var parent = item.parentNode.parentNode;321 parent.setAttribute('draggable', false);322for(var i = 0; i < dragData.length; i++) {323for(var d = 0; d < dragData[i].link.length; d++) {324if(!~dragData[i].link[d].name.indexOf("|")) {325 dragData[i].link.splice(d, 1)326 }327 }328if(parent.dataset.id == dragData[i].id) {329 dragData[i].draw = true;330 dragData[i].link.push({331 name: parent.dataset.id + parent.className,332 dx: 0,333 dy: 0,334 mx1: 0,335 my1: 0,336 mx2: 0,337 my2: 0338 });339 $('body').on('mouseup', function(e) {340for(var j = 0; j < dragData.length; j++) {341if(parent.dataset.id == dragData[j].id) {342 console.log('页⾯抬起了');343 dragData[j].draw = false;344var $dom = $(e.target).data("drag") ? $(e.target) : $(e.target).closest("div[data-drag]");345if($dom.length) {346if($dom.data("drag") && $dom[0].dataset.id != dragData[j].id) { //判断是否关联另外模块,⾮⾃⼰347 $('svg').unbind('mousemove');348var name = dragData[j].link[dragData[j].link.length - 1].name + "|" + $dom[0].dataset.id + $dom[0].className;349var isontbe = 0; //判断是否存在关联350for(let i = 0; i < dragData.length; i++) {351if($dom[0].dataset.id == dragData[i].id) {352for(let c = 0; c < dragData[i].linked.length; c++) {353if(name == dragData[i].linked[c].name) {354 isontbe = 1355 }356 }357if(!isontbe) { //不存在时候存⼊linked358 dragData[i].linked.push({359 name: name,360 linkedNum: parseFloat(name)361 })362 }363 }364 }365if(!isontbe) { //不存在时候⽣成link数据366 dragData[j].link[dragData[j].link.length - 1].name = name;367 dragData[j].link[dragData[j].link.length - 1].dx = Number($dom[0].dataset.inx);368 dragData[j].link[dragData[j].link.length - 1].dy = Number($dom[0].dataset.iny)-10;369 } else {370 dragData[j].link.splice(dragData[j].link.length - 1, 1);371 }372 } else {373 dragData[j].link.splice(dragData[j].link.length - 1, 1);374 }375 } else {376 dragData[j].link.splice(dragData[j].link.length - 1, 1);377 }378 $('svg').unbind('mousemove');379 reload(1);380 }381 }382 $('body').unbind('mouseup');383 })384//reload();385 }386 }387 }388389function addDrag(item) {390var parent = item.parentNode.parentNode;391 parent.setAttribute('draggable', true);392for(var i = 0; i < dragData.length; i++) {393if(parent.dataset.id == dragData[i].id) {394 dragData[i].draw = false;395 console.log(dragData[i]);396 }397 }398 }399400function draw(item) {401var parent = item.parentNode.parentNode;402 parent.setAttribute('draggable', true);403for(var i = 0; i < dragData.length; i++) {404if(parent.dataset.id == dragData[i].id) {405if(dragData[i].draw == true) {406 $('svg').mousemove(function(e) {407 console.log(parent.dataset.id);408for(var i = 0; i < dragData.length; i++) {409if(parent.dataset.id == dragData[i].id) {410 console.log(dragData[i]);411if(dragData[i].link[dragData[i].link.length - 1]) {412 dragData[i].link[dragData[i].link.length - 1].dx = e.offsetX;413 dragData[i].link[dragData[i].link.length - 1].dy = e.offsetY-10;414 dragData[i].link[dragData[i].link.length - 1].mx1 = dragData[i].outx;415 dragData[i].link[dragData[i].link.length - 1].my1 = dragData[i].dy > dragData[i].outy ? dragData[i].outy + (dragData[i].dy - dragData[i].outy) / 3 : dragData[i].outy - (dragData[i].dy - dragData[i].outy) / 3 416 dragData[i].link[dragData[i].link.length - 1].mx2 = dragData[i].outx + (dragData[i].dx - dragData[i].outx) / 2,417 dragData[i].link[dragData[i].link.length - 1].my2 = dragData[i].outy + (dragData[i].dy - dragData[i].outy) / 2418 }419//////////////////////////////////////////////420 dragData[i].dx = e.offsetX;421 dragData[i].dy = e.offsetY-10;422 dragData[i].mx1 = dragData[i].outx;423if(dragData[i].dy > dragData[i].outy) {424 dragData[i].my1 = dragData[i].outy + (dragData[i].dy - dragData[i].outy) / 3;425 } else {426 dragData[i].my1 = dragData[i].outy - (dragData[i].dy - dragData[i].outy) / 3;427 }428 dragData[i].mx2 = dragData[i].outx + (dragData[i].dx - dragData[i].outx) / 2429 dragData[i].my2 = dragData[i].outy + (dragData[i].dy - dragData[i].outy) / 2430 }431 }432 reload();433 console.log(2333);434 })435 } else {436 $('svg').unbind('mousemove');437 }438439 }440 }441 }442443function noMove() {444 $('svg').unbind('mousemove');445 }446 $('svg').mouseup(function(e) {447 console.log(e.target);448 $('svg').unbind('mousemove');449for(var i = 0; i < dragData.length; i++) {450 dragData[i].draw = false;451 }452 console.log('起来了');453 })454</script>455</body>456457</html>参考了/zhaoxiang66/article/details/78063271根据⼤神的思路加强了功能,修复了bug。
draggable的用法
draggable的用法draggable 是 HTML5 中提供的一个可拖拽对象。
这个新的功能可以让用户把网页中的元素拖拽到不同的位置。
它是一个新的功能,可以让用户把网页中的元素拖拽到不同的位置,网页元素可以是文本、图片、媒体等任何元素,它可以用于创建网页动效,以及制作游戏等。
Draggable 属性提供了一种启用拖拽功能的方法,使得在开发者的网页中,不同的元素展示出拖拽的功能。
Draggable 属性可以被写在任何 HTML 元素上,它的值可以是true 或 false。
当它设置为 true 时,元素就可以被拖拽;当它设置为 false 时,元素将不能被拖拽。
通过设置 Draggable 的方法,可以使网页中任何元素拥有拖拽能力,比如图片、文本等。
在一个具体的 HTML 元素中,我们可以将其设置成可拖拽,以下是一个拖拽文本框的案例:<div draggable="true">这是一个可拖拽的文本框</div>Draggable 属性拥有如下的属性:ondragstart:当用户开始拖动元素时,会触发 ondragstart 事件ondrag:当用户拖动元素时,会触发 ondrag 事件ondragend:当用户结束拖动元素时,会触发 ondragend 事件以上都是Draggable 属性提供的属性,它们都具有一定的功能。
使用这些属性,可以让网页中的元素具有拖拽功能。
Draggable 也可以用于创建拖拽功能的游戏。
我们可以创建一个拖拽游戏,使用JavaScript 对拖拽后的元素进行动作响应。
比如:我们可以创建一个拖拽俄罗斯方块的游戏,用户可以把方块拖拽到指定的位置,方块拖拽完之后,就可以根据设定的规则获得相应的分数了。
Draggable 功能的运用是非常广泛的,它可以极大的丰富网页的交互式体验,而且具有益处,能使用户有趣的把网页中的元素拖拽到不同位置,改变不同的网页布局,或者对网页中的元素执行不同的操作,从而改善用户体验。
dragenter的范围
dragenter的范围dragenter是HTML5中的一个事件,它在一个可拖动元素进入一个可放置目标的范围时触发。
这个事件通常与dragover和drop事件一起使用,用于实现拖放操作。
在拖放操作中,dragenter事件的范围非常重要。
它定义了哪些元素可以接受被拖动元素的放置。
在这篇文章中,我们将探讨dragenter事件的范围以及它的一些应用。
我们需要了解拖放操作中的两个角色:可拖动元素和可放置目标。
可拖动元素是指那些可以被用户拖动的HTML元素,比如图片、文本框等。
可放置目标是指那些可以接受被拖动元素放置的HTML元素,比如容器、文本框等。
当用户开始拖动一个可拖动元素时,会触发dragstart事件。
然后,当用户将可拖动元素拖动到一个可放置目标上时,会触发dragenter事件。
在这个事件中,我们可以通过一些判断条件来确定是否接受被拖动元素的放置。
我们可以使用event.preventDefault()方法来阻止默认的放置行为。
这样,我们可以自定义拖放操作的行为。
接着,我们可以使用event.dataTransfer.types属性来获取被拖动元素的数据类型。
这个属性返回一个DOMStringList对象,它包含了被拖动元素的数据类型。
我们可以通过判断这个列表中是否包含我们所期望的数据类型来确定是否接受放置。
除了数据类型,我们还可以使用其他条件来确定是否接受放置。
比如,我们可以使用event.dataTransfer.effectAllowed属性来获取被拖动元素的放置效果。
这个属性返回一个字符串,表示被拖动元素的放置效果。
我们可以通过判断这个字符串是否包含我们所期望的放置效果来确定是否接受放置。
在dragenter事件中,我们还可以做一些其他的操作。
比如,我们可以改变被拖动元素的外观,比如改变其边框颜色或背景色。
我们可以使用event.target属性来获取当前触发事件的元素,然后通过修改其样式来改变其外观。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
拖拽:从Dojo到HTML5编辑点评:拖拽是Web 2.0 应用中最流行的技术之一。
本文将介绍如何在网络应用程序中使用dojo 和HTML5 这两种技术的拖拽功能。
并将通过示例详细介绍HTML5 的拖拽功能。
Dojo 及HTML 5 简介Dojo 是目前最流行的开源JavaScript 工具库之一,很多开发者以及企业用户都把Dojo 作为首选的JavaScript 工具。
Dojo 为Web 应用的开发提供了大量的客户端组件,能够让你可以方便的进行HTML DOM 操作、拖拽、AJAX 调用、定制可视化控件等来使得你的Web 应用变成富网络应用(RIA)。
而且Dojo 在性能、可访问性、多语言支持以及文档方面都做的非常出色,这也是企业选择Dojo 的原因之一。
HTML 5 是最新一代的HTML,它将成为HTML、XHTML 以及HTML DOM 的新标准,HTML 5 是W3C 与WHATWG 合作的结果,目前仍外于开发中; 自从上一代HTML4,Web 世界已经发生了巨大的变化,HTML 5 的到来将更大的促进Web 的发展,HTML 5 提供了很多新的功能,主要有:◆新的HTML 元素,例如section, nav, header, footer, article 等◆用于绘画的Canvas 元素◆用于多媒体播放的video 和audio 元素◆用于定位的Geolocation API◆本地存储以及离线应用◆Web Workers◆拖拽API◆文件API我们主要对HTML 5 的拖拽功能进行讲解,并结合文件API 与桌面进行交互。
来与Dojo 的dnd 拖拽组件进行比较。
使用Dojo 创建及定制拖拽应用类似Dojo 其他组件,拖拽的实现有两种方式:声明式和编程式。
在这里我们使用声明式的方式做简要的介绍。
在Dojo 拖拽实现中,有两个重要的元素dojo.dnd.Source 和dojo.dnd.Target。
这两个元素分别标示了拖拽中的源容器Source 和目标容器Target。
值得注意的是源容器Source 默认也是目标容器Target,而不需要作目标容器Target 的声明。
我们在源容器Source 中创建一些可以拖动的元素,要让这些元素可拖动,我们要为这些元素添加class 属性值DojoDndItem。
下面的示例代码定义了一个源容器Source 以及一些可以拖动的元素。
在这些可以拖动的元素中我们可以定义它们的拖拽类型dndType。
dndType 的值开发者可以自己定义,而目标容器Target 元素的accept 属性定义了该目标容器接受的拖拽类型。
清单1. 创建拖拽的源容器和可拖拽的元素1. div id="source" style="height:400px;" dojoType="dojo.dnd.Source"2. div id="item1" class="dojoDndItem item" dndType="divItem"item1/div3. img src="w3c.jpg" class="dojoDndItem item" dndType="imageItem"/img4. a href="/TR/html5/" class="dojoDndItem item" dndType="linkItem"5. HTML5 specification/a6. /div对于Target 我们可以创建一个div,然后加上属性dojoType=dojo.dnd.Target 和属性accept。
不在accept 中的类型的dojoDndItem 元素将不被这个容器接受。
例如清单2 中的目标容器只接受divItem 和imageItem 这两种类型,那么清单1 中的linkItem 将不能被拖到这个目标容器中。
清单2. 创建拖拽的目标容器和可接受的类型1. div id="target" style="height:400px;" dojoType="dojo.dnd.Target"2. accept="divItem, imageItem"真正Web 应用的拖拽没有这么简单,开发者往往需要在拖拽的过程中更多的介入。
这时候可以通过对Dojo 提供的dojo.dnd.Source 和dojo.dnd.Target 进行继承扩展,开发满足业务需要的功能和特性。
这里将不赘述。
使用HTML 5 创建拖拽应用在这一章中,我们将要使用HTML 5 创建一个简单的拖拽应用,如图1 所示,用户可以把网页上内容从左边的区域拖放到右边的区域。
这个应用程序的代码可到附件中可以下载。
图1. HTML 5 拖拽应用效果图创建可以拖动的节点使用HTML 5 创建拖拽只需要对可拖拽的节点进行声明给可以拖拽的节点添加draggable 属性并设值为true。
如清单3 中的div 节点,通过添加draggable 属性就可以拖拽了。
在HTML 5 中img和a 默认情况下是可以拖拽的,所以不需要设置draggable 属性。
清单3. 通过添加draggable 属性来创建源容器中可以拖动的节点1. div id="source" style="height:300px;"2. div id="item1" class="item" draggable="true"item1/div3. img id="item2" src="w3c.jpg" class="item"/img4. a id="item3" href="/TR/html5/" class="item"HTML5 specification/a5. /div创建HTML 5 拖拽的源容器和目标容器在HTML 5 中,我们需要给指定的节点来绑定一些事件来使之成为具有源容器或目标容器的功能。
在HTML 5 的拖拽过程中的事件有7 个,分别是应用在目标容器或拖动节点上的dragstart, drag, dragend 等3 个事件,以及应用在目标容器节点上的dragenter, dragover, dragleave 和drop 等4 个事件。
表1 中对这些事件的触发机制和常见的操作进行了描述。
表1. HTML 5 拖拽过程中可以绑定的事件备注: 在Dojo 中所有dnd 源容器或目标容器在拖拽开始时都会调用onDndStart 事件方法,而在HTML 5 中只有拖动的节点及源容器可以触发dragstart 事件,其他容器包括目标容器在拖动开始时不会感知源容器及拖动节点的dragstart 事件。
清单4 展示给目标容器绑定dragenter, dragover, dragleave, drop 事件的示例代码。
在dragenter 和dragleave 事件中,我们对目标容器的背景样式进行修改使得用户感知目标容器的状态(如图 2 所示)。
在dragover 事件中我们对清单3 中的链接元素(id 属性值为item3)的节点进行了限制。
drop 事件中我们要把拖动的节点插入到目标节点的DOM 结构中。
清单4. 创建目标容器的事件1. var target = dojo.byId('target');2. dojo.connect(target, 'dragover', function(e){3. // doesn't allows link item (id = item3) to drop4. if (e.dataTransfer.getData('id') != "item3"){5. e.preventDefault();6. }7. });8.9. dojo.connect(target, 'dragenter', function(e){10. //add style11. dojo.addClass(target, "over");12. });13.14. dojo.connect(target, 'dragleave', function(){15. //remove style16. dojo.removeClass(target, "over");17. });18.19. dojo.connect(target, 'drop', function(e){20. //remove style if drop is successful21. dojo.removeClass(target, "over");22.23. // stops the browser from redirecting24. if (e.stopPropagation) e.stopPropagation();25.26.27. var itemId = e.dataTransfer.getData('id');28. var dragItem = dojo.byId(itemId);29. e.target.appendChild(dragItem);30.31. }图2. 当拖动节点到目标容器是时对目标容器进行高亮显示从清单4 中我们在目标容器上对事件对象的dataTransfer 属性进行了getData 操作取出了关键字id 对应的数据。
在HTML 5 拖拽过程中,用户可以在表 1 定义的事件里通过event.dataTransfer 得到DataTransfer 对象( 详见W3C 网站上的接口定义)并对其进行定制传输数据、定制拖拽影像等操作。
例如我们可以在dragstart 事件中通过setData 方法初始化数据(代码详见附件)。
表2 中列出了这各数据对象的方法及常用的用途。
表2. DataTransfer 的常用方法与桌面进行交互除了在网页中对一些页面上的元素进行拖拽以外,HTML 5 扩充的API 还允许网页与文件系统进行交互,比如从文件系统拖一个或几个文件到网页中,或是从网页拖到文件系统中。