Flipped Range/Slider input html - html

Does anyone know how to achieve this?
so eg. it starts from max to low (left to right):
---------------------||---------------------
100__________50__________20

Check this out JSFiddle Link.
HTML Part:
<input id="slider2" type="range" min="0" max="100" step="50" value="0" >
<input id="rangeValue2" type="text" size="2">
JavaScript Part:
var max_range = 100;
var range_element = document.getElementById("rangeValue2");
var range_input_element = document.getElementById("slider2");
range_element.value = max_range - range_input_element.value;
document.getElementById("slider2").onchange=function(){
range_element.value = max_range - range_input_element.value;
};
Note: Max range should be same in HTML and JavaScript.
Like in html it is set as max="100" and in JavaScript it is set as var max_range = 100;

Related

How can I use the <input> method, the <onclick = "func()">, and javascript to change the background color of my page

This is my current code for this issue. Is there anything that I can put inside the script tag
<!DOCTYPE html>
<html>
<head>
<title>
Color picker
</title>
</head>
<body style="text-align: center;">
<h1> COLOR PICKER </h1>
<label for="R">R: </label>
<input type="number" maxlength="3" min="0" max="255" id="r">
<label for="G">G: </label>
<input type="number" maxlength="3" min="0" max="255" id="g">
<label for="B">B: </label>
<input type="number" maxlength="3" min="0" max="255" id="b"><br><br>
<input type="submit" onclick="getColor()">Get color</input>
<script>
function getColor() {
var r = document.getElementById("r");
var g = document.getElementById("g");
var b = document.getElementById("b");
var color = "rgb("+ [r,g,b].join(',')")";
document.body.style.background = color;
}
</script>
</body>
</html>
For instance with input: R: 255, G: 0, B: 255 and when I want the page should be a magenta color. But when I actually press the button nothing happens. Can I do something to fix this
You need to get the .value of each input element.
var r = document.getElementById("r").value;
var g = document.getElementById("g").value;
var b = document.getElementById("b").value;
and you are also missing a + on your string concatenation
var color = "rgb(" + [r,g,b].join(',') + ")";

How to restrict HTML range slider from moving beyond a range

