最近项目进程紧张,没法再愉快的网上冲浪了
因为项目需要实现一个页面上可拖拽改变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(){ ...同上 }
最终效果为: