欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

用javascript做拖動(dòng)布局的思路

 更新時(shí)間:2010年10月29日 21:22:09   作者:  
這幾天不是很忙,就找了些拖動(dòng)布局方面的資料看看,也學(xué)著寫了個(gè)拖動(dòng)布局的效果,沒想到花了好多時(shí)間,七拼八湊,總算是把這個(gè)效果寫出來了。
哎!還是js的功夫太差。因?yàn)槭沁呎屹Y料邊寫的,很多地方印象不深,
時(shí)間一長(zhǎng),再重新寫估計(jì)也難,所以把當(dāng)時(shí)的思路記錄一下!也希望大蝦指點(diǎn)一下!
好了,轉(zhuǎn)入正文,在開始之前先介紹幾個(gè)功能函數(shù)!
1.格式化事件的函數(shù)
復(fù)制代碼 代碼如下:

function getEvent(){
//同時(shí)兼容ie和ff的寫法
if(document.all) return window.event;
func=getEvent.caller;
while(func!=null){
var arg0=func.arguments[0];
if(arg0){
if((arg0.constructor==Event || arg0.constructor ==MouseEvent)
|| (typeof(arg0)=="object" && arg0.preventDefault && arg0.stopPropagation)){
return arg0;
}
}
func=func.caller;
}
return null;
}


2.取得鼠標(biāo)的位置
復(fù)制代碼 代碼如下:

function mouseCoords(ev){
if(ev.pageX || ev.pageY){
return {x:ev.pageX, y:ev.pageY};
}
return {
x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
y:ev.clientY + document.body.scrollTop - document.body.clientTop
};
}


3.得到元素的位置
復(fù)制代碼 代碼如下:

function getPosition(ele){
var left = 0;
var top = 0;
while (ele.offsetParent){
left += ele.offsetLeft;
top += ele.offsetTop;
ele = ele.offsetParent;
}
left += ele.offsetLeft;
top += ele.offsetTop;
return {x:left, y:top};
}


首先,當(dāng)然是寫好初始布局的頁面, 查看初始頁面效果
一般拖動(dòng)的元素是跟隨鼠標(biāo)的,我的思路是在把拖動(dòng)的元素增加到一個(gè)position為absolute的div中,
鼠標(biāo)拖動(dòng)的時(shí)候就讓它的位置根據(jù)鼠標(biāo)的坐標(biāo)變化就可以了。所以在頁面增加了個(gè)onload
復(fù)制代碼 代碼如下:

var tmpDiv=null;//臨時(shí)存放拖動(dòng)對(duì)象的div
window.onload=function(){
tmpDiv=document.createElement("div");
tmpDiv.style.cssText = 'position:absolute;display:none;border:1px dotted #FFCC66;';
document.body.appendChild(tmpDiv);
}


要實(shí)現(xiàn)拖動(dòng),首先觸發(fā)的事件是mouseDown,所以我在拖動(dòng)的table的一個(gè)td上綁定了onmousedown="mouseDown(this);"
復(fù)制代碼 代碼如下:

var dragObject = null;//拖動(dòng)的元素(table)
var mouseOffset = null;//鼠標(biāo)的在拖動(dòng)元素中的位置
var dragDiv=null;//拖動(dòng)的table所在的列的div
var eleDivW=null;//拖動(dòng)的table的父節(jié)點(diǎn)(div)的高度
var dragDivLen=null;//拖動(dòng)的table所在的列的div中用來放置table的div的個(gè)數(shù)
var DragContainer=["col1","col2","col3"];//用來實(shí)現(xiàn)列布局的div的id
//鼠標(biāo)按下拖動(dòng)的元素
function mouseDown(elem){
ev=getEvent();
dragObject = elem.parentNode.parentNode.parentNode;//被拖動(dòng)的table
dragDiv=dragObject.parentNode.parentNode;
//拖動(dòng)元素所在列里div的個(gè)數(shù)
dragDivLen=dragDiv.getElementsByTagName("div").length;
mouseOffset = getMouseOffset(dragObject, ev);
eleDivW=dragObject.parentNode.offsetWidth;
dragObject.parentNode.style.border="1px dotted #FFCC66";
return false;
}
//得到鼠標(biāo)在拖動(dòng)元素中的位置
function getMouseOffset(target, ev){
var docPos = getPosition(target);
var mousePos = mouseCoords(ev);
return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
}

剩下的當(dāng)然就是鼠標(biāo)移動(dòng)拖動(dòng)對(duì)象也能移動(dòng),用到的當(dāng)然就是mouseMove咯,為簡(jiǎn)單我在document上綁定,
復(fù)制代碼 代碼如下:

