首页 > 其他分享 >js 实现退拽效果

js 实现退拽效果

时间:2022-12-13 15:45:53浏览次数:62  
标签:parent 效果 实现 top js var Div document left

单个元素拖拽,不随页面滚动

css 部分

body{height:2000px;}
div{width:150px; height:150px;cursor: move;position: fixed;top:50px;color:#fff;box-sizing: border-box;z-index: 10;font-size: 16px}
#ele{background:#2196f3;left:10px; }

js 部分

window.onload=function(){
    // 获取元素
    var Div=document.getElementById('ele');
    drag(Div);
}
 1 // 拖拽运动
 2 function drag(Div){
 3           
 4     var lastX=0;
 5     var lastY=0;
 6     
 7     Div.onmousedown=function(ev)
 8     {
 9            var Ev=ev||event;
10            var disX=Ev.clientX-parseInt(getStyle(Div,'left'));
11            var disY=Ev.clientY-parseInt(getStyle(Div,'top'));
12         
13            if(Div.setCapture)//释放捕获  针对IE
14            {
15                document.onmousemove=Move;
16                document.onmouseup=Up;
17                Div.setCapture();
18            }
19             else
20            {
21                document.onmousemove=Move;
22                document.onmouseup=Up;
23            }
24            // 鼠标移动
25            function Move(ev)
26            {
27                var Ev=ev||event;
28                var l=Ev.clientX-disX;
29                var t=Ev.clientY-disY;
30             
31             
32                if(l>=document.documentElement.clientWidth-parseInt(getStyle(Div,'width')))
33                {
34                    l=document.documentElement.clientWidth-parseInt(getStyle(Div,'width'));
35                }
36                else if(l<=0)
37                {  l=0;    }
38                
39                if(t>=document.documentElement.clientHeight-parseInt(getStyle(Div,'height')))
40                {
41                    t=document.documentElement.clientHeight-parseInt(getStyle(Div,'height'));
42                 }
43                else if(t<=0)
44                {  t=0;  }
45                
46                lastX=l;
47                lastY=t; // 当前的点赋给一个变量(上一个点)
48                Div.style.left=l+'px';
49                  Div.style.top=t+'px'; //移动物体
50           }
51          // 鼠标抬起
52          function Up()
53           {
54                 document.onmousemove=null;
55                 document.onmouseup=null;
56                 if(Div.releaseCapture)
57                 { Div.releaseCapture(); }
58 
59           } 
60          return false;
61     }
62 }
63 
64 //提取非行间样式
65 function getStyle(obj,attr)
66 {
67       if(obj.currentStyle)
68       { return obj.currentStyle[attr];}
69       else
70       { return getComputedStyle(obj,false)[attr];}    
71 }
View Code

html 部分

<body>
    <div id="ele">单个退拽元素<br/>原生js<br/>不跟随页面滚动</div>
</body>

多个元素拖拽,不随页面滚动

css 部分

body{height:2000px;}
div{width:150px; height:150px;cursor: move;position: fixed;top:50px;color:#fff;box-sizing: border-box;z-index: 10;font-size: 16px}
#ele1{background:#2196f3;left:10px; }
#ele2{background:#ff5722;left:180px;}
#ele3{background:#08c80f;left:360px; }

js 部分

window.onload=function(){
    //获取拖拽的元素
    var ele1=document.getElementById('ele1');
    var ele2=document.getElementById('ele2');
    var ele3=document.getElementById('ele3');
    // 层级问题默认 ele1:1,ele2:2,ele3:3
    // 定义公共层级变量,3个定义的一样,这里取了第一个
    this.layer=parseInt(getStyle(ele1,'z-index'))
    drag(ele1);
    drag(ele2);
    drag(ele3);
}
 1 // 拖拽运动
 2 function drag(ele){
 3     var Div=ele;
 4     var lastX=0;
 5     var lastY=0;
 6     
 7     Div.onmousedown=function(ev)
 8     {
 9            var Ev=ev||event;
10            var disX=Ev.clientX-parseInt(getStyle(Div,'left'));
11            var disY=Ev.clientY-parseInt(getStyle(Div,'top'));
12 
13            if(Div.setCapture)//设置释放捕获  针对IE
14            {
15                document.onmousemove=Move;
16                document.onmouseup=Up;
17                Div.setCapture();
18            }
19             else
20            {
21                document.onmousemove=Move;
22                document.onmouseup=Up;
23            }
24            // 鼠标移动
25             function Move(ev)
26             {
27                var Ev=ev||event;
28                var l=Ev.clientX-disX;
29                var t=Ev.clientY-disY;
30                Div.style.zIndex=window.layer=window.layer+1
31             
32                if(l>=document.documentElement.clientWidth-parseInt(getStyle(Div,'width')))
33                {
34                    l=document.documentElement.clientWidth-parseInt(getStyle(Div,'width'));
35                }
36                else if(l<=0)
37                {  l=0;    }
38                
39                if(t>=document.documentElement.clientHeight-parseInt(getStyle(Div,'height')))
40                {
41                    t=document.documentElement.clientHeight-parseInt(getStyle(Div,'height'));
42                 }
43                else if(t<=0)
44                {  t=0;  }
45                
46                lastX=l;
47                lastY=t; // 当前的点赋给一个变量(上一个点)
48                Div.style.left=l+'px';
49                  Div.style.top=t+'px'; //移动物体
50             }
51             // 鼠标抬起
52             function Up()
53               {
54                 document.onmousemove=null;
55                 document.onmouseup=null;
56                 if(Div.releaseCapture)
57                 { Div.releaseCapture(); }
58 
59               } 
60             return false;
61     }// onm ousedown 结束
62 }
63 
64 //提取非行间样式
65 function getStyle(obj,attr)
66 {
67       if(obj.currentStyle)
68       { return obj.currentStyle[attr];}
69       else
70       { return getComputedStyle(obj,false)[attr];}    
71 }
View Code

html 部分

<body>
    <div id="ele1">多个退拽元素<br/>原生js<br/>不跟随页面滚动<br/>最后拖拽的在最上面</div>
    <div id="ele2">多个退拽元素<br/>原生js<br/>不跟随页面滚动<br/>最后拖拽的在最上面</div>
    <div id="ele3">多个退拽元素<br/>原生js<br/>不跟随页面滚动<br/>最后拖拽的在最上面</div>
</body>

单个元素拖拽,添加选项配置

css 部分

/*body{height:2000px;width:2000px;}*/
*{margin:0px;padding:0px;}
p{margin:150px; }
/*如果父元素不是body,建议手动指定 left top 值,如果不指定 默认 bottom:0; left:50( 我这里设置margin:50 原因); */
#warp{width:500px;height:500px;border: 1px #ccc solid;margin:50px; background: #fff;left:50px;top:50px;}
#ele{width:150px; height:150px;cursor: move;color:#fff;box-sizing: border-box;z-index: 10;font-size: 16px;background:#2196f3; }

js 部分

配置参数:

top,bottom,left,right 默认值为 0 ,拖拽元素 距离 范围元素(默认body) 的距离
direction 拖拽方向,默认为任意方向,lr(左右) tb(上下)
parent:'warp', 为页面唯一元素,拖拽元素活动范围 元素,id 名称,例如 warp ,默认body整个页面
scroll:false 拖拽元素是否随 页面滚动 false 不随页面滚动,true 随页面滚动

window.onload=function(){
    // 配置选项
    var opt={
            top:0,
            bottom:0,
            left:20,
            right:10,
            parent:'warp', // 为页面唯一元素,id 名称,例如 warp ,默认body整个页面
            scroll:false // 拖拽元素是否随 页面滚动 false 不随页面滚动,true 随页面滚动
    }
    var obj=document.getElementById('ele');
    // 调用退拽函数
    drag(obj,opt);
}
  1 // 拖拽运动
  2 function drag(obj,opt={},){
  3     // 默认配置选项
  4     var option={
  5             direction:'auto',//方向 lr(左右)  tb(上下)
  6             // 运动范围 默认父级边界
  7             top:0,
  8             bottom:0,
  9             left:0,
 10             right:0,
 11             //parent:'warp', // 为页面唯一元素,id 名称,例如 warp ,默认body整个页面
 12             scroll:false // 拖拽元素是否随 页面滚动 false 不随页面滚动,true 随页面滚动
 13         }
 14          // 合并对象参数
 15         Object.assign(option,opt)
 16           
 17         var lastX=0;
 18         var lastY=0;
 19         var parent_width=0,parent_height=0,parent_left=0,parent_top=0;
 20         var ele_position='fixed'
 21         if(option.scroll){
 22             ele_position='absolute'
 23         }else{
 24             // 如果不跟随页面滚动,并且元素父级不是body,父元素定位,
 25             if(option.parent)
 26                 document.getElementById(option.parent).style.position='fixed'
 27         }
 28 
 29         // 设置元素的定位,需要放置获取 parent_* 值之前
 30         obj.style.position=ele_position
 31         
 32         if(option.parent){
 33             var parent_ele=document.getElementById(option.parent)
 34             parent_width=parent_ele.clientWidth;
 35             parent_height=parent_ele.clientHeight;
 36             parent_left=parent_ele.offsetLeft;
 37             parent_top=parent_ele.offsetTop;
 38         }else{
 39                 if(option.scroll){
 40                     parent_width=document.documentElement.scrollWidth
 41                     parent_height=document.documentElement.scrollHeight
 42                 }else{
 43                     parent_width=document.documentElement.clientWidth
 44                     parent_height=document.documentElement.clientHeight
 45                 }
 46         }
 47 
 48         // 设置元素位置
 49         obj.style.left=option.left+parent_left+'px'
 50         obj.style.top=option.top+parent_top+'px'
 51 
 52         obj.onmousedown=function(ev)
 53         {
 54            var Ev=ev||event;
 55            var disX=0,disY=0;
 56 
 57            if(option.direction=="lr"){
 58                      disX=Ev.clientX-parseInt(getStyle(obj,'left'));
 59            }else if(option.direction=="tb"){
 60                  disY=Ev.clientY-parseInt(getStyle(obj,'top'));
 61            }else{
 62                  disX=Ev.clientX-parseInt(getStyle(obj,'left'));
 63                  disY=Ev.clientY-parseInt(getStyle(obj,'top'));
 64            }
 65 
 66            if(obj.setCapture)//设置鼠标捕获  针对IE
 67            {
 68                document.onmousemove=Move;
 69                document.onmouseup=Up;
 70                obj.setCapture();
 71            }else
 72            {
 73                document.onmousemove=Move;
 74                document.onmouseup=Up;
 75            }
 76            // 鼠标移动
 77            function Move(ev)
 78            {
 79                var Ev=ev||event;
 80                var left=0,top=0,move_left=0,move_top=0
 81                if(option.direction=="lr"){
 82                        // 可移动的最大左边距离
 83                        move_left=parent_width-parseInt(getStyle(obj,'width'))-option.right+parent_left
 84                           if(left>=move_left){
 85                               left=move_left
 86                           }else if(left<=option.left+parent_left){
 87                               left=option.left+parent_left
 88                           }else{
 89                               left=Ev.clientX-disX;
 90                           }
 91                           lastX=left;
 92                           obj.style.left=left+'px';
 93                    
 94                    }else if(option.direction=="tb"){
 95                     // 可以移动的最大上边距
 96                     move_top=parent_height-parseInt(getStyle(obj,'height'))-option.top+parent_top
 97                     if(top>=move_top){
 98                         top=move_top
 99                     }else if(top<=option.bottom+parent_top){
100                         top=option.bottom
101                     }else{
102                             top=Ev.clientY-disY;
103                     }
104                     lastY=top; 
105                     obj.style.top=top+'px'; 
106                    }else{
107                     left=Ev.clientX-disX;
108                     top=Ev.clientY-disY;
109                 
110                     move_left=parent_width-parseInt(getStyle(obj,'width'))-option.right+parent_left
111                     move_top=parent_height-parseInt(getStyle(obj,'height'))-option.bottom+parent_top
112                 
113                     if(left>=move_left){
114                               left=move_left
115                           }else if(left<=option.left+parent_left){
116                               left=option.left+parent_left
117                           }
118                           if(top>=move_top){
119                         top=move_top
120                      }else if(top<=option.bottom+parent_top){
121                         top=option.bottom+parent_top
122                      }
123 
124                     lastX=left;
125                     lastY=top; // 当前的点赋给一个变量(上一个点)
126                     obj.style.left=left+'px';
127                       obj.style.top=top+'px'; //移动物体
128                    }
129             }
130             // 鼠标抬起
131             function Up()
132               {
133                 document.onmousemove=null;
134                 document.onmouseup=null;
135                 //释放捕获
136                 if(obj.releaseCapture)
137                 { obj.releaseCapture(); }
138 
139               } 
140         return false;
141     }// onm ousedown 结束
142 }
143 
144 //提取非行间样式
145 function getStyle(obj,attr)
146 {
147       if(obj.currentStyle)
148       { return obj.currentStyle[attr];}
149       else
150       { return getComputedStyle(obj,false)[attr];}    
151 }
View Code

html 部分

<body>
    <div id="warp"><p>指定元素内拖拽</p></div>    <p>测试部分</p>
    <div id="ele">单个退拽元素<br/>原生js<br/>添加配置选项</div>
    <p>测试部分</p>
</body>

标签:parent,效果,实现,top,js,var,Div,document,left
From: https://www.cnblogs.com/xuey/p/16978799.html

相关文章

  • Go 结构体与 JSON 之间的转换
    耐心和持久胜过激烈和狂热。哈喽大家好,我是陈明勇,今天分享的内容是Go结构体与JSON之间的转换。如果本文对你有帮助,不妨点个赞,如果你是Go语言初学者,不妨点个关注,一起成......
  • js中的强制类型转换、运算符、关系运算符、逻辑运算符、条件运算符
    1、强制类型转换Number1.1代码<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>强制类型Number</title><styletype="text/css"></style>......
  • Android 手势导航核心实现
    一、如何找到入口Android10推出了全新的手势导航功能,原生的Android系统就提供了此功能,根据这个切入点查询相关实现,Android10和11的源码里面,在SystemUI模块里面可以找到......
  • Unity UGUI实现图文混排
    目前在unity实现图文混排的好像都是通过自定义字体然后在文本获取字符的位置,用图片替换掉图片标签,这样对于支持英文来说,并没有什么影响。然后对于中文来说就是一个相当麻烦......
  • Unity实现在白板上绘画涂鸦
    前言有段时间没有更新博客了,不知道应该写些什么,太简单感觉没有记录的必要,太难自己都没能理解,不知道如何下手。回归初心,记录自己想记录的东西。需要实现一个白板绘画的功能,......
  • Unity 简易的UI背景昼夜轮替效果
    在UI背景上实现一个简易的有光影照射的昼夜轮替效果,往往比一个死板的UI背景看起来更加形象生动,比较传统的方式是多图轮流替换的序列帧动画,不过要达到整个UI背景大图的所有地......
  • thinkphp6 json(captcha())为空
    首先:composerrequiretopthink/think-captchav3.0.8  把这张图片下载,后缀名png改成zip,解压到:vendor/topthink ......
  • 通过代码实现Excel中数据插入数据库
    packagecom.tianju.supermelon.controller;importcom.tianju.supermelon.common.dtos.ResponseResult;importcom.tianju.supermelon.domain.AvatarInfo;importcom.tian......
  • UE4实现闪烁效果
    官网文档链接:​​http://docs.unrealengine.com/latest/CHN/Engine/Rendering/Materials/ExpressionReference/Math/index.html?utm_source=editor&utm_medium=docs&utm_ca......
  • Unity UGUI实现分段式血条
    我们可以看到像英雄联盟等游戏里英雄头顶的血条显示并非是纯色的,而是根据血量的多少而显示一定量的格子,这种方式明显是比较友好、比较美观的,事实上我们的游戏里面也想实现这......