panchengyong

 

javascript 拖动效果

文章来源:http://jiarry.blogchina.com/4843957.html

关键词javascript    拖动    拖拽    移动层                                          

 

JavaScript中如何实现对层的控制,移动和拖动?现在个性化的界面越来越多,一个能随意拖放物件的个性化页面将会很受欢迎。随着WEB2.0的发展,网页界面技术将得到充分发展,越来越多的程序员开始认识到,程序不只是为后台而开发,而应该是前端与后台的结合。结合完美的产品才是符合用户城需求的,才能给用户带去丰富的体验。让B/S模式也能体现C/S模式的丰富与便捷将会是一个发展趋势。下面这个例子就是一个简单的拖动实例,类似于lovewall.net上的拖动,但功能要健全一些,适合各种浏览器,可以置底,置顶,删除。

下面开始我们的步骤,
1,在页面上添加一个div,代码如下,这里用来拖动的实体。注意class,rel,id,mousedown事件等等要完整。这样的代码可以复制多份,id号可以是darg2,darg3...,style定义可以根据需要来写。

<div class="drag" rel="drag" id="drag1" style="left:30px;top:10px;" onmousedown="dargit(this,event);">
  <div class="da" ><span class="x">x</span>拖动区1.</div>
  文字1
</div>

2,
在head区域添加style
<style type="text/css">
<!--
.drag{position:absolute;width:200px; background-color:green;height:120px;z-index:1;}
.da{width:100%;height:20px;background-color:black;color:white;cursor:move;}
.x{float:right;color:red;cursor:pointer;}
-->
</style>

3,在网页body的最后面添加下面的js代码。
<script type="text/javascript">
var ey=0,ex=0,lx=0,ly=0,canDrg=false,thiso=null;//
var x, y,rw,rh;
 var divs=document.getElementsByTagName("div");
 for (var i=0;i<divs.length;i++){ 
   if(divs[i].getAttribute("rel")=="drag"){
     divs[i].onmousemove=function(){
     thismove(this);//实时得到当前对象与鼠标的值以判断拖动及关闭区域;
  }
   /*
    var c=1;if(document.all)c=0;
  divs[i].childNodes[c].onmousedown=function(){
      dargit(this,event);
  }
  */
     //divs[i].onmousedown=function(){
             // st(this);
  //} 
   }
 }

function thismove(o){
    rw=parseInt(x)-parseInt(o.style.left);
    rh=parseInt(y)-parseInt(o.style.top);
 document.title=rw+"=文本区域="+rh;
    if(rh<=20 && rw>=180)document.title=rw+"||20*20||"+rh;//右上角20*20的关闭区域
 if(rh<=20 && rw<180 )document.title=rw+"||可选||"+rh;//绝对拖动条选择区域;
}
function dargit(o,e){
thiso = o;
canDrg = true;
 if(!document.all){
      lx = e.clientX; ly = e.clientY;
      }else{
        lx = event.x; ly = event.y;
   }
 if(document.all) thiso.setCapture();
   
 st(o);//置前或置后
 
}

document.onmousemove = function(e){
if(!document.all){ x = e.clientX; y = e.clientY; }else{ x = event.x; y = event.y; }
if(canDrg){
    //if(rh<=20 && rw<180 ){//如果要设定拖动区域可以作判断
 var ofsx = x - lx;
 thiso.style.left = parseInt(thiso.style.left) + ofsx;
 lx = x;
 var ofsy = y - ly;
 thiso.style.top = parseInt(thiso.style.top) + ofsy;
 ly = y;
 //}else{canDrg=false;}
}
}

document.onmouseup=function(){
     canDrg=false;//拖拽变量设为false
     if(document.all && thiso != null){
      //ie下,将清捕获;
         thiso.releaseCapture();
      thiso = null;
   }
}


function set(obj){
     obj=obj.parentNode.parentNode;
     if(obj.getAttribute("rel"));
    //obj.style.zIndex=1;
   
}
function st(o){

var p = o.parentNode;
if(p.lastChild != o){
  p.appendChild(o);
}

if(rh<=20 && rw>=180){
canDrg=false;
//如果选择的是关闭区域;
    window.status=rw+"|"+rh;
    if(p.firstChild == o) return;
    p.insertBefore(o, p.firstChild);
        }
}

</script>

 

function thismove(o){
    rw=parseInt(x)-parseInt(o.style.left);
    rh=parseInt(y)-parseInt(o.style.top);
 document.title=rw+"=文本区域="+rh;
    if(rh<=20 && rw>=180)document.title=rw+"||20*20||"+rh;//右上角20*20的关闭区域
 if(rh<=20 && rw<180 )document.title=rw+"||可选||"+rh;//绝对拖动条选择区域;
}
function dargit(o,e){
thiso = o;
canDrg = true;
 if(!document.all){
      lx = e.clientX; ly = e.clientY;
      }else{
        lx = event.x; ly = event.y;
   }
 if(document.all) thiso.setCapture();
   
 st(o);//置前或置后
 
}

document.onmousemove = function(e){
if(!document.all){ x = e.clientX; y = e.clientY; }else{ x = event.x; y = event.y; }
if(canDrg){
    //if(rh<=20 && rw<180 ){//如果要设定拖动区域可以作判断
 var ofsx = x - lx;
 thiso.style.left = parseInt(thiso.style.left) + ofsx;
 lx = x;
 var ofsy = y - ly;
 thiso.style.top = parseInt(thiso.style.top) + ofsy;
 ly = y;
 //}else{canDrg=false;}
}
}

