整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          HTML5拖拽效果的實現(xiàn)方法

          要為大家詳細介紹了HTML5拖放效果的實現(xiàn)代碼,拖放即抓取對象以后拖到另一個位置。感興趣的小伙伴們可以參考一下:

          在 HTML5 中,拖放是標(biāo)準(zhǔn)的一部分,任何元素都能夠拖放。

          Internet Explorer 9+, Firefox, Opera, Chrome, 和 Safari 支持拖動。但 Safari 5.1.2不支持拖動。

          下面看看實現(xiàn)效果:

          拖拽前

          拖拽后

          代碼實現(xiàn):

          把draggable屬性設(shè)置為true ,才能使元素可拖動。

          然后,規(guī)定當(dāng)元素被拖動時,會發(fā)生什么。

          在上面的例子中,ondragstart 屬性調(diào)用了一個函數(shù),drag(event),它規(guī)定了被拖動的數(shù)據(jù)。

          dataTransfer.setData() 方法設(shè)置被拖數(shù)據(jù)的數(shù)據(jù)類型和值:

          在這個例子中,數(shù)據(jù)類型是 "Text",值是可拖動元素的 id ("drag1")。

          ondragover 事件規(guī)定在何處放置被拖動的數(shù)據(jù)。

          默認地,無法將數(shù)據(jù)/元素放置到其他元素中。如果需要設(shè)置允許放置,我們必須阻止對元素的默認處理方式。

          這要通過調(diào)用 ondragover 事件的 event.preventDefault() 方法:event.preventDefault()

          當(dāng)放置被拖數(shù)據(jù)時,會發(fā)生 drop 事件。

          在上面的例子中,ondrop 屬性調(diào)用了一個函數(shù),drop(event):

          調(diào)用 preventDefault() 來避免瀏覽器對數(shù)據(jù)的默認處理(drop 事件的默認行為是以鏈接形式打開)

          通過 dataTransfer.getData("Text") 方法獲得被拖的數(shù)據(jù)。該方法將返回在 setData() 方法中設(shè)置為相同類型的任何數(shù)據(jù)。

          被拖數(shù)據(jù)是被拖元素的 id ("drag1")

          把被拖元素追加到放置元素(目標(biāo)元素)中

          若要實現(xiàn)來回拖動:

          若要在兩個地方來回拖動,只需將上面代碼稍作修改就行了.將body中的代碼改成:

          然后在style樣式中加上#div2就可以了:

          簡介】

          拖放是一種常見的特性, 屬于html5標(biāo)準(zhǔn)的一部分, 即抓取對象以后拖動到另一個位置, 在html5中, 任何元素都可被設(shè)置拖放。首先, 我們要給需要拖動的HTML元素啟用拖動功能, 設(shè)置屬性draggable="true",

          <div draggable="true"></div>

          提示:a標(biāo)簽和img標(biāo)簽?zāi)J是啟用該屬性的, 可不需要設(shè)置draggable屬性。

          draggable有三個值, 如下所示:

          draggable = true(元素可以被拖動)

          draggable = false(元素不能被拖動)

          draggable = auto(瀏覽器可以自主決定某個元素是否可以被拖動)

          【用法】

          當(dāng)我們用鼠標(biāo)拖拽目標(biāo)元素過程中會觸發(fā)的事件:

          ondragstart:用戶按下鼠標(biāo)開始拖動時觸發(fā)

          ondrag:用戶正在拖動時反復(fù)觸發(fā)

          ondragend:用戶結(jié)束拖動后觸發(fā)

          <img id="imgs" ondragstart="startFun()" ondrag="ondragFun()" ondragend="ondragendFun()" src="../img/a.png"/>

          當(dāng)拖動元素進入目標(biāo)容器內(nèi)觸發(fā)的事件:

          ondragenter:鼠標(biāo)拖動對象進入釋放區(qū)時觸發(fā)

          ondragover:被拖動物體進入目標(biāo)容器內(nèi)移動時反復(fù)觸發(fā)

          ondragleave:拖動對象在釋放區(qū)沒有釋放就離開容器時觸發(fā)

          ondrop:被拖動物體在目標(biāo)容器內(nèi)釋放時觸發(fā)

          <div id="container" ondragenter="ondragenterFun(event)" ondragover="ondragoverFun(event)" ondragleave="ondragleaveFun()" ondrop="drop()"></div>

          ondragenter和ondragover事件的默認行為是拒絕接受任何被拖放的項目, 所以我們必須要做的最重要的事情就是防止這種默認行為的發(fā)生。

          因此, 我們只需要在這兩個事件調(diào)用的函數(shù)中傳入event對象, 使用event.preventDefault()就可取消這種默認行為;舉個例子, 在drop事件時, Firefox瀏覽器會關(guān)閉網(wǎng)頁, 轉(zhuǎn)而顯示被拖動圖片img元素src所引用的地址。

          取消元素默認行為:

          function ondragenterFun(e){
              e.preventDefault();
          }
          function ondragoverFun(e){
              e.preventDefault();
          }

          在event對象中, 我們會使用dataTransfer屬性來獲取DataTransfer對象, 在DataTransfer對象中有我們操作數(shù)據(jù)的屬性和方法, 具體如下:

          datatransfer:轉(zhuǎn)移釋放元素的數(shù)據(jù)到釋放區(qū), 返回Datatransfer對象

          event.dataTransfer //返回DataTransfer對象

          DataTransfer對象的屬性:

          files:處理從操作系統(tǒng)拖動并釋放到釋放區(qū)的文件;

          types:返回一個字符串?dāng)?shù)組, 該對象包含了dataTransfer對象中數(shù)據(jù)的所有類型;

          items:返回DataTransferItems對象, 該對象代表了拖動數(shù)據(jù);

          dropEffect:設(shè)置拖放目標(biāo)允許發(fā)生的拖放行為, 如果此處設(shè)置的拖放行為不在effectAllowed屬性設(shè)置的可拖放行為內(nèi), 拖放操作將會失敗。該屬性值只允許為"null"、"copy"、"link"或"move";

          effectAllowed:設(shè)置拖動元素允許發(fā)生的拖動行為, 該屬性值可為"none"、"copy"、"copyLink"、"copyMove"、"link"、"linkMove"、"move"、"all"或"uninitialized";

          DataTransfer對象的方法:

          setData( format , data ):將指定格式的數(shù)據(jù)賦值給dataTransfer對象,參數(shù)format定義數(shù)據(jù)的格式也就是數(shù)據(jù)的類型,data為待賦值的數(shù)據(jù)。

          getData( format ):從dataTransfer對象中獲取指定格式的數(shù)據(jù),format代表數(shù)據(jù)格式,data為數(shù)據(jù)。

          clearData( [format] ):從dataTransfer對象中刪除指定格式的數(shù)據(jù),參數(shù)可選,若不給參數(shù),將刪除對象中所有的數(shù)據(jù)。

          setDragImage(el, x, y):設(shè)置拖放操作的圖標(biāo),其中el代表自定義圖標(biāo),x代表圖標(biāo)與鼠標(biāo)在水平方向上的距離,y代表圖標(biāo)與鼠標(biāo)在垂直方向上的距離。


          了解了H5拖動使用的api以后我們接下來看一個綜合的案例, 功能如下:

          1)、實現(xiàn)圖片拖動功能;

          2)、實現(xiàn)圖片復(fù)制功能;

          3)、過濾不能拖動的元素;

          4)、實現(xiàn)拖動本地圖片到瀏覽器指定位置;

          公共css部分:

          <style>
          #dropIn{
          border:1px solid #AAAAAA;
          height:100px;
          margin-bottom: 10px;
          padding: 10px;
          }
          #dropIn>img{
          margin-right: 10px;
          border:2px solid deepskyblue;
          }
          img{
          width:100px;
          border-radius: 10px;
          border:2px solid red;
          }
          </style>

          html部分:

          <body>
          <div id="dropIn"></div> <!--釋放區(qū)-->
          <img id="drop1" src="img/a.png" alt="" />
          <!--拖動的圖片元素-->
          </body>

          js部分:

          <script type="text/javascript">
          var darggID;
          function getId(el){
              return document.getElementById(el)
          }
          var dropId1 = getId("drop1");
          var dropInId = getId("dropIn");
          //取消事件默認行為
          dropInId.ondragenter = cancelDefault;
          dropInId.ondragover = cancelDefault; //綁定拖動元素釋放時觸發(fā)的事件
          dropInId.ondrop = drop; //綁定
          dropId1.ondragstart = startFun;
          function cancelDefault(ev){ //取消默認行為
              ev.preventDefault();
          }
          function startFun(ev){
              darggID = ev.target.id;
              //獲取被拖動元素的id
              //從源對象上的事件處理中保存數(shù)據(jù),數(shù)據(jù)類型為"Text"
              ev.dataTransfer.setData("Text",darggID);
          }
          function drop(ev){
              ev.preventDefault();
              // 從目標(biāo)對象上的事件處理中讀取"Text"類型數(shù)據(jù)
              var data=ev.dataTransfer.getData("Text");
              // 插入到目標(biāo)對象中
              ev.target.appendChild(document.getElementById(data));
          }
          </script>

          接下來我們添加兩張圖, "drop2"是實現(xiàn)復(fù)制的圖片, "drop3"是既不能復(fù)制也不能拖動的圖片;

          <img id="drop2" src="img/b.png" alt="" /><img id="drop3" src="img/c.png" alt="" />

          添加js代碼:

          //獲取頁面元素
          var dropId2 = getId("drop2");
          var dropId3 = getId("drop3");
          //綁定事件
          dropId2.ondragstart = startFun;dropId3.ondragstart = startFun;
          //修改drop函數(shù)為
          function drop(ev){
              ev.preventDefault();
              // 從目標(biāo)對象上的事件處理中讀取"Text"類型數(shù)據(jù)
              var data=ev.dataTransfer.getData("Text");
              if(data=='drop1'){
              //移動
                  ev.target.appendChild(document.getElementById(data));
              }
              if(data=='drop2'){//復(fù)制
                  var nreEl=document.getElementById(darggID).cloneNode(false);
                  getId("dropIn").appendChild(nreEl);
              }
              if(data=='drop3'){//過濾drop3,drop3不做任何操作
                  alert('過濾drop3')
              }
          }

          接下來我們實現(xiàn)拖動本地圖片到瀏覽器, 我們就將圖片拖動到id為"dropIn"的這個div中;添加js:

          /*document 監(jiān)聽drop 并阻止瀏覽器打開客戶端的圖片*/
          document.ondragover = function (e) {
              //只有在ondragover中阻止默認行為
              e.preventDefault();
          };
          document.ondrop = function (e) {
              //阻止 document.ondrop的默認行為
              e.preventDefault();
          };
          //dropIn是div的id
          dropIn.ondrop = function (e) {
              var list = e.dataTransfer.files;
              for (var i = 0; i < list.length; i++) {
              var f = list[i];
                  reader(f);
              }
          };
          function reader(f) {
              var reader = new FileReader();
              //讀取數(shù)據(jù)
              reader.readAsDataURL(f);
              reader.onload = function () {
              var img = new Image();
              img.src = reader.result;
              dropIn.appendChild(img);
              }
          }

          【瀏覽器支持】

          目前只有Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari5支持拖放,在 Safari5.1.2 中不支持拖放。

          最后再和大家分享一個技巧, 這種拖動行為還能跨瀏覽器工作, 這里說的跨瀏覽器不是瀏覽器之間的跨窗口, 而是可以從Chrome瀏覽器拖動到Firefox瀏覽器, 因為拖放功能的支持是集成在操作系統(tǒng)里面的, 有著相同的特性。

          介拖放是一種常見的特性,即抓取對象以后拖到另一個位置。在 HTML5 中,拖放是標(biāo)準(zhǔn)的一部分,任何元素都能夠拖放。先點擊一個小例子:在用戶開始拖動 <p> 元素時執(zhí)行 JavaScript<p draggable="true" ondragstart="myfunction(event)">拖動我</p>提示: 鏈接和圖片默認是可拖動的,不需要 draggable 屬性。定義和用法在拖放的過程中會觸發(fā)以下事件:在拖動目標(biāo)上觸發(fā)事件 (源元素):


          1、ondragstart - 用戶開始拖動元素時觸發(fā)2、ondrag - 元素正在拖動時觸發(fā)3、ondragend - 用戶完成元素拖動后觸發(fā)釋放目標(biāo)時觸發(fā)的事件:1、ondragenter - 當(dāng)被鼠標(biāo)拖動的對象進入其容器范圍內(nèi)時觸發(fā)此事件2、ondragover - 當(dāng)某被拖動的對象在另一對象容器范圍內(nèi)拖動時觸發(fā)此事件
          3、ondragleave - 當(dāng)被鼠標(biāo)拖動的對象離開其容器范圍內(nèi)時觸發(fā)此事件4、ondrop - 在一個拖動過程中,釋放鼠標(biāo)鍵時觸發(fā)此事件瀏覽器支持Internet Explorer 9+, Firefox, Opera, Chrome, 和 Safari 支持拖動。注意:Safari 5.1.2不支持拖動;在拖動元素時,每隔 350 毫秒會觸發(fā) ondragover 事件。實例


          先貼代碼,再逐一解釋:

          <!DOCTYPE html>
          <html lang="en">
          <head>
          <meta charset="UTF-8">
          <title>拖拽</title>
          <style>
          #d1{
          width: 110px;
          height: 310px;
          border: 1px dashed greenyellow;
          border-radius: 10px;
          float: left;
          margin-right: 200px;
          }
          #d1_a,#d1_b,#d1_c{
          width: 100px;
          height: 100px;
          line-height: 100px;
          }
          #d1_a{background-color: orangered;}
          #d1_b{background-color: yellow;}
          #d1_c{background-color: red;}
          #d2,#d3,#d4{
          width: 150px;
          height: 150px;
          border-radius: 10px;
          border: 1px dashed greenyellow;
          float: left;
          }
          </style>
          </head>
          <body>
          <p draggable="true" ondragstart="myfunction(event)"></p>
          <div id="d1">
          <div id="d1_a" draggable="true">橘紅</div>
          <div id="d1_b" draggable="true">黃色</div>
          <div id="d1_c" draggable="true">紅色</div>
          </div>
          <div id="d2">橘紅</div>
          <div id="d3">黃色</div>
          <div id="d4">紅色</div>
          <script>
          /* 拖拽元素支持的事件


          ondrag 應(yīng)用于拖拽元素,整個拖拽過程都會調(diào)用


          ondragstart 應(yīng)用于拖拽元素,當(dāng)拖拽開始時調(diào)用


          ondragleave 應(yīng)用于拖拽元素,當(dāng)鼠標(biāo)離開拖拽元素是調(diào)用


          ondragend 應(yīng)用于拖拽元素,當(dāng)拖拽結(jié)束時調(diào)用


          目標(biāo)元素支持的事件


          ondragenter 應(yīng)用于目標(biāo)元素,當(dāng)拖拽元素進入時調(diào)用


          ondragover 應(yīng)用于目標(biāo)元素,當(dāng)停留在目標(biāo)元素上時調(diào)用


          ondrop 應(yīng)用于目標(biāo)元素,當(dāng)在目標(biāo)元素上松開鼠標(biāo)時調(diào)用


          ondragleave 應(yīng)用于目標(biāo)元素,當(dāng)鼠標(biāo)離開目標(biāo)元素時調(diào)用


          *///拖拽開始document.ondragstart=function (e) {
          /*通過dataTransfer來實現(xiàn)數(shù)據(jù)的存儲與獲取


          setData(format, data)format: 數(shù)據(jù)的類型: text/html text/uri-listData: 數(shù)據(jù): 一般來說是字符串值


          */// e.dataTransfer.setData("Text", e.target.id);e.target.style.opacity = 0.5//設(shè)置透明度e.dataTransfer.setData("text",e.target.id);
          }
          //拖拽結(jié)束時document.ondragend=function (e) {
          e.target.style.opacity=1;
          }
          //瀏覽器默認會阻止ondrop事件:我們必須在ondrapover中阻止默認行為document.ondragover=function (e) {
          e.preventDefault();
          }
          //放置document.ondrop=function (e) {
          var data=e.dataTransfer.getData("text");
          e.target.appendChild(document.getElementById(data));
          }
          </script>
          </body>
          </html>


          下面分別來解析下上面代碼的意思。設(shè)置元素可拖放首先,為了使元素可拖動,把 draggable 屬性設(shè)置為 true :

          <div id="d1_a" draggable="true">橘紅</div>
          <div id="d1_b" draggable="true">黃色</div>
          <div id="d1_c" draggable="true">紅色</div>

          拖動什么 - ondragstart 和 setData()然后,規(guī)定當(dāng)元素被拖動時,會發(fā)生什么。在上面的例子中,ondragstart 屬性調(diào)用了一個函數(shù),drag(event),它規(guī)定了被拖動的數(shù)據(jù)。

          dataTransfer.setData() 方法設(shè)置被拖數(shù)據(jù)的數(shù)據(jù)類型和值:
          document.ondragstart=function (e) {
          e.dataTransfer.setData("text",e.target.id);
          }
          

          在這個例子中,數(shù)據(jù)類型是 "Text",值是可拖動元素的 id ("d1_1")。放到何處 - ondragoverondragover 事件規(guī)定在何處放置被拖動的數(shù)據(jù)。默認地,無法將數(shù)據(jù)/元素放置到其他元素中。如果需要設(shè)置允許放置,我們必須阻止對元素的默認處理方式。這要通過調(diào)用 ondragover 事件的 event.preventDefault() 方法:

          document.ondragover=function (e) {
          e.preventDefault();
          }


          主站蜘蛛池模板: 亚洲毛片不卡av在线播放一区| 久久精品午夜一区二区福利| 韩国精品一区视频在线播放| 国产伦精品一区二区三区| 日本一区高清视频| 蜜桃AV抽搐高潮一区二区| 无码人妻精品一区二区三区夜夜嗨| 一区二区三区四区精品| 午夜精品一区二区三区在线视| 国内精品视频一区二区三区八戒| 欧美日韩精品一区二区在线观看 | 国产综合无码一区二区三区| 韩国资源视频一区二区三区| 免费看无码自慰一区二区| 亚洲av无码成人影院一区 | 久久精品免费一区二区喷潮| 3d动漫精品啪啪一区二区中文| 文中字幕一区二区三区视频播放| 国语精品一区二区三区| 国产精品免费一区二区三区四区| 亚州国产AV一区二区三区伊在| 一区二区三区四区电影视频在线观看 | 亚洲一区二区三区无码中文字幕| 一区二区三区四区视频在线| 91久久精一区二区三区大全| 久久99国产一区二区三区| 久久99国产一区二区三区| 东京热人妻无码一区二区av| 亚洲乱码国产一区三区| 精品无码人妻一区二区三区品 | 亚洲欧洲日韩国产一区二区三区| 国产精品制服丝袜一区| 精品国产福利在线观看一区 | 一区二区三区在线免费看| 亚洲区精品久久一区二区三区| 亚洲欧美日韩一区二区三区在线| 51视频国产精品一区二区| 国产婷婷色一区二区三区深爱网| 一区二区三区杨幂在线观看| 国产成人AV一区二区三区无码 | 日韩最新视频一区二区三|