JS實(shí)現(xiàn)簡單的拖動(dòng)編輯器

本篇涉及的知識(shí)點(diǎn)有

  1. flex布局,參考阮一峰老師的文章
  2. HTML拖放API
  3. 原生JS控制HTML插入

本篇文章采用H5的拖放API,實(shí)現(xiàn)一個(gè)簡單的控件編輯器,首先用flex布局構(gòu)建一個(gè)簡單的左右分欄界面,代碼如下

//css
<style type="text/css">
    button{
      padding:5px 20px;
      background: #00a854;
    }
    .container{
      display: flex;
      flex-direction: row;
      align-items: stretch;/*默認(rèn)值,如果子元素未設(shè)置高度或設(shè)為auto,將占滿整個(gè)容器的高度,如果子元素設(shè)置高度100%,padding或margin時(shí)會(huì)導(dǎo)致子元素溢出*/
      height: 600px;
      margin:30px;
    }
    .widget{
      width: 200px;
      margin-right: 10px;
      padding:10px;
      border:1px solid #ccc;
    }
    .zone{
      flex:1 1 auto;
      background: #f1f1f1;
    }
  </style>

//html
<div class="container">
  <div class="widget">
    <button type="button" id="target" draggable="true">drag me</button>
  </div>
  <div class="zone" id="zone">
  </div>
</div>

在H5如果想拖動(dòng)一個(gè)元素非常簡單,只需要將它的draggable屬性設(shè)置true即可,在控件編輯器中,控件自身是一段可插入的HTML,并可以包含css和js腳本。

可拖動(dòng)的元素是控件的外在展示方式,一般用icon展示,此處為了方便,選用button。我們可以在dragstart事件,給拖動(dòng)的元素用dataTransfer.setData方法設(shè)置控件的HTML,然后在拖動(dòng)結(jié)束后添加到Zone,代碼具體如下

<script>
  let target=document.getElementById('target');
  let zone=document.getElementById('zone');

  target.ondragstart=function (e) {
      e.dataTransfer.setData('html','<h1>Hello world</h1>');
  };

  zone.ondragover=function (e) {
    e.preventDefault();
    e.dataTransfer.dropEffect='copy';
  };

  zone.ondrop=function (e) {
    e.preventDefault();
    let html=e.dataTransfer.getData('html');
    //插入HTML在DOM Tree的特定位置,不會(huì)影響內(nèi)部已存在的元素,避免額外的序列化,比直接操控innerHTML高效,參考https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML
    zone.insertAdjacentHTML('afterbegin',html);
  };
</script>

拖動(dòng)元素的基本原理就是這樣,后續(xù)我將展示如何編輯控件

JSBin Demo

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容