document.onmouseup=function(){
     canDrg=false;//拖拽变量设为false
     if(document.all && thiso != null){
      //ie下,将清捕获;
         thiso.releaseCapture();
      thiso = null;
   }
}


function set(obj){
     obj=obj.parentNode.parentNode;
     if(obj.getAttribute("rel"));
    //obj.style.zIndex=1;
   
}
function st(o){

var p = o.parentNode;
if(p.lastChild != o){
  p.appendChild(o);
}

if(rh<=20 && rw>=180){
canDrg=false;
//如果选择的是关闭区域;
    window.status=rw+"|"+rh;
    if(p.firstChild == o) return;
    p.insertBefore(o, p.firstChild);
        }
}

</script>

 

3,在网页body的最后面添加下面的js代码。
<script type="text/javascript">
var ey=0,ex=0,lx=0,ly=0,canDrg=false,thiso=null;//
var x, y,rw,rh;
 var divs=document.getElementsByTagName("div");
 for (var i=0;i<divs.length;i++){ 
   if(divs[i].getAttribute("rel")=="drag"){
     divs[i].onmousemove=function(){
     thismove(this);//实时得到当前对象与鼠标的值以判断拖动及关闭区域;
  }
   /*
    var c=1;if(document.all)c=0;
  divs[i].childNodes[c].onmousedown=function(){
      dargit(this,event);
  }
  */
     //divs[i].onmousedown=function(){
             // st(this);
  //} 
   }
 }

function thismove(o){
    rw=parseInt(x)-parseInt(o.style.left);
    rh=parseInt(y)-parseInt(o.style.top);
 document.title=rw+"=文本区域="+rh;
    if(rh<=20 && rw>=180)document.title=rw+"||20*20||"+rh;//右上角20*20的关闭区域
 if(rh<=20 && rw<180 )document.title=rw+"||可选||"+rh;//绝对拖动条选择区域;
}
function dargit(o,e){
thiso = o;
canDrg = true;
 if(!document.all){
      lx = e.clientX; ly = e.clientY;
      }else{
        lx = event.x; ly = event.y;
   }
 if(document.all) thiso.setCapture();
   
 st(o);//置前或置后
 
}

document.onmousemove = function(e){
if(!document.all){ x = e.clientX; y = e.clientY; }else{ x = event.x; y = event.y; }
if(canDrg){
    //if(rh<=20 && rw<180 ){//如果要设定拖动区域可以作判断
 var ofsx = x - lx;
 thiso.style.left = parseInt(thiso.style.left) + ofsx;
 lx = x;
 var ofsy = y - ly;
 thiso.style.top = parseInt(thiso.style.top) + ofsy;
 ly = y;
 //}else{canDrg=false;}
}
}

document.onmouseup=function(){
     canDrg=false;//拖拽变量设为false
     if(document.all && thiso != null){
      //ie下,将清捕获;
         thiso.releaseCapture();
      thiso = null;
   }
}


function set(obj){
     obj=obj.parentNode.parentNode;
     if(obj.getAttribute("rel"));
    //obj.style.zIndex=1;
   
}
function st(o){

var p = o.parentNode;
if(p.lastChild != o){
  p.appendChild(o);
}

if(rh<=20 && rw>=180){
canDrg=false;
//如果选择的是关闭区域;
    window.status=rw+"|"+rh;
    if(p.firstChild == o) return;
    p.insertBefore(o, p.firstChild);
        }
}

</script>


4,添加完上面的部分就是完成了基本的功能了,具体效果可以查看darg_ok.html,高级点的功能可以查看darg_ok1.html,还可以查看php+mysql版的lovewall全部源代码,asp版的可以去爱墙获取,不过我的版本功能更强大些。

谢谢观看本文章,由于时间仓促,整理得也不够仔细,这主要是给自己的过程作个记录。希望某天用时好找一点而已

4,添加完上面的部分就是完成了基本的功能了,具体效果可以查看darg_ok.html,高级点的功能可以查看darg_ok1.html,还可以查看php+mysql版的lovewall全部源代码,asp版的可以去爱墙获取,不过我的版本功能更强大些。

谢谢观看本文章,由于时间仓促,整理得也不够仔细,这主要是给自己的过程作个记录。希望某天用时好找一点而已

- 评论人:jarry   2006-04-14 18:06:06 

拖动效果实例
[url]www.google.com[/url] 个性化首页
[url]www.dodoor.cn[/url]
[url]space.msn.com[/url]
[url]www.start.com[/url]
[url]www.live.com[/url]

- 评论人:morning   2006-04-14 18:00:37   

http://lslnx.zsu.edu.cn/webspace/78229/personel_web/jiarry/resources/darg/drag_ok1.html
效果是可以拖动,置顶,移除。

http://www.dodoor.cn/
这个网站与google个性化首页以及MSN space比较像了。



Trackback: http://tb.donews.net/TrackBack.aspx?PostId=831333

posted on 2006-04-28 08:56  潘成勇  阅读(1263)  评论(0编辑  收藏  举报

导航