最近项目进程紧张,没法再愉快的网上冲浪了
因为项目需要实现一个页面上可拖拽改变div宽度的功能,类似效果如Chrome的右侧调试台样式:
大概思路为:
1.使用mousemove()方法,将鼠标的位置动态的赋予拖拽层
2.使用mousedown()方法,在鼠标被按下未抬起的过程中执行mousemove()
3.使用mouseup()方法,在鼠标按下并抬起后不执行mousemove()
实现步骤为:
-
先搭好页面静态样式
//左边区域
<div id="main">
<div id="left"></div>
<div id="right"></div>
</div>
//可拖拽区域,border充当鼠标点击的区域
<div id="div">
<div id="content">可拖拽</div>
<div id="border"></div>
</div>html,
body {
padding: 0;
margin: 0;
overflow: hidden;
} #main {
display: inline-flex;
position: absolute;
z-index: 1;
} #left {
flex: 2;
height: 100%;
background-color: cadetblue;
} #right {
flex: 10;
height: 100%;
background-color: cornsilk;
} #div {
width: 100px;
background-color: bisque;
position: absolute;
right: 0;
z-index: 2;
} #content {
padding-left: 5px;
} #border {
height: 100%;
width: 5px;
cursor: e-resize;
background-color: black;
position: absolute;
top: 0;
left: 0;
} -
再写js代码
//给div的初始赋值
var height = window.innerHeight;
var width = window.innerWidth;
$('#div').css({ 'width': width * 0.12, 'height': height })
$('#main').css({ 'width': width, 'height': height }) move();
//动态赋值函数
function move() {
var _move = false; //赋值标志,为真时给拖拽层赋值 //鼠标按下但未抬起
$("#border").mousedown(function (e) {
_move = true;
}) //鼠标移动
$(document).mousemove(function (e) {
//标志为真时赋值
if (_move) {
//用文档的可见区域宽减去当前鼠标相对于文档左边缘的宽度,得到的值即为拖拽层的宽度
var x = window.innerWidth - e.pageX;
//设置拖拽层最小宽度
if (x <= window.innerWidth * 0.01) {
x = window.innerWidth * 0.01;
}
// 设置拖拽层最大宽度
if (x >= window.innerWidth) {
x = window.innerWidth;
}
//给div设置宽度
$('#div').css('width', x)
}
}).mouseup(function () {
//鼠标按下并抬起
_move = false;
});
} -
此时,页面基本上已经可以实现拖拽赋值的效果了,但是我发现在改变浏览器大小时,元素的大小并不会随之改变,而是要刷新后才可以
-
这样非常影响使用感,所有我又调用了window.onresize()方法,在每次窗口被调整大小时给元素重新设置宽高即可
window.onload = function () {
setSize();
} window.onresize = function () {
setSize()
} function setSize() {
var height = window.innerHeight;
var width = window.innerWidth;
$('#div').css({ 'width': width * 0.12, 'height': height })
$('#main').css({ 'width': width, 'height': height })
} move();
function move(){
...同上
}最终效果为: