需求:
原理:
拖动效果的实现基本都是dom操作来实现的,通过拖动分隔线,计算分隔线与浏览器边框的距离(left),来实现拖动之后的不同宽度的计算;当拖动分隔线1时,计算元素框left和mid;当拖动分隔线2时,计算元素框mid和right;同时设置元素框最小值以防止元素框拖没了(其实是被遮住了)。使用SetCapture() 和 ReleaseCapture()的函数功能指定窗口里设置鼠标捕获。
html部分代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
< template >
< div >
< ul class = "box" ref = "box" >
< li class = "left" ref = "left" >西瓜</ li >
< li class = "resize" ref = "resize" ></ li >
< li class = "mid" ref = "mid" >备注2</ li >
< li class = "resize2" ref = "resize2" ></ li >
< li class = "right" ref = "right" >test</ li >
</ ul >
< ul class = "box" ref = "box" >
< li class = "left" ref = "left" >芒果</ li >
< li class = "resize" ref = "resize" ></ li >
< li class = "mid" ref = "mid" >备注</ li >
< li class = "resize2" ref = "resize2" ></ li >
< li class = "right" ref = "right" >test</ li >
</ ul >
</ div >
</ template >
|
js部分代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
<script>
export default {
mounted () {
this .dragControllerDiv();
},
methods: {
dragControllerDiv: function () {
var resize = document.getElementsByClassName( 'resize' );
var resize2 = document.getElementsByClassName( 'resize2' );
var left = document.getElementsByClassName( 'left' );
var right = document.getElementsByClassName( 'right' );
var mid = document.getElementsByClassName( 'mid' );
var box = document.getElementsByClassName( 'box' );
for (let i = 0; i < resize.length; i++) {
resize[i].onmousedown = function (e) {
var startX = e.clientX;
resize[i].left = resize[i].offsetLeft;
document.onmousemove = function (e) {
var endX = e.clientX;
var rightW = right[i].offsetWidth;
var moveLen = resize[i].left + (endX - startX);
var maxT = box[i].clientWidth - resize[i].offsetWidth;
if (moveLen < 150) moveLen = 150;
if (moveLen > maxT - rightW - 150) moveLen = maxT - rightW - 150;
resize[i].style.left = moveLen;
for (let j = 0; j < left.length; j++) {
left[j].style.width = moveLen + 'px' ;
mid[j].style.width = (box[i].clientWidth - moveLen - rightW - 10) + 'px' ;
}
}
document.onmouseup = function (evt) {
document.onmousemove = null ;
document.onmouseup = null ;
resize[i].releaseCapture && resize[i].releaseCapture();
}
resize[i].setCapture && resize[i].setCapture();
return false ;
}
}
for (let i = 0; i < resize2.length; i++) {
resize2[i].onmousedown = function (e) {
var startX = e.clientX;
resize2[i].left = resize2[i].offsetLeft;
document.onmousemove = function (e) {
var endX = e.clientX;
var leftW = left[i].offsetWidth;
var moveLen = resize2[i].left + (endX - startX) - leftW;
var maxT = box[i].clientWidth - resize2[i].offsetWidth - 5;
if (moveLen < 150) moveLen = 150;
if (moveLen > maxT - leftW - 150) moveLen = maxT - leftW - 150;
resize2[i].style.left = moveLen;
for (let j = 0; j < right.length; j++) {
mid[j].style.width = moveLen + 'px' ;
right[j].style.width = (box[i].clientWidth - moveLen - leftW - 10) + 'px' ;
}
}
document.onmouseup = function (evt) {
document.onmousemove = null ;
document.onmouseup = null ;
resize2[i].releaseCapture && resize2[i].releaseCapture();
}
resize2[i].setCapture && resize2[i].setCapture();
return false ;
}
}
}
}
}
</script>
|
style部分:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
<style scoped>
ul,li{
list-style : none ;
display : block ;
margin : 0 ;
padding : 0 ;
}
.box{
width : 800px ;
height : 32px ;
overflow : hidden ;
}
. left {
width :calc( 30% - 10px );
height : 100% ;
background :skyblue;
float : left ;
}
.resize{
width : 5px ;
height : 100% ;
cursor : w-resize ;
float : left ;
}
.resize 2 {
width : 5px ;
height : 100% ;
cursor : w-resize ;
float : left ;
}
. right {
float : left ;
width : 35% ;
height : 100% ;
background :tomato;
}
.mid{
float : left ;
width : 35% ;
height : 100% ;
background : #f00 ;
}
</style>
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/vickylinj/p/13376437.html