<!DOCTYPE html>
<html>
<head>
<script data-require="jquery@*" data-semver="2.1.3" src="http://code.jquery.com/jquery-2.1.3.min.js"></script>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<button id="rangeCreator">Create a range</button>
<script src="script.js"></script>
</body>
</html>
// Code goes here
var rangeCreator = document.getElementById('rangeCreator');
rangeCreator.addEventListener('click', function(){
/*
<div id="slider">
<span id="startValue"></span>
<input type="range" min="0" max="xxx" id="myRange">
<span id="endValue"></span>
</div>
*/
var divSlider = document.createElement('div');
divSlider.setAttribute('id', 'slider');
var spanStartValue = document.createElement('span');
spanStartValue.innerHTML = "0";
var rangeInput = document.createElement('input');
rangeInput.setAttribute('type', 'range');
rangeInput.setAttribute('min', '0');
rangeInput.setAttribute('max', '100');
rangeInput.setAttribute('id', 'myRange');
rangeInput.setAttribute('name', 'myRange');
rangeInput.addEventListener('input', displayValue);
var spanEndValue = document.createElement('span');
spanEndValue.innerHTML = "100";
var outputElement = document.createElement('output');
outputElement.setAttribute('id', 'myOutput');
outputElement.setAttribute('for', 'myRange');
document.body.appendChild(divSlider);
divSlider.appendChild(spanStartValue);
divSlider.appendChild(rangeInput);
divSlider.appendChild(outputElement);
divSlider.appendChild(spanEndValue);
});
function displayValue(event) {
var rangeInput = document.getElementById('myRange');
var width = rangeInput.offsetWidth;
var min = rangeInput.getAttribute('min');
var max = rangeInput.getAttribute('max');
var newPoint = (event.target.value - min)/(max - min);
var offset = -1.3;
var newPlace;
if (newPoint < 0) {
newPlace = 0;
} else if (newPoint > 1 ) {
newPlace = width;
} else {
newPlace = width * newPoint + offset;
offset -= newPoint;
}
var outputElement = document.getElementById('myOutput');
outputElement.value = event.target.value;
outputElement.style.left = newPlace;
outputElement.style.marginLeft = offset + "%";
}
/* Styles go here */
/* This is for formatting in chrome, safari and opera only. It will not work in firefox */
input[type='range'] {
-webkit-appearance:none;
width: 80%;
border-radius: 8px;
height: 7px;
border: 1px solid #bdc3c7;
background-color: #fff;
}
input[type='range']::-webkit-slider-thumb {
-webkit-appearance: none;
background-color: #ecf0f1;
border: 1px solid #bdc3c7;
width: 20px;
height: 20px;
border-radius: 10px;
cursor: pointer;
}
/* The above styles will not work in Firefox. For firefox we have to write seperate styles*/
input[type=range]::-moz-range-track {
width: 80%;
border-radius: 8px;
height: 7px;
border: 1px solid #bdc3c7;
background-color: #fff;
}
input[type=range]::-moz-range-thumb {
background: #ecf0f1;
border: 1px solid #bdc3c7;
width: 20px;
height: 20px;
border-radius: 10px;
cursor: pointer;
}
/* The above styles will not work in IE */
input[type='range']::-ms-fill-lower,
input[type='range']::-ms-fill-upper {
background: transparent;
}
input[type='range']::-ms-track {
width: 80%;
border-radius: 8px;
height: 7px;
border: 1px solid #bdc3c7;
background-color: #fff;
}
input[type="range"]::-ms-thumb {
background-color: #ecf0f1;
border: 1px solid #bdc3c7;
width: 20px;
height: 20px;
border-radius: 10px;
cursor: pointer;
}
div#slider {
width: 500px;
height: 50px;
background: #E8E8F0;
position: relative;
margin-top: 100px;
}
output {
background: black;
width: 40px;
height:30px;
text-align: center;
color: white;
border-radius: 10px;
display: inline-block;
font: bold 15px/30px Georgia;
position: absolute;
bottom: 175%;
left: 0;
margin-left: -1%;
}
output:after {
content: "";
position: absolute;
width: 0;
height: 0;
border-top: 10px solid #999999;
border-left: 5px solid transparent;
border-right: 5px solid transparent;
top: 100%;
left: 50%;
margin-left: -5px;
margin-top: -1px;
}
// DOM Ready
$(function() {
var el, newPoint, newPlace, offset;
// Select all range inputs, watch for change
$("input[type='range']").change(function() {
// Cache this for efficiency
el = $(this);
// Measure width of range input
width = el.width();
// Figure out placement percentage between left and right of input
newPoint = (el.val() - el.attr("min")) / (el.attr("max") - el.attr("min"));
// Janky value to get pointer to line up better
offset = -1.3;
// Prevent bubble from going beyond left or right (unsupported browsers)
if (newPoint < 0) { newPlace = 0; }
else if (newPoint > 1) { newPlace = width; }
else { newPlace = width * newPoint + offset; offset -= newPoint; }
// Move bubble
el
.next("output")
.css({
left: newPlace,
marginLeft: offset + "%"
})
.text(el.val());
})
// Fake a change to position bubble at page load
.trigger('change');
});