282 lines
7.6 KiB
HTML
282 lines
7.6 KiB
HTML
|
<html>
|
||
|
<head>
|
||
|
<title>Graphical ARIA Slider</title>
|
||
|
<script type="text/javascript">
|
||
|
/* ****** Variables to be set ****** */
|
||
|
var sliderSize = 300; //Width of slider in pixels
|
||
|
var moveValue = 10; //Value to change the slider on any action.
|
||
|
|
||
|
function displaySlider(slider)
|
||
|
{
|
||
|
var valueNow = parseInt(slider.getAttribute("aria-valuenow"));
|
||
|
var valueMin = parseInt(slider.getAttribute("aria-valuemin"));
|
||
|
var valueMax = parseInt(slider.getAttribute("aria-valuemax"));
|
||
|
|
||
|
var barWidth = slider.firstChild.scrollWidth;
|
||
|
var grade = sliderSize/valueMax;
|
||
|
|
||
|
//Set the left padding.
|
||
|
var leftPad = valueNow*grade-barWidth/2;
|
||
|
// if it is less then the min width.
|
||
|
if(leftPad < valueMin*grade){
|
||
|
leftPad = valueMin*grade;
|
||
|
}
|
||
|
// if it is greater than the max width
|
||
|
if(leftPad > valueMax*grade-barWidth){
|
||
|
leftPad = valueMax*grade-barWidth;
|
||
|
}
|
||
|
//The deferance between max and the current value, were going to use it like the valueMin was
|
||
|
var valueDown = valueMax-valueNow;
|
||
|
//Set the right padding
|
||
|
var rightPad = valueDown*grade-barWidth/2;
|
||
|
//If it is less than zero
|
||
|
if(rightPad < 0){
|
||
|
rightPad = 0;
|
||
|
}
|
||
|
//If it is too big
|
||
|
if(rightPad > valueMax*grade-barWidth-valueMin*grade){
|
||
|
rightPad = valueMax*grade-barWidth-valueMin*grade;
|
||
|
}
|
||
|
|
||
|
//Remove cases where *.5 is involved, this can cause the width to change by 1px if we don't fix it
|
||
|
if(rightPad >= leftPad){
|
||
|
var rightNew = Math.round(rightPad);
|
||
|
if(rightNew != rightPad){
|
||
|
rightPad = rightNew;
|
||
|
leftPad = leftPad-0.5;
|
||
|
}
|
||
|
}
|
||
|
if(leftPad >= rightPad){
|
||
|
var leftNew = Math.round(leftPad);
|
||
|
if(leftNew != leftPad){
|
||
|
leftPad = leftNew;
|
||
|
rightPad = rightPad-0.5;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//set the padding
|
||
|
slider.style.paddingRight = rightPad+'px';
|
||
|
slider.style.paddingLeft = leftPad+'px';
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
function handleSliderKey(slider, event)
|
||
|
{
|
||
|
var valueNow = parseInt(slider.getAttribute("aria-valuenow"));
|
||
|
var valueMin = parseInt(slider.getAttribute("aria-valuemin"));
|
||
|
var valueMax = parseInt(slider.getAttribute("aria-valuemax"));
|
||
|
|
||
|
// Find the key press and respond to it
|
||
|
var delta = 0;
|
||
|
var delta = 0;
|
||
|
var kLeft = 37;
|
||
|
var kRight = 39;
|
||
|
var kHome = 36;
|
||
|
var kEnd = 35;
|
||
|
if (event.keyCode == kLeft) {
|
||
|
delta = -moveValue/2;
|
||
|
}
|
||
|
else if (event.keyCode == kRight) {
|
||
|
delta = moveValue/2;
|
||
|
}
|
||
|
else if (event.keyCode == kHome) {
|
||
|
delta = -( valueNow - valueMin );
|
||
|
}
|
||
|
else if (event.keyCode == kEnd) {
|
||
|
delta = valueMax - valueNow
|
||
|
}
|
||
|
else {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
// Stop the values going over the max and min
|
||
|
valueNow += delta;
|
||
|
if (valueNow < valueMin) {
|
||
|
valueNow = valueMin;
|
||
|
}
|
||
|
if (valueNow > valueMax) {
|
||
|
valueNow = valueMax;
|
||
|
}
|
||
|
|
||
|
// Set the value and move the slider
|
||
|
slider.setAttribute("aria-valuenow", valueNow);
|
||
|
slider.setAttribute("aria-valuetext", "$" + valueNow + ".00" );
|
||
|
displaySlider(slider);
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
function sliderButton(event, where, id)
|
||
|
{
|
||
|
var slider = document.getElementById(id);
|
||
|
|
||
|
var valueNow = parseInt(slider.getAttribute("aria-valuenow"));
|
||
|
var valueMin = parseInt(slider.getAttribute("aria-valuemin"));
|
||
|
var valueMax = parseInt(slider.getAttribute("aria-valuemax"));
|
||
|
|
||
|
if (where == 'after') {
|
||
|
var value = -moveValue;
|
||
|
} else {
|
||
|
var value = moveValue;
|
||
|
}
|
||
|
|
||
|
// Enter was pressed or mouse clicked on the button
|
||
|
if (event.keyCode == 13 || event.button == 0){
|
||
|
// Calculate new value
|
||
|
var valueNow = valueNow + value;
|
||
|
|
||
|
// Stop the values going over the max and min
|
||
|
if (valueNow < valueMin) {
|
||
|
valueNow = valueMin;
|
||
|
} else if(valueNow > valueMax) {
|
||
|
valueNow = valueMax;
|
||
|
}
|
||
|
|
||
|
// Set the value and move the slider
|
||
|
slider.setAttribute("aria-valuenow", valueNow);
|
||
|
slider.setAttribute("aria-valuetext", "$" + valueNow + ".00" );
|
||
|
displaySlider(slider);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function barMouseDown(event, bar)
|
||
|
{
|
||
|
if (event.preventDefault) {
|
||
|
event.preventDefault();
|
||
|
}
|
||
|
|
||
|
bar.id = 'active';
|
||
|
try {
|
||
|
document.addEventListener('mousemove',mouseMove, true);
|
||
|
document.addEventListener('mouseup',barMouseUp, true);
|
||
|
} catch(ex) { // IE
|
||
|
document.attachEvent('onmousemove',mouseMove,true);
|
||
|
document.attachEvent('onmouseup',barMouseUp,true);
|
||
|
}
|
||
|
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
function barMouseUp()
|
||
|
{
|
||
|
var bar = document.getElementById('active');
|
||
|
bar.removeAttribute('id');
|
||
|
|
||
|
try {
|
||
|
document.removeEventListener('mousemove', mouseMove, true);
|
||
|
document.removeEventListener('mouseup', barMouseUp, true);
|
||
|
}
|
||
|
catch (ex) { // IE
|
||
|
document.detachEvent('onmousemove', mouseMove, true);
|
||
|
document.detachEvent('onmouseup', barMouseUp, true);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function mouseMove(event)
|
||
|
{
|
||
|
//Get the slider we are moveing
|
||
|
var slider = document.getElementById('active').parentNode;
|
||
|
var valueNow = parseInt(slider.getAttribute("aria-valuenow"));
|
||
|
var valueMin = parseInt(slider.getAttribute("aria-valuemin"));
|
||
|
var valueMax = parseInt(slider.getAttribute("aria-valuemax"));
|
||
|
|
||
|
var grade = sliderSize/valueMax;
|
||
|
|
||
|
// Find what the new value should be and round it.
|
||
|
valueNow = event.clientX/grade-slider.offsetLeft/grade;
|
||
|
valueNow = Math.round(valueNow);
|
||
|
|
||
|
//Stop the values going over the max and min
|
||
|
if (valueNow < valueMin) {
|
||
|
valueNow = valueMin;
|
||
|
}
|
||
|
if (valueNow > valueMax) {
|
||
|
valueNow = valueMax;
|
||
|
}
|
||
|
//set the value and move the slider
|
||
|
slider.setAttribute("aria-valuenow", valueNow);
|
||
|
displaySlider(slider);
|
||
|
}
|
||
|
|
||
|
function sliderMouseDown(slider,event)
|
||
|
{
|
||
|
|
||
|
var valueNow = parseInt(slider.getAttribute("aria-valuenow"));
|
||
|
var valueMin = parseInt(slider.getAttribute("aria-valuemin"));
|
||
|
var valueMax = parseInt(slider.getAttribute("aria-valuemax"));
|
||
|
|
||
|
var grade = sliderSize/valueMax;
|
||
|
|
||
|
// Find where was clicked, and were the bar is.
|
||
|
clickPos = event.clientX-slider.offsetLeft;
|
||
|
var barWidth = slider.firstChild.scrollWidth;
|
||
|
var barPos = slider.firstChild.offsetLeft-slider.offsetLeft;
|
||
|
|
||
|
// Change the value
|
||
|
if (clickPos > barPos && clickPos < barPos+barWidth) {
|
||
|
return true;
|
||
|
} else if(clickPos > barPos) {
|
||
|
var valueNow = valueNow+moveValue;
|
||
|
if(valueNow > clickPos/grade){
|
||
|
valueNow = clickPos/grade;
|
||
|
}
|
||
|
} else if(clickPos < barPos+barWidth) {
|
||
|
var valueNow = valueNow-moveValue;
|
||
|
if(valueNow < clickPos/grade){
|
||
|
valueNow = clickPos/grade;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Set the value and move the slider
|
||
|
slider.setAttribute("aria-valuenow", valueNow);
|
||
|
displaySlider(slider);
|
||
|
|
||
|
if (event.preventDefault) {
|
||
|
event.preventDefault();
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
//--><!]]>
|
||
|
</script>
|
||
|
|
||
|
<style type="text/css">
|
||
|
<!--
|
||
|
span.right {
|
||
|
background:url('right.png') no-repeat;
|
||
|
width:17px;
|
||
|
}
|
||
|
span.left {
|
||
|
background:url('left.png') no-repeat;
|
||
|
width:17px;
|
||
|
}
|
||
|
#slider1 {
|
||
|
background:url('back.png') repeat-x;
|
||
|
height:17px;
|
||
|
}
|
||
|
.bar {
|
||
|
background:url('slider.png') no-repeat;
|
||
|
height:17px;
|
||
|
width:17px;
|
||
|
}
|
||
|
.slider span {
|
||
|
display:table-cell;
|
||
|
}
|
||
|
-->
|
||
|
</style>
|
||
|
<style type="text/css"></style></head>
|
||
|
|
||
|
<body onload="displaySlider(document.getElementById('slider1'));">
|
||
|
<div class="slider">
|
||
|
<span>0</span>
|
||
|
<span role="button" title="Move slider left" class="left" onclick="sliderButton(event, 'after', 'slider1');" onkeypress="sliderButton(event, 'after', 'slider1');"></span>
|
||
|
<span title="My slider" tabindex="0" id="slider1" role="slider" aria-valuenow="10" aria-valuemin="0" aria-valuemax="100" aria-valuetext="10%" onmousedown="sliderMouseDown(this,event);" onkeydown="return handleSliderKey(this, event);" style="padding-right: 262px; padding-left: 21px;"><span class="bar" onmousedown="barMouseDown(event,this)"></span>
|
||
|
</span>
|
||
|
<span title="Move slider right" role="button" class="right" onclick="sliderButton(event, 'before', 'slider1');" onkeypress="sliderButton(event, 'before', 'slider1');"></span>
|
||
|
<span>100</span>
|
||
|
</div>
|
||
|
</body>
|
||
|
</html>
|