我正在尝试在JavaScript中构建一个可拖动的基于列的布局,并且在使用它时遇到了一些困难。
布局由3列(div)组成,每个列都有两个可拖动的div。我们的想法是它们绝对定位,当您拖动拖动器时,列的相应宽度和左侧值都会更新。
三列应该始终跨越浏览器的整个宽度(最右边的列是100%宽度),但是当调整浏览器大小时,其他两个应该保持静态(这就是为什么我使用px,不是%)。
我的代码尚未运行,我对JavaScript相对较新(这就是我不想使用jQuery的原因)。
话虽如此,必须有一种更有效(更清洁)的方法来实现这一目标,只需使用更少的代码(无需使用$ key)。
如果拥有一些很棒的JS技能的人可以帮助我解决这个问题,我会非常感激。
这是我正在研究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();
});
}
答案 0 :(得分:1)
我在这里看到了一些错误。首先,mousemove
事件仅在鼠标悬停在该元素上时触发元素。您可能会更好地在mousemove
元素的父上注册div.drag
侦听器,然后在鼠标事件发生时计算鼠标在该父级内的位置,然后使用该位置调整列和拖动器的大小。
其次,通过使用setInterval
注册函数,我不太确定您要做什么。注册事件监听器你做得很好;为什么不继续使用它们来改变DOM的状态?为什么要切换到基于轮询的机制? (并且传递给setInterval
的函数无论如何都不会起作用 - 它引用一个名为event
的变量,该变量在该上下文中是未定义的。)
答案 1 :(得分:1)
这只是一个小例子...我希望它可以帮助你:)。
window.onload = function() {
var myDiv = document.getElementById('myDiv');
function show_coords(){
var monitor = document.getElementById('monitor');
var x = event.clientX - myDiv.clientWidth / 2;
var y = event.clientY - myDiv.clientWidth / 2;
monitor.innerText = "X: " + x + "\n" + "Y: " + y;
myDiv.style.left = x + "px";
myDiv.style.top = y + "px";
}
document.onmousemove = function(){
if(myDiv.innerText == "YES"){show_coords();}
}
myDiv.onmousedown = function(){
myDiv.innerText = "YES";
}
myDiv.onmouseup = function(){
myDiv.innerText = "NO";
}
}