使用 JS 实现了一个可拉伸的 div
,按住右边框,拖动鼠标可改变 div 的宽度。
1. 鼠标在浏览器中的坐标基本概念
2. 鼠标按住拖动改变宽度原理
- 鼠标按下时算出鼠标 x 坐标与元素右边框的距离,在鼠标移动时不变:
element.offsetWidth - event.offsetX
- 元素宽 = 鼠标距离元素左边框距离
event.offsetX
+ 1中算出的值
改变高度同理。
3. 代码实现
HTML:
<div id="container1" class="resizable"></div>
JavaScript:混用了浏览器原生 API 与 jQuery,因为 jQuery 的链式调用太好用了
bindResize();
function bindResize() {
const el = document.getElementById('container1');
let els = el.style, x = y = 0;
el.addEventListener('mousemove', function(evt) {
if (el.offsetWidth - evt.offsetX <= 10) {
els.cursor = 'e-resize';
} else {
els.cursor = 'auto';
}})
el.addEventListener('mousedown', function(evt) {
// 点击位置与元素右边框的距离,不变值
x = el.offsetWidth - evt.offsetX
// 在支持 setCapture 捕捉焦点, 设置事件
el.setCapture ? (
el.setCapture(),
el.onmousemove = function (ev) { mouseMove(ev || event) },
el.onmouseup = mouseUp
) : ($(document).bind("mousemove", mouseMove).bind("mouseup", mouseUp))
// 阻止默认事件
evt.preventDefault();
})
// 鼠标移动事件
function mouseMove(evt) {
els.width = evt.offsetX + x + 'px';
// 如果鼠标移出元素或屏幕外
if (evt.offsetX <= 0 || evt.offsetX >= document.body.clientWidth + 2) {
mouseUp()
}
}
// 释放焦点,移除事件
function mouseUp() {
el.releaseCapture ? (
el.releaseCapture(), el.onmousemove = el.onmouseup = null
) : ($(document).unbind("mousemove", mouseMove).unbind("mouseup", mouseUp))
}
}
4. 不用 js 可以实现 div 拉伸吗?
可以,两个 css 属性解决:
.resizable {
overflow: auto;
resize: both;
}
2022-03-02
参考