document.onmousemove = mouseMove;
function mouseMove(){
ev=getEvent();
var mousePos = mouseCoords(ev);
if(dragObject){
dragObject.parentNode.style.display="none";//設(shè)置放置被拖動(dòng)table的div隱藏
//把拖動(dòng)的table放到臨時(shí)的div中,并設(shè)置其坐標(biāo)
for(var i=0; i<tmpDiv.childNodes.length; i++) tmpDiv.removeChild(tmpDiv.childNodes[i]);
tmpDiv.appendChild(dragObject.cloneNode(true));
tmpDiv.style.width=eleDivW+"px";
tmpDiv.style.backgroundColor="#FFFFFF";
tmpDiv.style.display="block";
tmpDiv.style.top = (mousePos.y - mouseOffset.y)+"px";
tmpDiv.style.left = (mousePos.x - mouseOffset.x)+"px";
}
return false;
}


有了mousemove當(dāng)然少不了mouseup
復(fù)制代碼 代碼如下:

document.onmouseup = mouseUp;
//鼠標(biāo)松開
function mouseUp(){
if(dragObject){
if(dragObject.parentNode.style.display=="none") dragObject.parentNode.style.display="block";
dragObject.parentNode.style.border="1px solid #FFCC66";
tmpDiv.style.display="none";
//這里是判斷當(dāng)列里有可拖動(dòng)的元素時(shí)清除前面設(shè)置的高度值20px
for(var m=0;m<DragContainer.length;m++){
var colDiv=document.getElementById(DragContainer[m]);
var colDivLen=colDiv.getElementsByTagName("div").length
var colSty=colDiv.getAttribute("style");
if(colDivLen>0&&colSty!=null){
colDiv.removeAttribute("style");
break;
}
}
dragObject=null;
}
}


看看是不是可以拖動(dòng)了,當(dāng)你松開鼠標(biāo)左鍵時(shí),拖動(dòng)的元素將回到原來的位置 查看拖動(dòng)頁面效果

最后要做的就是讓拖動(dòng)元素不回到原來的位置,而是回到我們拖動(dòng)的位置。
下面是mousemove事件的所有代碼,看看注釋就明白了
復(fù)制代碼 代碼如下:

function mouseMove(){
ev=getEvent();
var mousePos = mouseCoords(ev);
if(dragObject){
//可拖動(dòng)的個(gè)數(shù)為1,說明拖動(dòng)后此列就沒有拖動(dòng)元素,為避免此列沒有高度而不見,所以設(shè)置其高度為20px
if(dragDivLen==1) dragDiv.style.height="20px";
dragObject.parentNode.style.display="none";
//把拖動(dòng)的元素加入到臨時(shí)的tmpDiv中,并設(shè)置tmpDiv坐標(biāo)
for(var i=0; i<tmpDiv.childNodes.length; i++) tmpDiv.removeChild(tmpDiv.childNodes[i]);
tmpDiv.appendChild(dragObject.cloneNode(true));
tmpDiv.style.width=eleDivW+"px";
tmpDiv.style.backgroundColor="#FFFFFF";
tmpDiv.style.display="block";
tmpDiv.style.top = (mousePos.y - mouseOffset.y)+"px";
tmpDiv.style.left = (mousePos.x - mouseOffset.x)+"px";
//被拖動(dòng)對(duì)象的中心點(diǎn)的坐標(biāo)
var dragObjCntX=mousePos.x - mouseOffset.x+parseInt(dragObject.offsetWidth)/2;
var dragObjCntY=mousePos.y - mouseOffset.y+parseInt(dragObject.offsetHeight)/2;
//判斷tmpDiv所在的列
var dragConLen=DragContainer.length;
for(var i=0;i<dragConLen;i++){
var curContainer=document.getElementById(DragContainer[i]);
var dcPos=getPosition(curContainer);
var dcPosMinX=dcPos.x;
var dcPosMinY=dcPos.y;
var dcWidth=curContainer.offsetWidth;
var dcHeight=curContainer.offsetHeight;
var dcPosMaxX=dcPosMinX+dcWidth;
var dcPosMaxY=dcPosMinY+dcHeight;
if(dragObjCntX>dcPosMinX&&dragObjCntX<dcPosMaxX&&dragObjCntY>dcPosMinY&&dragObjCntY<dcPosMaxY){
var activeContainer=curContainer;
break;
}
}
}
//判斷tmpDiv在此列哪個(gè)區(qū)塊范圍內(nèi)
if(activeContainer){
var beforNode=null;
var sDiv=activeContainer.getElementsByTagName("div")
var acChiLen=sDiv.length;
for(j=acChiLen-1;j>=0;j--){
var activeDiv=sDiv[j];
if(activeDiv){
var activeDivPos=getPosition(activeDiv);
var activeDivMinX=activeDivPos.x;
var activeDivMinY=activeDivPos.y;
var activeDivMaxX=activeDivMinX+activeDiv.offsetWidth;
var activeDivMaxY=activeDivMinY+activeDiv.offsetHeight;
if(activeDivMaxX>dragObjCntX&&activeDivMaxY>dragObjCntY){
//if(dragObjCntX>activeDivMinX&&dragObjCntX<activeDivMaxX&&dragObjCntY>activeDivMinY&&dragObjCntY<activeDivMaxY){
beforNode=activeDiv;
}
}
}
//若此區(qū)塊存在,就在此區(qū)塊前插入拖動(dòng)元素
if(beforNode!=null){
if(dragObject.parentNode!=beforNode){
curContainer.insertBefore(dragObject.parentNode,beforNode);
dragObject.parentNode.style.display="block";
//document.getElementById("test").value=curContainer.id;
}
}
//不存在就在所在列插入拖動(dòng)元素
else{
curContainer.appendChild(dragObject.parentNode);
dragObject.parentNode.style.display="block";
}
}
return false;
}


