整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          HTML5拖拽效果的實現方法

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

          在 HTML5 中,拖放是標準的一部分,任何元素都能夠拖放。

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

          下面看看實現效果:

          拖拽前

          拖拽后

          代碼實現:

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

          然后,規定當元素被拖動時,會發生什么。

          在上面的例子中,ondragstart 屬性調用了一個函數,drag(event),它規定了被拖動的數據。

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

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

          ondragover 事件規定在何處放置被拖動的數據。

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

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

          當放置被拖數據時,會發生 drop 事件。

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

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

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

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

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

          若要實現來回拖動:

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

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

          簡介】

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

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

          提示:a標簽和img標簽默認是啟用該屬性的, 可不需要設置draggable屬性。

          draggable有三個值, 如下所示:

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

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

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

          【用法】

          當我們用鼠標拖拽目標元素過程中會觸發的事件:

          ondragstart:用戶按下鼠標開始拖動時觸發

          ondrag:用戶正在拖動時反復觸發

          ondragend:用戶結束拖動后觸發

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

          當拖動元素進入目標容器內觸發的事件:

          ondragenter:鼠標拖動對象進入釋放區時觸發

          ondragover:被拖動物體進入目標容器內移動時反復觸發

          ondragleave:拖動對象在釋放區沒有釋放就離開容器時觸發

          ondrop:被拖動物體在目標容器內釋放時觸發

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

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

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

          取消元素默認行為:

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

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

          datatransfer:轉移釋放元素的數據到釋放區, 返回Datatransfer對象

          event.dataTransfer //返回DataTransfer對象

          DataTransfer對象的屬性:

          files:處理從操作系統拖動并釋放到釋放區的文件;

          types:返回一個字符串數組, 該對象包含了dataTransfer對象中數據的所有類型;

          items:返回DataTransferItems對象, 該對象代表了拖動數據;

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

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

          DataTransfer對象的方法:

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

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

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

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


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

          1)、實現圖片拖動功能;

          2)、實現圖片復制功能;

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

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

          公共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> <!--釋放區-->
          <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; //綁定拖動元素釋放時觸發的事件
          dropInId.ondrop = drop; //綁定
          dropId1.ondragstart = startFun;
          function cancelDefault(ev){ //取消默認行為
              ev.preventDefault();
          }
          function startFun(ev){
              darggID = ev.target.id;
              //獲取被拖動元素的id
              //從源對象上的事件處理中保存數據,數據類型為"Text"
              ev.dataTransfer.setData("Text",darggID);
          }
          function drop(ev){
              ev.preventDefault();
              // 從目標對象上的事件處理中讀取"Text"類型數據
              var data=ev.dataTransfer.getData("Text");
              // 插入到目標對象中
              ev.target.appendChild(document.getElementById(data));
          }
          </script>

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

          <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函數為
          function drop(ev){
              ev.preventDefault();
              // 從目標對象上的事件處理中讀取"Text"類型數據
              var data=ev.dataTransfer.getData("Text");
              if(data=='drop1'){
              //移動
                  ev.target.appendChild(document.getElementById(data));
              }
              if(data=='drop2'){//復制
                  var nreEl=document.getElementById(darggID).cloneNode(false);
                  getId("dropIn").appendChild(nreEl);
              }
              if(data=='drop3'){//過濾drop3,drop3不做任何操作
                  alert('過濾drop3')
              }
          }

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

          /*document 監聽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();
              //讀取數據
              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瀏覽器, 因為拖放功能的支持是集成在操作系統里面的, 有著相同的特性。

          到拖拽,我們都很熟悉,那么拖放呢?一字之差,代表的意義是不一樣的,拖拽就是拉著走,拖放就是有拖,有放,我們都知道原生 JS 拖拽效果的缺點:1. 代碼相對復雜與冗余2. 僅限于在瀏覽器內的元素間拖放3、不能實現跨頁面的拖放

          所以H5就出現了拖放技術,與 JS 原生相比 HTML5 拖放的優勢:

          H5拖放技術,drag&drop,對于瀏覽器的支持性:

          Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari 5 支持拖放。注:在 Safari 5.1.2 中不支持拖放。

          那么它有哪些api語法,我們來看一下:

          1、 draggable 屬性

          通過 draggable 告訴瀏覽器哪些元素需要實現拖拽功能。有三個可選值:

          true: 元素可以被拖拽

          false:元素不能被拖拽

          auto:瀏覽器自己判斷元素是否能被拖拽 ( 默認 )

          2、對象拖放事件

          dragstart:按下鼠標鍵并開始移動時觸發

          drag:在元素拖拽過程中持續觸發----相似與mousemove

          dragend:元素拖拽停止時觸發

          3、投放區事件流程

          元素被拖動到有效的放置目標時,下列事件會依次發生:

          1. dragenter:當拖拽對象進入投放區時觸發

          2. dragover :拖拽對象在投放區內移動時持續觸發

          3. dragleave:元素被拖出了投放區時觸發

          4. drop :拖拽對象投放在投放區時觸發

          雖然所有元素都支持放置目標事件,但這些元素默認是不允許放置的,需要重寫事件的默認行為,例如:

          在ondragover中一定要執行 preventDefault()否則ondrop事件不會被觸發

          4、 dataTransfer 對象--常用方法

          setDragImage (圖標,圖標距指針X軸偏移值,Y軸偏移值 )

          指定一個圖標,當拖動發生時,顯示在光標下方

          5、dataTransfer 對象--常用屬性:

          dropEffect 表示被拖動的元素能夠執行哪種放置行為

          可能的值:

          "none" : 不能把拖動的元素放在這里

          "move": 把拖動的元素移動到放置目標

          "copy": 把拖動的元素復制到放置目標

          "link": 放置目標會打開拖動的元素(有URL)

          effectAllowed 允許拖動元素的哪種dropEffect

          允許值:

          "copyLink" : 允許值為 copy 和 link 的 dropEffect

          "copyMove": 允許值為 copy 和 move 的 dropEffect

          "linkMove" : 允許值為 link和 move 的 dropEffect

          "all" : 允許任意的 dropEffect

          注意:dropEffect屬性搭配effectAllowed屬性使用

          在dragstart事件處理程序中設置effectAllowed屬性

          在dragover事件處理程序中設置dropEffect屬性

          dropEffect 的每個可能值都會導致光標顯示為不同的符號

          6、files 文件

          dataTransfer.files:如果是拖放文件,則返回正在拖放的文件列表FileList

          FileReader:專門用于讀取文件,FileReader 接口提供一些讀取文件的方法與一個包含讀取結果的事件模型

          FileReader.readAsDataURL方法:參數為要讀取的文件對象,將文件讀取為DataUrl

          FileReader.onload事件:當讀取文件成功完成的時候觸發此事件,在事件觸發后,你可以通過this.result來獲取讀取的文件數據,如果是圖片,將返回base64格式的圖片數據。

          以上就是拖放提供的api,非常多,可以任意設置拖放的效果,拖拽事件以及投放事件,我們比較常見的垃圾桶效果,拖動排序,使用h5拖放技術實現就會非常簡單。


          主站蜘蛛池模板: 国产裸体歌舞一区二区| 国产精品一区在线观看你懂的| 天堂资源中文最新版在线一区| 国产在线精品一区二区中文| 国产亚洲一区二区在线观看| 免费无码VA一区二区三区| 中文字幕AV一区二区三区人妻少妇| 精品国产一区AV天美传媒| 在线观看精品一区| 亚洲AV成人精品日韩一区18p | 日韩精品一区在线| 日韩电影在线观看第一区| 中文字幕人妻无码一区二区三区| 日韩好片一区二区在线看| 香蕉久久ac一区二区三区| 精品人妻少妇一区二区| 一区二区在线观看视频| 国产成人无码精品一区不卡| 国产午夜精品一区二区| 亚洲色一区二区三区四区| 亚洲AV永久无码精品一区二区国产 | 精品日韩在线视频一区二区三区| 亚洲一区二区三区四区在线观看| 亚洲一区在线观看视频| 精品视频在线观看一区二区三区| 久久久久久综合一区中文字幕 | 国产美女av在线一区| 在线日产精品一区| 中文字幕色AV一区二区三区| 福利国产微拍广场一区视频在线 | 中文字幕一区二区三区日韩精品| 日韩AV无码久久一区二区| 色多多免费视频观看区一区| 色窝窝无码一区二区三区 | 精品无码日韩一区二区三区不卡| 又紧又大又爽精品一区二区| 亚洲一区中文字幕在线电影网| 国产99精品一区二区三区免费| 亚洲欧美日韩中文字幕一区二区三区 | 国产天堂一区二区综合| 在线视频精品一区|