我正在创建一个jQuery滚动条,用于滚动< div>中的内容。这就像jQuery ScrollPane。
我已经到了需要移动滚动按钮的位置。我的问题是:没有任何UI插件,最好的方法是什么?因此,当用户单击滚动按钮时,可以使用mousedown事件在其父容器中垂直移动它。我怎么能这样做?
答案 0 :(得分:8)
这是一个起点,希望这就是你所追求的目标:
$(function() {
$('.slider').slider();
});
$.fn.slider = function() {
return this.each(function() {
var $el = $(this);
$el.css('top', 0);
var dragging = false;
var startY = 0;
var startT = 0;
$el.mousedown(function(ev) {
dragging = true;
startY = ev.clientY;
startT = $el.css('top');
});
$(window).mousemove(function(ev) {
if (dragging) {
// calculate new top
var newTop = parseInt(startT) + (ev.clientY - startY);
//stay in parent
var maxTop = $el.parent().height()-$el.height();
newTop = newTop<0?0:newTop>maxTop?maxTop:newTop;
$el.css('top', newTop );
}
}).mouseup(function() {
dragging = false;
});
});
}
.container{
position:relative;
border:1px solid red;
height:100px;
}
.slider{
height:20px;
width:20px;
background:green;
position:absolute;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
<div class="container">
<div class="slider" />
</div>
</div>
<br/>
<div class="container">
<div class="slider" />
</div>
答案 1 :(得分:6)
我用简单的javascript开发了一个正确的nav dock样式项。 这是链接:
https://github.com/developerDoug/HtmlJavascriptDockInVS2010
如果您能说服您的客户这样做,那么使用ui插件会是最好的。如果没有,你需要关注的是hanling mousedown或类似的东西,注意到移动已经开始。关注的方法有:mousedown,mousemove,mouseup。
例如,如果在某个div上,你检测到mousedown,你可以调用一个函数,它基本上是你的beginDrag,获取xy坐标,保持对起始坐标的引用,attachEvent(如果IE),addEventListener(对于所有其他浏览器)。
例如:
// keep reference to drag div
_dragObj = new Object();
$("myDragDiv").mousedown(function(e) {
dragBegin(e);
}
function dragBegin(e) {
_dragObj = document.getElementById('myDragDiv');
var x, y;
if (navigator.userAgent.indexOf("MSIE") >= 0) {
x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
} else {
x = e.clientX + window.scrollX;
y = e.clientY + window.scrollY;
}
_dragObj.cursorStartX = x;
_dragObj.cursorStartY = y;
if (navigator.userAgent.indexOf("MSIE") >= 0) {
document.attachEvent("onmousemove", dragContinue);
document.attachEvent("onmouseup", dragEnd);
window.event.cancelBubble = true;
window.event.returnValue = false;
} else {
document.addEventListener("mousemove", dragContinue, true);
document.addEventListener("mouseup", dragEnd, true);
e.preventDefault();
}
}
function dragContinue(e) {
var x, y;
var isIE = _browser.isIE;
var isWebKitBased = _browser.isWebKitBased;
if (navigator.userAgent.indexOf("MSIE") >= 0) {
x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
} else {
x = e.clientX + window.scrollX;
y = e.clientY + window.scrollY;
}
var distance = x - _dragObj.cursorStartX;
distance = Math.abs(distance);
// or top, bottom, right
_dragObj.elNode.style.left = (_dragObj.elStartLeft + x - _dragObj.cursorStartX) + "px";
if (navigator.userAgent.indexOf("MSIE") >= 0) {
window.event.cancelBubble = true;
window.event.returnValue = false;
} else {
e.preventDefault();
}
}
function dragEnd() {
if (navigator.userAgent.indexOf("MSIE") >= 0) {
document.detachEvent("onmousemove", dragContinue);
document.detachEvent("onmouseup", dragEnd);
} else {
document.removeEventListener("mousemove", dragContinue, true);
document.removeEventListener("mouseup", dragEnd, true);
}
}