I'm using a range slider with range 0 to 100 and the current value is set to max.
My objective is that I have a limiting value of 50 so that the slider could be moved between 50 and 100 and not 0 to 50. I have setup a jQuery handler as below, however I'm still able to move backwards from 50.
Is there a way to prevent the slider from going backwards from 50?
$(document).on("input change", "#range", function() {
var scrolled_value = $(this).val();
var limiting_value = 50;
if (scrolled_value <= limitng_value)
return false;
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="range" type="range" name="range" min="0" value="100" max="100" />
You can set the value in the change event to stop it going below that value:
if (scrolled_value <= limiting_value)
$(this).val(limiting_value);
Giving an updated snippet (with as few changes as possible to the original):
$(document).on("input change", "#range", function() {
var scrolled_value = $(this).val();
var limiting_value = 50;
if (scrolled_value <= limiting_value)
$(this).val(limiting_value);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="range" type="range" name="range" min="0" value="100" max="100" />
You can solve this issue by setting the sliders value to 50 when it's below 50, like shown below:
const input = document.querySelector("input");
const sliderLimit = 50;
input.addEventListener("input", () => {
if (input.value < sliderLimit)
input.value = sliderLimit;
})
<input type="range" min="0" value="100" max="100" />
Minimal solution using jQuery (like OP) while also limiting the value on first-render
$('input').on("input change", function() {
if (this.value > 50 )
this.value = 50
}).trigger('change')
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="range" min="0" value="100" max="100" />
By the way, I've created a beautiful CSS-only range slider:
https://github.com/yairEO/ui-range

How can I set my range sliders max to be the windows width / 10

How can i make a range sliders max to be the windows width / 10, something like this:
<input type="range" min="0" max="100vw/10"
Previously what i had in my code was:
<input type="range" id="rangeSlider" min="0" max="100">
<p id="p"></p>
<button id="getValueButton>Get Value</button>
let rangeSlider = document.querySelector("#rangeSlider");
let p = document.querySelector("#p");
let getValueButton = document.querySelector("#getValueButton");
getValueButton.onclick = function() {
p.innerHTML = `${rangeSlider.value * 12.5} pixels from the left`;
}
let rangeSlider = document.querySelector("#rangeSlider");
let p = document.querySelector("#p");
let getValueButton = document.querySelector("#getValueButton");
getValueButton.onclick = function() {
p.innerHTML = `${rangeSlider.value * 12.5} pixels from the left`;
}
<input type="range" id="rangeSlider" min="0" max="100">
<p id="p"></p>
<button id="getValueButton">Get Value</button>
You can set the max value like this:
document.getElementById('rangeSlider').max = window.screen.width / 10

HTML5 input type range show range value

I am making a website where I want to use range slider(I know it only supports webkit browsers).
I have integrated it fully and works fine. But I would like to use a textbox to show the current slide value.
I mean if initially the slider is at value 5, so in text box it should show as 5, when I slide the value in text box should change.
Can I do this using only CSS or html. I want to avoid JQuery. Is it possible?
For those who are still searching for a solution without a separate javascript code. There is little easy solution without writing a javascript or jquery function:
<input type="range" value="24" min="1" max="100" oninput="this.nextElementSibling.value = this.value">
<output>24</output>
JsFiddle Demo
If you want to show the value in text box, simply change output to input.
Point to note:
It is still Javascript written within your html, we can write something like below in js to do similar thing:
document.registrationForm.ageInputId.oninput = function(){
document.registrationForm.ageOutputId.value = document.registrationForm.ageInputId.value;
}
Instead of element's id, name could also be used, both are supported in modern browsers.
This uses javascript, not jquery directly. It might help get you started.
function updateTextInput(val) {
document.getElementById('textInput').value=val;
}
<input type="range" name="rangeInput" min="0" max="100" onchange="updateTextInput(this.value);">
<input type="text" id="textInput" value="">
version with editable input:
<form>
<input type="range" name="amountRange" min="0" max="20" value="0" oninput="this.form.amountInput.value=this.value" />
<input type="number" name="amountInput" min="0" max="20" value="0" oninput="this.form.amountRange.value=this.value" />
</form>
http://jsfiddle.net/Xjxe6/
an even better way would be to catch the input event on the input itself
rather than on the whole form (performance wise) :
<input type="range" id="rangeInput" name="rangeInput" min="0" max="20" value="0"
oninput="amount.value=rangeInput.value">
<output id="amount" name="amount" for="rangeInput">0</output>
Here's a fiddle (with the id added as per Ryan's comment).
If you want your current value to be displayed beneath the slider and moving along with it, try this:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>MySliderValue</title>
</head>
<body>
<h1>MySliderValue</h1>
<div style="position:relative; margin:auto; width:90%">
<span style="position:absolute; color:red; border:1px solid blue; min-width:100px;">
<span id="myValue"></span>
</span>
<input type="range" id="myRange" max="1000" min="0" style="width:80%">
</div>
<script type="text/javascript" charset="utf-8">
var myRange = document.querySelector('#myRange');
var myValue = document.querySelector('#myValue');
var myUnits = 'myUnits';
var off = myRange.offsetWidth / (parseInt(myRange.max) - parseInt(myRange.min));
var px = ((myRange.valueAsNumber - parseInt(myRange.min)) * off) - (myValue.offsetParent.offsetWidth / 2);
myValue.parentElement.style.left = px + 'px';
myValue.parentElement.style.top = myRange.offsetHeight + 'px';
myValue.innerHTML = myRange.value + ' ' + myUnits;
myRange.oninput =function(){
let px = ((myRange.valueAsNumber - parseInt(myRange.min)) * off) - (myValue.offsetWidth / 2);
myValue.innerHTML = myRange.value + ' ' + myUnits;
myValue.parentElement.style.left = px + 'px';
};
</script>
</body>
</html>
Note that this type of HTML input element has one hidden feature, such as you can move the slider with left/right/down/up arrow keys when the element has focus on it. The same with Home/End/PageDown/PageUp keys.
Shortest version without form, min or external JavaScript.
<input type="range" value="0" max="10" oninput="num.value = this.value">
<output id="num">0</output>
Explanation
If you wanna retrieve the value from the output you commonly use an id that can be linked from the oninput instead of using this.nextElementSibling.value (we take advantage of something that we are already using)
Compare the example above with this valid but a little more complex and long answer:
<input id="num" type="range" value="0" max="100" oninput="this.nextElementSibling.value = this.value">
<output>0</output>
With the shortest answer:
We avoid the use of this, something weird in JS for newcomers
We avoid new concept about connecting siblings in the DOM
We avoid too much attributes in the input placing the id in the output
Notes
In both examples we don't need to add the min value when equal to
0
Removing JavaScript’s this keyword makes it a better language
If you're using multiple slides, and you can use jQuery, you can do the follow to deal with multiple sliders easily:
function updateRangeInput(elem) {
$(elem).next().val($(elem).val());
}
input { padding: 8px; border: 1px solid #ddd; color: #555; display: block; }
input[type=text] { width: 100px; }
input[type=range] { width: 400px; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="range" min="0" max="100" oninput="updateRangeInput(this)" value="0">
<input type="text" value="0">
<input type="range" min="0" max="100" oninput="updateRangeInput(this)" value="50">
<input type="text" value="50">
Also, by using oninput on the <input type='range'> you'll receive events while dragging the range.
In plain JavaScript:
function displaySliderValue(eSlider){
eSlider.parentElement.querySelector('span').textContent = eSlider.value;
}
<div>
<span>1</span><br>
<input type="range" min="1" max="100" value="1" oninput="displaySliderValue(this);">
</div>
For people don't care about jquery use, here is a short way without using any id
<label> userAvatar :
<input type="range" name="userAvatar" min="1" max="100" value="1"
onchange="$('~ output', this).val(value)"
oninput="$('~ output', this).val(value)">
<output>1</output>
</label>
I have a solution that involves (Vanilla) JavaScript, but only as a library. You habe to include it once and then all you need to do is set the appropriate source attribute of the number inputs.
The source attribute should be the querySelectorAll selector of the range input you want to listen to.
It even works with selectcs. And it works with multiple listeners. And it works in the other direction: change the number input and the range input will adjust. And it will work on elements added later onto the page (check https://codepen.io/HerrSerker/pen/JzaVQg for that)
Tested in Chrome, Firefox, Edge and IE11
;(function(){
function emit(target, name) {
var event
if (document.createEvent) {
event = document.createEvent("HTMLEvents");
event.initEvent(name, true, true);
} else {
event = document.createEventObject();
event.eventType = name;
}
event.eventName = name;
if (document.createEvent) {
target.dispatchEvent(event);
} else {
target.fireEvent("on" + event.eventType, event);
}
}
var outputsSelector = "input[type=number][source],select[source]";
function onChange(e) {
var outputs = document.querySelectorAll(outputsSelector)
for (var index = 0; index < outputs.length; index++) {
var item = outputs[index]
var source = document.querySelector(item.getAttribute('source'));
if (source) {
if (item === e.target) {
source.value = item.value
emit(source, 'input')
emit(source, 'change')
}
if (source === e.target) {
item.value = source.value
}
}
}
}
document.addEventListener('change', onChange)
document.addEventListener('input', onChange)
}());
<div id="div">
<input name="example" type="range" max="2250000" min="-200000" value="0" step="50000">
<input id="example-value" type="number" max="2250000" min="-200000" value="0" step="50000" source="[name=example]">
<br>
<input name="example2" type="range" max="2240000" min="-160000" value="0" step="50000">
<input type="number" max="2240000" min="-160000" value="0" step="50000" source="[name=example2]">
<input type="number" max="2240000" min="-160000" value="0" step="50000" source="[name=example2]">
<br>
<input name="example3" type="range" max="20" min="0" value="10" step="1">
<select source="[name=example3]">
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
</select>
<br>
</div>
<br>
Here's a vanilla JS way of automatically adding the value to all range inputs without any extra HTML.
Edit: Chrome only. I didn't realize it doesn't work with Firefox.
document.querySelectorAll('input[type=range]').forEach(e => {
e.setAttribute('data-value', e.value);
e.addEventListener('input', () => {
e.setAttribute('data-value', e.value);
});
});
input[type="range"]::after {
content: attr(data-value);
margin-right: -50px;
padding-left: 10px;
}
<input type="range"><br>
<input type="range"><br>
<input type="range">
Try This :
<input min="0" max="100" id="when_change_range" type="range">
<input type="text" id="text_for_show_range">
and in jQuery section :
$('#when_change_range').change(function(){
document.getElementById('text_for_show_range').value=$(this).val();
});
<form name="registrationForm">
<input type="range" name="ageInputName" id="ageInputId" value="24" min="1" max="10" onchange="getvalor(this.value);" oninput="ageOutputId.value = ageInputId.value">
<input type="text" name="ageOutputName" id="ageOutputId"></input>
</form>
if you still looking for the answer you can use input type="number" in place of type="range" min max work if it set in that order:
1-name
2-maxlength
3-size
4-min
5-max
just copy it
<input name="X" maxlength="3" size="2" min="1" max="100" type="number" />

How do I show the value beside an HTML5 range input type?

Okay so I am trying to use range for input type
Times: <input type="range" name ="times"><br>
But I want the value to be printed next to it, how can I do this?
Like
-------*-- 7
*--------- 1
attach to it onChange event
and in the event handler function you can select the value of the
and write it as innerHtml to a span beside the controller
<input id="mine" type="range" min="-100" max="100" value="0" step="10" onChange="change();"> <span id="result"></span>
<script>
var result = document.getElementById("result");
var mine = document.getElementById("mine");
function change(){
result.innerText = mine.value;
}
</script>
function showCount(){
var count = document.getElementById("slider").value;
console.log("meter position : "+count);
}
<input type="range" value="0" id="slider" step="1" min="0" max="15" onchange="showCount()"/>
This will give the count when you will move the sliderenter code here or put and alert.