gpt4 book ai didi

javascript - 使用纯 JavaScript 的可拖动列

转载 作者:搜寻专家 更新时间:2023-10-31 08:44:58 24 4
gpt4 key购买 nike

我正在尝试用 JavaScript 构建一个基于可拖动列的布局,但遇到了一些困难。

布局由 3 列 (div) 组成,每个列有两个可拖动的 div。这个想法是,它们是绝对定位的,当您拖动拖动器时,列的相应宽度和左侧值会更新。

三列应该始终跨越浏览器的整个宽度(最右边的列是 100% 宽度),但是当浏览器调整大小时,其他两列应该默认保持静态(这就是我使用 px 的原因,不是 %)。

我的代码目前还不能正常工作,我对 JavaScript 比较陌生(这就是我不想使用 jQuery 的原因)。

话虽如此,必须有一种更有效(更简洁)的方法来实现这一目标,并且代码更少(无需使用 $ 键)。

如果任何具有一些很棒的 JS 技能的人可以帮助我解决这个问题,我将不胜感激。

这是我正在研究的 fiddle http://jsfiddle.net/ZFwz5/3/

代码如下:

HTML

<!-- colums -->
<div class="col colA"></div>
<div class="col colB"></div>
<div class="col colC"></div>

<!-- draggers -->
<div class="drag dragA" style="position: absolute; width: 0px; height: 100%; cursor: col-resize; left:100px;"><div></div></div>
<div class="drag dragB" style="position: absolute; width: 0px; height: 100%; cursor: col-resize; left: 300px;"><div></div></div>

CSS:

body {
overflow:hidden;
}
.col {
position: absolute;
height:100%;
left: 0;
top: 0;
overflow: hidden;
}
.colA {background:red;width:100px;}
.colB {background:green; width:200px; left:100px;}
.colC {background:blue; width:100%; left:300px;}

.drag > div {
background: 0 0;
position: absolute;
width: 10px;
height: 100%;
cursor: col-resize;
left: -5px;
}

还有我糟糕的 JavaScript:

//variabe columns 
var colA = document.querySelector('.colA');
var colB = document.querySelector('.colB');
var colC = document.querySelector('.colC');

//variable draggers
var draggers = document.querySelectorAll('.drag');
var dragA = document.querySelector(".dragA");
var dragB = document.querySelector(".dragB");
var dragging = false;

function drag() {
var dragLoop;
var t = this;
var max;
var min;
if (dragging = true) {

if (this == dragA) {
min = 0;
max = dragB.style.left;
} else {
min = dragA.style.left;
max = window.innerWidth;
}

dragLoop = setInterval(function () {
var mouseX = event.clientX;
var mouseY = event.clientY;
if (mouseX >= max) {
mouseX = max;
}
if (mouseY <= min) {
mouseY = min;
}
t.style.left = mouseX;
updateLayout();
}, 200);
}
}
function updateLayout() {
var posA = dragA.style.left;
var posB = dragB.style.left;
colB.style.paddingRight = 0;

colA.style.width = posA;

colB.style.left = posA;
colB.style.width = posB - posA;

colC.style.left = posB;
colC.style.width = window.innerWidth - posB;
}


for (var i = 0; i < draggers.length; i++) {
draggers[i].addEventListener('mousedown', function () {
dragging = true;
});
draggers[i].addEventListener('mouseup', function () {
clearInterval(dragLoop);
dragging = false;
});
draggers[i].addEventListener('mouseMove', function () {
updateLayout();
drag();
});
}

最佳答案

我在这里看到了一些错误。首先,mousemove 事件仅在鼠标悬停在某个元素上时触发。在 div.drag 元素的 parent 上注册一个 mousemove 监听器,然后计算鼠标在该父元素中的位置发生鼠标事件,然后使用该位置调整列和拖动器的大小。

其次,我不太确定您尝试通过使用 setInterval 注册一个函数来做什么。您在注册事件监听器方面做得很好;为什么不继续使用它们来更改 DOM 的状态?为什么要切换到基于轮询的机制? (并且您传递给 setInterval 的函数无论如何都不起作用 - 它引用名为 event 的变量,在该上下文中它是未定义的。)

关于javascript - 使用纯 JavaScript 的可拖动列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23834283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com