wordpress收费下载资源主题
wordpress付费下载资源插件

如何用JavaScript实现按钮拖动改变DIV宽高

下面是一个完整的实现方案,通过按住按钮拖动来改变指定DIV的宽高:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>拖动按钮改变DIV大小</title>
<style>
#resizable-box {
width: 300px;
height: 200px;
background-color: #f0f0f0;
border: 1px solid #ccc;
position: relative;
margin: 20px;
}

#resize-handle {
width: 20px;
height: 20px;
background-color: #666;
border-radius: 50%;
position: absolute;
bottom: 10px;
right: 10px;
cursor: nwse-resize;
}
</style>
</head>
<body>
<div id="resizable-box">
<div id="resize-handle"></div>
可调整大小的DIV
</div>

<script src="script.js"></script>
</body>
</html>

js代码:

document.addEventListener('DOMContentLoaded', function() {
const resizableBox = document.getElementById('resizable-box');
const resizeHandle = document.getElementById('resize-handle');

let isResizing = false;
let startX, startY, startWidth, startHeight;

// 鼠标按下事件
resizeHandle.addEventListener('mousedown', function(e) {
isResizing = true;

// 记录初始位置和尺寸
startX = e.clientX;
startY = e.clientY;
startWidth = parseInt(document.defaultView.getComputedStyle(resizableBox).width, 10);
startHeight = parseInt(document.defaultView.getComputedStyle(resizableBox).height, 10);

// 防止文本选中
e.preventDefault();
});

// 鼠标移动事件
document.addEventListener('mousemove', function(e) {
if (!isResizing) return;

// 计算鼠标移动距离
const deltaX = e.clientX - startX;
const deltaY = e.clientY - startY;

// 计算新尺寸(这里可以调整比例,例如保持宽高比)
const newWidth = startWidth + deltaX;
const newHeight = startHeight + deltaY;

// 应用新尺寸
resizableBox.style.width = Math.max(100, newWidth) + 'px'; // 最小宽度100px
resizableBox.style.height = Math.max(50, newHeight) + 'px'; // 最小高度50px
});

// 鼠标释放事件
document.addEventListener('mouseup', function() {
isResizing = false;
});

// 可选:防止拖动时页面滚动
document.addEventListener('dragover', function(e) {
e.preventDefault();
}, false);
});

如果你想支持四个方向的拖动(右下、右上、左下、左上),可以修改为:

document.addEventListener('DOMContentLoaded', function() {
const resizableBox = document.getElementById('resizable-box');
const resizeHandle = document.getElementById('resize-handle');

let isResizing = false;
let startX, startY, startWidth, startHeight, startLeft, startTop;
let resizeDirection = 'se'; // 默认右下角方向

// 鼠标按下事件
resizeHandle.addEventListener('mousedown', function(e) {
isResizing = true;

// 确定拖动方向(这里简化处理,只处理右下角)
// 实际应用中可以根据鼠标位置判断8个方向
resizeDirection = 'se';

// 记录初始位置和尺寸
startX = e.clientX;
startY = e.clientY;
startWidth = parseInt(document.defaultView.getComputedStyle(resizableBox).width, 10);
startHeight = parseInt(document.defaultView.getComputedStyle(resizableBox).height, 10);
startLeft = resizableBox.offsetLeft;
startTop = resizableBox.offsetTop;

e.preventDefault();
});

// 鼠标移动事件
document.addEventListener('mousemove', function(e) {
if (!isResizing) return;

const deltaX = e.clientX - startX;
const deltaY = e.clientY - startY;

let newWidth = startWidth;
let newHeight = startHeight;
let newLeft = startLeft;
let newTop = startTop;

switch(resizeDirection) {
case 'se': // 右下角
newWidth = Math.max(100, startWidth + deltaX);
newHeight = Math.max(50, startHeight + deltaY);
break;
case 'sw': // 左下角
newWidth = Math.max(100, startWidth - deltaX);
newHeight = Math.max(50, startHeight + deltaY);
newLeft = startLeft + deltaX;
break;
case 'ne': // 右上角
newWidth = Math.max(100, startWidth + deltaX);
newHeight = Math.max(50, startHeight - deltaY);
newTop = startTop + deltaY;
break;
case 'nw': // 左上角
newWidth = Math.max(100, startWidth - deltaX);
newHeight = Math.max(50, startHeight - deltaY);
newLeft = startLeft + deltaX;
newTop = startTop + deltaY;
break;
}

resizableBox.style.width = newWidth + 'px';
resizableBox.style.height = newHeight + 'px';
resizableBox.style.left = newLeft + 'px';
resizableBox.style.top = newTop + 'px';
});

// 鼠标释放事件
document.addEventListener('mouseup', function() {
isResizing = false;
});

// 防止拖动时页面滚动
document.addEventListener('dragover', function(e) {
e.preventDefault();
}, false);
});

如果需要保持宽高比,可以修改鼠标移动事件处理:

document.addEventListener('mousemove', function(e) {
if (!isResizing) return;

const deltaX = e.clientX - startX;
const deltaY = e.clientY - startY;

// 计算宽高比
const aspectRatio = startWidth / startHeight;

// 根据X或Y变化来计算尺寸
let newWidth = startWidth + deltaX;
let newHeight = newWidth / aspectRatio;

// 或者根据Y变化计算
// let newHeight = startHeight + deltaY;
// let newWidth = newHeight * aspectRatio;

// 应用新尺寸
resizableBox.style.width = Math.max(100, newWidth) + 'px';
resizableBox.style.height = Math.max(50, newHeight) + 'px';
});

这个实现可以让你通过拖动按钮来调整DIV的大小,你可以根据需要进一步定制样式和功能。

0 个评论

定制开发
本站承接WordPress等系统建站仿站、二次开发、主题插件定制等开发服务
在线咨询
  • 请先加Q,临时会话收不到
    QQ:1-247-246-247

  • QQ一群:104228692(满)
  • QQ二群:64786792
在线咨询
本站承接WordPress建站仿站、二次开发、主题插件定制等PHP开发服务!

了解详情