hi, 大家好, 我是徐小夕,之前和大家分享了很多「低代碼可視化」和「前端工程化」相關(guān)的話題, 今天繼續(xù)和大家分享「8」個非常流行的開源「拖拽排序」庫以及「2」個非常有價值的「可視化搭建」解決方案.
?
一款強大且兼容性極好地拖拽排序庫, 兼容「IE7+」, 并且支持 「vanilla JavaScript / Angular / React」等框架.
「github:」 https://github.com/bevacqua/dragula
「demo地址:」 https://bevacqua.github.io/dragula/
「interact.js」 是一個 「JavaScript」 資源庫提供拖,放,調(diào)整尺寸和多點觸摸手勢功能用于現(xiàn)代瀏覽器。它的免費和開源版本提供了強大的配置像慣性和指針、約束調(diào)整器。
「interact.js Pro」 使用更多的調(diào)節(jié)器擴展了該開源功能,更多復(fù)雜的內(nèi)置交互,框架集成,和高級開發(fā)工具,用于節(jié)省我們的事件和js開銷。
「github:」 https://github.com/taye/interact.js
「demo地址:」 https://interactjs.io/
「React DnD」 是一組 「React」 高階組件,使用的時候只需要使用對應(yīng)的 「API」 將目標(biāo)組件進行包裹,即可實現(xiàn)拖動或接受拖動元素的功能。
「github:」 https://github.com/react-dnd/react-dnd
「demo地址:」 http://react-dnd.github.io/react-dnd
「Sortable」 —是一個「JavaScript」庫,用于在現(xiàn)代瀏覽器和觸摸設(shè)備上對拖放列表進行重新排序。無需「jQuery」。支持Meteor,AngularJS,React,Polymer,Vue,Ember,Knockout和任何CSS庫,例如Bootstrap.
「github:」 https://github.com/SortableJS/Sortable
「demo地址:」 https://sortablejs.github.io/Sortable/
「scriptaculous」是一組「JavaScript」庫,用于增強網(wǎng)站的用戶界面。它提供了一個視覺效果引擎,一個拖放庫(包括可排序列表),幾個控件(基于「Ajax」的動態(tài)下拉列表,原地編輯,滑塊)等等。
「github:」 https://github.com/madrobby/scriptaculous
漂亮,可移植性 列表拖拽庫. 有很多庫允許React中的拖放交互. 其中最值得注意的是驚人的「react-dnd」. 它提供了一套非常出色的拖放函數(shù),這些函數(shù)在特定情況下非常適用瘋狂地不一致的html5拖放功能. 「react-beautiful-dnd」 是為垂直和水平列表專門構(gòu)建得更高級別的抽象. 在該功能的子集內(nèi)「react-beautiful-dnd」提供強大,自然和美麗的拖放體驗.
「github:」 https://github.com/atlassian/react-beautiful-dnd
「demo地址:」 https://react-beautiful-dnd.netlify.app/
網(wǎng)格式的拖拽排序庫, 支持優(yōu)雅的動畫拖拽效果.
「github:」 https://github.com/bmcmahen/react-grid-dnd
「demo地址:」 https://codesandbox.io/embed/gracious-wozniak-kj9w8
「dndkit」 可以讓我們輕松構(gòu)建拖放界面, 而無需在每次項目需要移動位置時都更新「dom」.
「github:」 https://github.com/clauderic/dnd-kit
「demo地址:」 https://dndkit.com/
H5-Dooring 是一款功能強大,高可擴展的 H5 可視化頁面配置解決方案,致力于提供一套簡單方便、專業(yè)可靠、無限可能的 H5 落地頁最佳實踐。
「github:」 https://github.com/MrXujiang/h5-Dooring
「官網(wǎng)地址:」 http://h5.dooring.cn
在 React 中,在受控模式下,表單的整樹渲染問題非常明顯。特別是對于數(shù)據(jù)聯(lián)動的場景,很容易導(dǎo)致頁面卡頓,為了解決這個問題,「Formily」將每個表單字段的狀態(tài)做了分布式管理,從而大大提升了表單操作性能。同時,「Formily」深度整合了 「JSON Schema」 協(xié)議,可以幫助您快速解決后端驅(qū)動表單渲染的問題。
「github:」 https://github.com/alibaba/formily
「官網(wǎng)地址:」 https://formilyjs.org/
一款開箱即用的可視化大屏解決方案. 支持接入任何后端語言, 支持?jǐn)U展 + 二次開發(fā).
「官網(wǎng)地址:」 http://h5.dooring.cn/docz/source-list/V6.Dooring/v6
好啦, 今天的分享就到這啦, 如果文章對你有幫助, 歡迎 「點贊」 + 「評論」, 鼓勵作者創(chuàng)造更優(yōu)質(zhì)的內(nèi)容~
何使用HTML5實現(xiàn)拖放單個元素?本篇文章將給大家介紹關(guān)于實現(xiàn)拖放HTML元素的JavaScript代碼,下面一起來看具體的實現(xiàn)內(nèi)容。
通過使用HTML5的拖放功能,您可以拖放HTML頁面元素
我們來看具體的示例
代碼如下
SimpleDragDrop.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link rel="stylesheet" href="SimpleDragDrop.css" />
<script>
function load() {
var box=document.querySelector('.box');
box.addEventListener('dragstart', onDragStart, false);
var zone=document.querySelector('.dropzone');
zone.addEventListener('dragover', onDragOver, false);
zone.addEventListener('drop', onDrop, false);
}
function onDragStart(e) {
e.dataTransfer.setData('text', this.id);
}
function onDragOver(e) {
e.preventDefault();
this.textContent='onDragOver';
}
function onDrop(e) {
e.preventDefault();
this.textContent='onDrop';
}
</script>
</head>
<body onload="load();">
<div class="box" draggable="true"></div>
<div id="dropzone" class="dropzone">
</div>
</body>
</html>
SimpleDragDrop.css
.box {
width:32px;
height:32px;
border:solid 1px #002f9f;
}
.dropzone {
margin-top:16px;
margin-bottom:16px;
width: 280px;
height: 64px;
border: solid 1px #808080;
}
說明:
<div class="box" draggable="true"></div>
<div id="dropzone" class="dropzone"></div>
頁面上顯示兩個上述的div,可以使用class=“box”,id=“dropzone”拖動的對象是放置接受區(qū)域的div。對于可拖動對象,可以將draggable=“true”設(shè)置為可拖動對象。
function load() {
var box=document.querySelector('.box');
box.addEventListener('dragstart', onDragStart, false);
var zone=document.querySelector('.dropzone');
zone.addEventListener('dragover', onDragOver, false);
zone.addEventListener('drop', onDrop, false);
}
function onDragStart(e) {
e.dataTransfer.setData('text', this.id);
}
function onDragOver(e) {
e.preventDefault();
this.textContent='onDragOver';
}
function onDrop(e) {
e.preventDefault();
this.textContent='onDrop';
}
上面的代碼為每個元素分配拖放事件。
對于要拖動的元素,我們設(shè)置“dragstart”事件。啟動拖動時,將執(zhí)行onDragStart函數(shù)。
對于要刪除的元素,設(shè)置“dragover”“drop”事件。當(dāng)拖動的元素進入拖放區(qū)域,onDragOver功能被執(zhí)行,當(dāng)元件被丟棄onDrop功能將被執(zhí)行。
在dragstart的情況下,你必須編寫代碼來設(shè)置dataTransfer對象的值。它不使用插入dataTransfer中的值,但是如果沒有這個代碼的話,在沒有數(shù)據(jù)的情況下也會實現(xiàn)。
運行結(jié)果
使用Web瀏覽器顯示上述HTML文件。將顯示如下所示的效果。
拖動頂部的方框。如果將其拖動到底部框架,框架中將顯示“onDragOver”。
將其放在框架中時,框架中會顯示“onDrop”字符。
示例2:添加了事件的拖放元素的方法
代碼如下
SimpleDragDrop2.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link rel="stylesheet" href="SimpleDragDrop2.css" />
<script>
function load() {
var box=document.querySelector('.box');
box.addEventListener('dragstart', onDragStart, false);
box.addEventListener('dragend', onDragEnd, false);
var box=document.querySelector('.dropzone');
box.addEventListener('dragenter', onDragEnter, false);
box.addEventListener('dragover', onDragOver, false);
box.addEventListener('dragleave', onDragLeave, false);
box.addEventListener('drop', onDrop, false);
}
function onDragStart(e) {
e.dataTransfer.setData('Text', this.id);
this.textContent='onDragStart';
}
function onDragEnd(e) {
this.textContent='onDragEnd';
}
function onDragEnter(e) {
this.textContent='onDragEnter';
}
function onDragOver(e) {
e.preventDefault();
this.textContent='onDragOver';
}
function onDragLeave(e) {
this.textContent='onDragLeave';
}
function onDrop(e) {
e.preventDefault();
this.textContent='onDrop';
}
</script>
</head>
<body onload="load();">
<div id="box" class="box" draggable="true"></div>
<div id="dropzone" class="dropzone"></div>
</body>
</html>
SimpleDragDrop.css
.box {
width:32px;
height:32px;
border:solid 1px #d01313;
}
.dropzone {
margin-top:16px;
margin-bottom:16px;
width: 280px;
height: 64px;
border: solid 1px #808080;
}
說明:
<div class="box" draggable="true"></div>
<div id="dropzone" class="dropzone"></div>
如上例所示,頁面上顯示兩頁DIV。對于可拖動對象,請將draggable=“true”設(shè)置為可拖動對象。
function load() {
var box=document.querySelector('.box');
box.addEventListener('dragstart', onDragStart, false);
box.addEventListener('dragend', onDragEnd, false);
var box=document.querySelector('.dropzone');
box.addEventListener('dragenter', onDragEnter, false);
box.addEventListener('dragover', onDragOver, false);
box.addEventListener('dragleave', onDragLeave, false);
box.addEventListener('drop', onDrop, false);
}
function onDragStart(e) {
e.dataTransfer.setData('Text', this.id);
this.textContent='onDragStart';
}
function onDragEnd(e) {
this.textContent='onDragEnd';
}
function onDragEnter(e) {
this.textContent='onDragEnter';
}
function onDragOver(e) {
e.preventDefault();
this.textContent='onDragOver';
}
function onDragLeave(e) {
this.textContent='onDragLeave';
}
function onDrop(e) {
e.preventDefault();
this.textContent='onDrop';
}
上面的代碼為每個元素分配拖放事件。
“dragstart”和“dragend”事件被分配給拖動側(cè)的元素。一旦開始拖動,調(diào)用ondstart函數(shù),拖動結(jié)束后,將被調(diào)用ondos agEs函數(shù)。
“dragenter”,“dragover”,“dragleave”和“drop”事件被分配給要拖動的元素。當(dāng)拖動的元素進入拖放區(qū)域,執(zhí)行onDragEnter函數(shù)的功能,在拖拽區(qū)域內(nèi)拖動的狀態(tài)下執(zhí)行onDragOver函數(shù),從拖拽的區(qū)域出來的話,將執(zhí)行OnDragLeave函數(shù)。下拉拖動的元素時,將執(zhí)行onDrop函數(shù)。
運行結(jié)果
使用Web瀏覽器顯示上述HTML文件。將顯示如下所示的效果。
拖動紅色區(qū)域的方形區(qū)域。字符“onDragStart”顯示在該區(qū)域中。
當(dāng)你松開拖動時,你會看到“onDragEnd”的角色紅框中的區(qū)域。
再次拖動紅框區(qū)域。當(dāng)拖放到底部區(qū)域時,在放置區(qū)域中顯示字符“onDragOver”。
當(dāng)你放開拖到拖放區(qū)域紅框的區(qū)域,你會看到“onDrop”的字符在底部區(qū)域中。
再次拖動紅框以與放置區(qū)域重疊。將顯示“onDragOver”字符。
拖動紅框并將其拖動到拖放區(qū)域之外。放置區(qū)域中的字符顯示變?yōu)椤皁nDragLeave”。
以上就是如何使用HTML5實現(xiàn)拖放單個元素的詳細內(nèi)容,更多請關(guān)注其它相關(guān)文章!
更多技巧請《轉(zhuǎn)發(fā) + 關(guān)注》哦!
簡介】
拖放是一種常見的特性, 屬于html5標(biāo)準(zhǔn)的一部分, 即抓取對象以后拖動到另一個位置, 在html5中, 任何元素都可被設(shè)置拖放。首先, 我們要給需要拖動的HTML元素啟用拖動功能, 設(shè)置屬性draggable="true",
<div draggable="true"></div>
提示:a標(biāo)簽和img標(biāo)簽?zāi)J(rèn)是啟用該屬性的, 可不需要設(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事件的默認(rèn)行為是拒絕接受任何被拖放的項目, 所以我們必須要做的最重要的事情就是防止這種默認(rèn)行為的發(fā)生。
因此, 我們只需要在這兩個事件調(diào)用的函數(shù)中傳入event對象, 使用event.preventDefault()就可取消這種默認(rèn)行為;舉個例子, 在drop事件時, Firefox瀏覽器會關(guān)閉網(wǎng)頁, 轉(zhuǎn)而顯示被拖動圖片img元素src所引用的地址。
取消元素默認(rèn)行為:
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");
//取消事件默認(rèn)行為
dropInId.ondragenter=cancelDefault;
dropInId.ondragover=cancelDefault; //綁定拖動元素釋放時觸發(fā)的事件
dropInId.ondrop=drop; //綁定
dropId1.ondragstart=startFun;
function cancelDefault(ev){ //取消默認(rèn)行為
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中阻止默認(rèn)行為
e.preventDefault();
};
document.ondrop=function (e) {
//阻止 document.ondrop的默認(rèn)行為
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)里面的, 有著相同的特性。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。