最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js 可拖動(dòng)列表實(shí)現(xiàn)代碼

 更新時(shí)間:2011年12月13日 00:36:33   作者:  
前天做了個(gè)樹形菜單,今天接著讓它可拖動(dòng)。非常不錯(cuò)的效果,需要的朋友可以參考下。
補(bǔ)充一點(diǎn):
要禁止移動(dòng)中選中文字,F(xiàn)F可以設(shè)置CSS
xxxx{-moz-user-select:none;}
其他的瀏覽器可以設(shè)置
XXXX.onselectstart = function(){return false}
一種實(shí)現(xiàn)原理就是點(diǎn)擊沒目標(biāo)元素之后,創(chuàng)建一個(gè)占位元素(或者復(fù)制一份目標(biāo)元素,即拷貝B),然后拖動(dòng)目標(biāo)元素(或者復(fù)制的來的新元素B);
找到相應(yīng)的位置之后,插入目標(biāo)元素。清除占位元素或者B。
比如有一個(gè)列表:
復(fù)制代碼 代碼如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<style type="text/css">
*{ margin: 0; padding: 0; -moz-user-select:none;}
ul{ margin: 100px; border: 1px solid #adff2f; list-style: none;}
li{ height: 30px; line-height: 30px; padding: 0; list-style: none;}
li:hover{ background: #bdb76b; cursor: move;}
</style>
</head>
<body>
<ul id="outer_wrap">
<li>第一條</li>
<li>第二條</li>
<li>第三條</li>
<li>第四條</li>
<li>第五條</li>
<li>第六條</li>
<li>第七條</li>
<li>第八條</li>
</ul>
</body>
</html>

點(diǎn)擊“<li>第一條</li>”(記為元素A),獲取““<li>第一條</li>””的位置和尺寸信息,把元素A拷貝一遍(記為元素B),然后插入文檔中,將元素B絕對(duì)定位到元素A的位置,然后鼠標(biāo)移動(dòng)的時(shí)候,元素B跟著拖動(dòng),接著就是判斷插入點(diǎn)。
判斷插入點(diǎn)就是判斷當(dāng)前鼠標(biāo)所在的坐標(biāo),如果鼠標(biāo)坐標(biāo)落在除了元素A之外的其他LI元素范圍之內(nèi),就滿足可插入的條件,同時(shí)上半部分就插入到前面,下半部分就插入到后面。(=。= 個(gè)人口味重,覺得這段話好邪惡?。?


為了標(biāo)示出插入的位置,我們?cè)谶x中的插入點(diǎn)處另插入一個(gè)元素,僅作標(biāo)桿用。
下面是一個(gè)demo:

復(fù)制代碼 代碼如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<style type="text/css">
*{ margin: 0; padding: 0; -moz-user-select:none;}
ul{ margin: 100px; border: 1px solid #adff2f; list-style: none;}
li{ height: 30px; line-height: 30px; padding: 0; list-style: none;}
li:hover{ background: #bdb76b; cursor: move;}
</style>
</head>
<body>
<ul id="outer_wrap">
<li>第一條</li>
<li>第二條</li>
<li>第三條</li>
<li>第四條</li>
<li>第五條</li>
<li>第六條</li>
<li>第七條</li>
<li>第八條</li>
</ul>
<script type="text/javascript">
function $(id){
return document.getElementById(id);
}
//獲取鼠標(biāo)位置
function getMousePos(e){
return {
x : e.pageX || e.clientX + document.body.scrollLeft,
y : e.pageY || e.clientY + document.body.scrollTop
}
}
//獲取元素位置
function getElementPos(el){
return {
x : el.offsetParent ? el.offsetLeft + arguments.callee(el.offsetParent)['x'] : el.offsetLeft,
y : el.offsetParent ? el.offsetTop + arguments.callee(el.offsetParent)['y'] : el.offsetTop
}
}
//獲取元素尺寸
function getElementSize(el){
return {
width : el.offsetWidth,
height : el.offsetHeight
}
}
//禁止選擇
document.onselectstart = function(){
return false;
}
//判斷是否有挪動(dòng)
var MOVE = {};
MOVE.isMove = false;

//就是創(chuàng)建的標(biāo)桿
var div = document.createElement('div');
div.style.width = '400px';
div.style.height = '1px';
div.style.fontSize = '0';
div.style.background = 'red';

var outer_wrap = $('outer_wrap');
outer_wrap.onmousedown = function(event){
//獲取列表順序
var lis = outer_wrap.getElementsByTagName('li');
for(var i = 0; i < lis.length; i++){
lis[i]['pos'] = getElementPos(lis[i]);
lis[i]['size'] = getElementSize(lis[i]);
}
event = event || window.event;
var t = event.target || event.srcElement;
if(t.tagName.toLowerCase() == 'li'){
var p = getMousePos(event);
var el = t.cloneNode(true);
el.style.position = 'absolute';
el.style.left = t.pos.x + 'px';
el.style.top = t.pos.y + 'px';
el.style.width = t.size.width + 'px';
el.style.height = t.size.height + 'px';
el.style.border = '1px solid #d4d4d4';
el.style.background = '#d4d4d4';
el.style.opacity = '0.7';
document.body.appendChild(el);

document.onmousemove = function(event){
event = event || window.event;
var current = getMousePos(event);
el.style.left =t.pos.x + current.x - p.x + 'px';
el.style.top =t.pos.y + current.y - p.y+ 'px';
document.body.style.cursor = 'move';

//判斷插入點(diǎn)
for(var i = 0; i < lis.length; i++){
if(current.x > lis[i]['pos']['x'] && current.x < lis[i]['pos']['x'] + lis[i]['size']['width'] && current.y > lis[i]['pos']['y'] && current.y < lis[i]['pos']['y'] + lis[i]['size']['height']/2){
if(t != lis[i]){
MOVE.isMove = true;
outer_wrap.insertBefore(div,lis[i]);
}

}else if(current.x > lis[i]['pos']['x'] && current.x < lis[i]['pos']['x'] + lis[i]['size']['width'] && current.y > lis[i]['pos']['y'] + lis[i]['size']['height']/2 && current.y < lis[i]['pos']['y'] + lis[i]['size']['height']){
if(t != lis[i]){
MOVE.isMove = true;
outer_wrap.insertBefore(div,lis[i].nextSibling);
}
}
}
}
//移除事件
document.onmouseup = function(event){
event = event || window.event;
document.onmousemove = null;
if(MOVE.isMove){
outer_wrap.replaceChild(t,div);
MOVE.isMove = false;
}
document.body.removeChild(el);
el = null;
document.body.style.cursor = 'normal';
document.onmouseup = null;
}
}
}
</script>
</body>
</html>

上面的demo代碼細(xì)節(jié)欠缺考慮,僅供展示原理。

相關(guān)文章

  • 詳解JS ES6編碼規(guī)范

    詳解JS ES6編碼規(guī)范

    本章節(jié)討論使用ES6編碼風(fēng)格到代碼中需要注意的點(diǎn)。通過記住這些關(guān)鍵點(diǎn),可以讓我們寫出更優(yōu)美的、可讀性更強(qiáng)的JavaScript ES6風(fēng)格的代碼。
    2021-05-05
  • 再談Javascript中的異步以及如何異步

    再談Javascript中的異步以及如何異步

    大家都知道js是單線程的,執(zhí)行起來是順序的,在順序的業(yè)務(wù)邏輯中當(dāng)然沒有問題,如果遇到可以并發(fā)執(zhí)行的業(yè)務(wù)邏輯,再排隊(duì)就很低級(jí)了!所以這里我們?cè)賮砗?jiǎn)單的談?wù)凧S中的異步以及如何異步。
    2016-08-08
  • JavaScript實(shí)用代碼小技巧

    JavaScript實(shí)用代碼小技巧

    在這篇文章中給大家分享了關(guān)于JavaScript實(shí)用代碼小技巧的相關(guān)內(nèi)容,有興趣的朋友們可以參考學(xué)習(xí)下。
    2018-08-08
  • javascript時(shí)間自動(dòng)刷新實(shí)現(xiàn)原理與步驟

    javascript時(shí)間自動(dòng)刷新實(shí)現(xiàn)原理與步驟

    javascript時(shí)間自動(dòng)刷新在應(yīng)用中很常見,本人今天整理了一些,感興趣的朋友可以參考下哦
    2013-01-01
  • 圍觀tangram js庫

    圍觀tangram js庫

    Tangram開源將近一周,持續(xù)圍觀了幾天。寫一個(gè)簡(jiǎn)單的圍觀筆記吧。
    2010-12-12
  • js動(dòng)態(tài)修改input輸入框的type屬性(實(shí)現(xiàn)方法解析)

    js動(dòng)態(tài)修改input輸入框的type屬性(實(shí)現(xiàn)方法解析)

    本文是對(duì)js動(dòng)態(tài)修改input輸入框的type屬性的實(shí)現(xiàn)方法。進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2013-11-11
  • websocket直接繞過JS加密示例及思路原理

    websocket直接繞過JS加密示例及思路原理

    這篇文章主要為大家介紹了websocket直接繞過JS加密的示例及思路原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • 微信小程序?qū)崿F(xiàn)傳參數(shù)的幾種方法示例

    微信小程序?qū)崿F(xiàn)傳參數(shù)的幾種方法示例

    這篇文章主要給大家介紹了關(guān)于微信小程序?qū)崿F(xiàn)傳參數(shù)的幾種方法,分別是navigator跳轉(zhuǎn)時(shí)、全局變量、列表index下標(biāo)取值以及form表單傳值的相關(guān)內(nèi)容,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • 用js實(shí)現(xiàn)輪播圖效果

    用js實(shí)現(xiàn)輪播圖效果

    這篇文章主要為大家詳細(xì)介紹了用js實(shí)現(xiàn)輪播圖,播放上一張,下一張,可選取第幾張等效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • JavaScript 實(shí)現(xiàn)同時(shí)選取多個(gè)時(shí)間段的方法

    JavaScript 實(shí)現(xiàn)同時(shí)選取多個(gè)時(shí)間段的方法

    這篇文章主要介紹了JavaScript 實(shí)現(xiàn)同時(shí)選取多個(gè)時(shí)間段的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10

最新評(píng)論

洛南县| 宜州市| 榆社县| 库尔勒市| 苍南县| 永靖县| 新绛县| 金平| 莆田市| 宜章县| 新龙县| 麟游县| 本溪| 准格尔旗| 高青县| 西充县| 景宁| 金乡县| 驻马店市| 许昌县| 六安市| 双峰县| 南城县| 吉安市| 万安县| 拉孜县| 油尖旺区| 抚宁县| 于田县| 大竹县| 汉寿县| 临江市| 兴隆县| 都江堰市| 米易县| 珲春市| 柳州市| 榆树市| 西安市| 奇台县| 通州区|