好了,一個(gè)可以拖動(dòng)布局的頁面就完成了 查看最終頁面效果
能力有限,有些地方可能說的不清不楚,若有興趣,自己好好看看代碼吧。
有什么不足的地方,請(qǐng)指教。
演示代碼:

[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]

相關(guān)文章

  • js+css實(shí)現(xiàn)增加表單可用性之提示文字

    js+css實(shí)現(xiàn)增加表單可用性之提示文字

    平常設(shè)計(jì)表單的時(shí)候,我們會(huì)加入一些提示文字,最常見的做法是利用value來設(shè)置,下面與大家分享一個(gè)實(shí)例,感興趣的朋友可以參考下哈
    2013-06-06
  • JavaScript獲取當(dāng)前日期是星期幾的方法

    JavaScript獲取當(dāng)前日期是星期幾的方法

    這篇文章主要介紹了JavaScript獲取當(dāng)前日期是星期幾的方法,涉及javascript中g(shù)etDay函數(shù)獲取日期的技巧,需要的朋友可以參考下
    2015-04-04
  • 微信小程序事件點(diǎn)擊跳轉(zhuǎn)頁面的五種方法小結(jié)

    微信小程序事件點(diǎn)擊跳轉(zhuǎn)頁面的五種方法小結(jié)

    本文主要介紹了微信小程序事件點(diǎn)擊跳轉(zhuǎn)頁面的五種方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • javascript 冒號(hào) 使用說明

    javascript 冒號(hào) 使用說明

    雖然之前寫過不少的javascirpt的腳本,但是對(duì)冒號(hào):卻不甚了了,感覺即陌生又熟悉,沒辦法老毛病又犯了,不把問題搞清楚那個(gè)(:)
    2009-06-06
  • Bootstrap三種表單布局的使用方法

    Bootstrap三種表單布局的使用方法

    這篇文章主要為大家詳細(xì)介紹了Bootstrap三種表單布局的使用方法,感興趣的小伙伴們可以參考一下
    2016-06-06
  • js實(shí)現(xiàn)圖片360度旋轉(zhuǎn)

    js實(shí)現(xiàn)圖片360度旋轉(zhuǎn)

    本文主要介紹了js實(shí)現(xiàn)圖片360度旋轉(zhuǎn)的思路與方法。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • js?中以?...?為前綴的幾種用法詳解

    js?中以?...?為前綴的幾種用法詳解

    這篇文章主要為大家介紹了js?中以?...?為前綴的幾種用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • JS實(shí)現(xiàn)蘋果計(jì)算器

    JS實(shí)現(xiàn)蘋果計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)蘋果計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • JS中 new Date() 各方法的用法說明

    JS中 new Date() 各方法的用法說明

    這篇文章主要介紹了JS中 new Date() 各方法的用法,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • JavaScript 另類遍歷數(shù)組實(shí)現(xiàn)代碼

    JavaScript 另類遍歷數(shù)組實(shí)現(xiàn)代碼

    JavaScript 另類遍歷數(shù)組實(shí)現(xiàn)代碼,大家可以看下。
    2009-10-10

最新評(píng)論