我想像下图所示做一个圆形滑块。 jQuery能够做到这一点吗?
我知道直滑块是如何工作的,但我想制作一个HTML5圆形滑块。 这是我在网上找到的 http://jsfiddle.net/XdvNg/1/ - 但我不知道如何获得用户放下的滑块值
答案 0 :(得分:10)
以下是我提出的建议:
$(function () {
var $circle = $('#circle'),
$handler = $('#handler'),
$p = $('#test'),
handlerW2 = $handler.width()/2,
rad = $circle.width()/2,
offs = $circle.offset(),
elPos = {x:offs.left, y:offs.top},
mHold = 0,
PI2 = Math.PI/180;
$handler.mousedown(function() { mHold = 1; });
$(document).mousemove(function(e) {
if (mHold) {
var mPos = {x:e.pageX-elPos.x, y:e.pageY-elPos.y},
atan = Math.atan2(mPos.x-rad, mPos.y-rad),
deg = -atan/PI2+180,
perc = (deg*100/360)|0,
X = Math.round(rad* Math.sin(deg*PI2)),
Y = Math.round(rad* -Math.cos(deg*PI2));
$handler.css({left:X+rad-handlerW2, top:Y+rad-handlerW2, transform:'rotate('+deg+'deg)'});
}
}).mouseup(function() { mHold = 0; });
});
答案 1 :(得分:4)
以下是Roko脚本的改进版本: 的 jsFiddle demo 强>
要计算鼠标位置,我使用事件偏移(firefox的小修复),如果事件目标不是#rotationSliderContainer则更正。我还将吸引力添加到90度的倍数。
$(function(){
var $container = $('#rotationSliderContainer');
var $slider = $('#rotationSlider');
var $degrees = $('#rotationSliderDegrees');
var sliderWidth = $slider.width();
var sliderHeight = $slider.height();
var radius = $container.width()/2;
var deg = 0;
X = Math.round(radius* Math.sin(deg*Math.PI/180));
Y = Math.round(radius* -Math.cos(deg*Math.PI/180));
$slider.css({ left: X+radius-sliderWidth/2, top: Y+radius-sliderHeight/2 });
var mdown = false;
$container
.mousedown(function (e) { mdown = true; e.originalEvent.preventDefault(); })
.mouseup(function (e) { mdown = false; })
.mousemove(function (e) {
if(mdown)
{
// firefox compatibility
if(typeof e.offsetX === "undefined" || typeof e.offsetY === "undefined") {
var targetOffset = $(e.target).offset();
e.offsetX = e.pageX - targetOffset.left;
e.offsetY = e.pageY - targetOffset.top;
}
if($(e.target).is('#rotationSliderContainer'))
var mPos = {x: e.offsetX, y: e.offsetY};
else
var mPos = {x: e.target.offsetLeft + e.offsetX, y: e.target.offsetTop + e.offsetY};
var atan = Math.atan2(mPos.x-radius, mPos.y-radius);
deg = -atan/(Math.PI/180) + 180; // final (0-360 positive) degrees from mouse position
// for attraction to multiples of 90 degrees
var distance = Math.abs( deg - ( Math.round(deg / 90) * 90 ) );
if( distance <= 5 )
deg = Math.round(deg / 90) * 90;
if(deg == 360)
deg = 0;
X = Math.round(radius* Math.sin(deg*Math.PI/180));
Y = Math.round(radius* -Math.cos(deg*Math.PI/180));
$slider.css({ left: X+radius-sliderWidth/2, top: Y+radius-sliderHeight/2 });
var roundDeg = Math.round(deg);
$degrees.html(roundDeg + '°');
$('#imageRotateDegrees').val(roundDeg);
}
});
});
答案 2 :(得分:1)
以下是适合您需求的jQuery roundSlider插件,它也适用于移动设备和触控设备。
这个滑翔机有类似jQuery ui滑块的选项。它支持默认,最小范围和范围滑块类型。它不仅支持圆形滑块,还支持各种circle shapes,例如四分之一,一半和饼形圆形。
有关详细信息,请查看demos和documentation页。
请查看jsFiddle
中的演示。
输出屏幕截图:
您可以根据自己的要求自定义外观。请查看here以了解一些自定义外观。