मैं चाहता हूं कि बाईं ओर का हिस्सा हरा हो और दाईं ओर ग्रे हो। जैसा कि ऊपर चित्रित है, सही होगा। अधिमानतः एक शुद्ध सीएसएस समाधान (केवल WebKit के बारे में चिंता करने की आवश्यकता है)।
क्या ऐसा करना संभव है?
मैं चाहता हूं कि बाईं ओर का हिस्सा हरा हो और दाईं ओर ग्रे हो। जैसा कि ऊपर चित्रित है, सही होगा। अधिमानतः एक शुद्ध सीएसएस समाधान (केवल WebKit के बारे में चिंता करने की आवश्यकता है)।
क्या ऐसा करना संभव है?
जवाबों:
शुद्ध सीएसएस समाधान:
input[range]
, और छाया रंग के साथ अंगूठे पर छोड़ दिया गया सभी स्थान भरें।::-ms-fill-lower
::-moz-range-progress
/*Chrome*/
@media screen and (-webkit-min-device-pixel-ratio:0) {
input[type='range'] {
overflow: hidden;
width: 80px;
-webkit-appearance: none;
background-color: #9a905d;
}
input[type='range']::-webkit-slider-runnable-track {
height: 10px;
-webkit-appearance: none;
color: #13bba4;
margin-top: -1px;
}
input[type='range']::-webkit-slider-thumb {
width: 10px;
-webkit-appearance: none;
height: 10px;
cursor: ew-resize;
background: #434343;
box-shadow: -80px 0 0 80px #43e5f7;
}
}
/** FF*/
input[type="range"]::-moz-range-progress {
background-color: #43e5f7;
}
input[type="range"]::-moz-range-track {
background-color: #9a905d;
}
/* IE*/
input[type="range"]::-ms-fill-lower {
background-color: #43e5f7;
}
input[type="range"]::-ms-fill-upper {
background-color: #9a905d;
}
<input type="range"/>
जबकि स्वीकृत उत्तर सिद्धांत में अच्छा है, यह इस तथ्य की अनदेखी करता है कि अंगूठा फिर से काटे बिना ट्रैक के आकार से बड़ा नहीं हो सकता है overflow: hidden
। जेएस के एक छोटे से हिस्से के साथ इसे कैसे संभालना है, इसका उदाहरण देखें।
// .chrome styling Vanilla JS
document.getElementById("myinput").oninput = function() {
var value = (this.value-this.min)/(this.max-this.min)*100
this.style.background = 'linear-gradient(to right, #82CFD0 0%, #82CFD0 ' + value + '%, #fff ' + value + '%, white 100%)'
};
#myinput {
background: linear-gradient(to right, #82CFD0 0%, #82CFD0 50%, #fff 50%, #fff 100%);
border: solid 1px #82CFD0;
border-radius: 8px;
height: 7px;
width: 356px;
outline: none;
transition: background 450ms ease-in;
-webkit-appearance: none;
}
<div class="chrome">
<input id="myinput" min="0" max="60" type="range" value="30" />
</div>
+ this.value / (10-0)*100 +'%, #fff
(this.value-this.min)/(this.max-this.min)*100
हाँ यह संभव है। हालाँकि मैं इसकी अनुशंसा नहीं करूंगा क्योंकि input range
सभी ब्राउज़रों द्वारा वास्तव में ठीक से समर्थन नहीं किया गया है क्योंकि HTML5 में एक नया तत्व जोड़ा गया है और एचटीएमएल 5 केवल एक मसौदा है (और लंबे समय तक रहेगा) जहां तक इसे स्टाइल करने की बात है तो शायद यह सबसे अच्छा नहीं है चुनाव।
इसके अलावा, आपको जावास्क्रिप्ट की भी थोड़ी आवश्यकता होगी। मैंने सरलता के उद्देश्य से इसके लिए jQuery लाइब्रेरी का उपयोग करने की स्वतंत्रता ली ।
ये रहा: http://jsfiddle.net/JnrvG/1/ ।
.change(
करने के लिए on('input', func..
इतना पृष्ठभूमि परिवर्तन होगा उपयोगकर्ता अंगूठे न सिर्फ माउस ऊपर ले जाता है जब।
यह एक छोटा सा अद्यतन:
यदि आप निम्नलिखित का उपयोग करते हैं तो यह माउस रिलीज के बजाय मक्खी पर अपडेट होगा।
"चेंज मोसमोव", फंक्शन "
<script>
$('input[type="range"]').on("change mousemove", function () {
var val = ($(this).val() - $(this).attr('min')) / ($(this).attr('max') - $(this).attr('min'));
$(this).css('background-image',
'-webkit-gradient(linear, left top, right top, '
+ 'color-stop(' + val + ', #2f466b), '
+ 'color-stop(' + val + ', #d3d3db)'
+ ')'
);
});</script>
@ Dargue3 के उत्तर के शीर्ष पर बिल्डिंग , यदि आप चाहते हैं कि अंगूठा ट्रैक से बड़ा हो, तो आप पूरी तरह से <input type="range" />
तत्व का लाभ उठाना चाहते हैं और क्रॉस ब्राउज़र जाना चाहते हैं, आपको JS & CSS की थोड़ी अतिरिक्त लाइनों की आवश्यकता है।
क्रोम / मोज़िला पर आप उपयोग कर सकते हैं linear-gradient
तकनीक है, लेकिन आप के आधार पर अनुपात समायोजित करने की आवश्यकता min
, max
, value
विशेषताओं का उल्लेख किया यहाँ से @Attila ओ । आपको यह सुनिश्चित करने की आवश्यकता है कि आप इसे एज पर लागू नहीं कर रहे हैं, अन्यथा अंगूठा प्रदर्शित नहीं होता है। @Geoffrey Lalloué यहां और अधिक विस्तार से बताते हैं ।
एक और बात ध्यान देने योग्य है, वह यह है कि आपको rangeEl.style.height = "20px";
IE / पुराने पर समायोजित करने की आवश्यकता है । सीधे शब्दों में कहें क्योंकि इस मामले में "ऊंचाई ट्रैक पर लागू नहीं होती है, बल्कि अंगूठे सहित पूरे इनपुट पर होती है"। बेला
/**
* Sniffs for Older Edge or IE,
* more info here:
* https://stackoverflow.com/q/31721250/3528132
*/
function isOlderEdgeOrIE() {
return (
window.navigator.userAgent.indexOf("MSIE ") > -1 ||
!!navigator.userAgent.match(/Trident.*rv\:11\./) ||
window.navigator.userAgent.indexOf("Edge") > -1
);
}
function valueTotalRatio(value, min, max) {
return ((value - min) / (max - min)).toFixed(2);
}
function getLinearGradientCSS(ratio, leftColor, rightColor) {
return [
'-webkit-gradient(',
'linear, ',
'left top, ',
'right top, ',
'color-stop(' + ratio + ', ' + leftColor + '), ',
'color-stop(' + ratio + ', ' + rightColor + ')',
')'
].join('');
}
function updateRangeEl(rangeEl) {
var ratio = valueTotalRatio(rangeEl.value, rangeEl.min, rangeEl.max);
rangeEl.style.backgroundImage = getLinearGradientCSS(ratio, '#919e4b', '#c5c5c5');
}
function initRangeEl() {
var rangeEl = document.querySelector('input[type=range]');
var textEl = document.querySelector('input[type=text]');
/**
* IE/Older Edge FIX
* On IE/Older Edge the height of the <input type="range" />
* is the whole element as oposed to Chrome/Moz
* where the height is applied to the track.
*
*/
if (isOlderEdgeOrIE()) {
rangeEl.style.height = "20px";
// IE 11/10 fires change instead of input
// https://stackoverflow.com/a/50887531/3528132
rangeEl.addEventListener("change", function(e) {
textEl.value = e.target.value;
});
rangeEl.addEventListener("input", function(e) {
textEl.value = e.target.value;
});
} else {
updateRangeEl(rangeEl);
rangeEl.addEventListener("input", function(e) {
updateRangeEl(e.target);
textEl.value = e.target.value;
});
}
}
initRangeEl();
input[type="range"] {
-webkit-appearance: none;
-moz-appearance: none;
width: 300px;
height: 5px;
padding: 0;
border-radius: 2px;
outline: none;
cursor: pointer;
}
/*Chrome thumb*/
input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
-moz-appearance: none;
-webkit-border-radius: 5px;
/*16x16px adjusted to be same as 14x14px on moz*/
height: 16px;
width: 16px;
border-radius: 5px;
background: #e7e7e7;
border: 1px solid #c5c5c5;
}
/*Mozilla thumb*/
input[type="range"]::-moz-range-thumb {
-webkit-appearance: none;
-moz-appearance: none;
-moz-border-radius: 5px;
height: 14px;
width: 14px;
border-radius: 5px;
background: #e7e7e7;
border: 1px solid #c5c5c5;
}
/*IE & Edge input*/
input[type=range]::-ms-track {
width: 300px;
height: 6px;
/*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
background: transparent;
/*leave room for the larger thumb to overflow with a transparent border */
border-color: transparent;
border-width: 2px 0;
/*remove default tick marks*/
color: transparent;
}
/*IE & Edge thumb*/
input[type=range]::-ms-thumb {
height: 14px;
width: 14px;
border-radius: 5px;
background: #e7e7e7;
border: 1px solid #c5c5c5;
}
/*IE & Edge left side*/
input[type=range]::-ms-fill-lower {
background: #919e4b;
border-radius: 2px;
}
/*IE & Edge right side*/
input[type=range]::-ms-fill-upper {
background: #c5c5c5;
border-radius: 2px;
}
/*IE disable tooltip*/
input[type=range]::-ms-tooltip {
display: none;
}
input[type="text"] {
border: none;
}
<input type="range" value="80" min="10" max="100" step="1" />
<input type="text" value="80" size="3" />
पिछला स्वीकृत समाधान अब काम नहीं कर रहा है ।
मैंने एक साधारण फंक्शन की कोडिंग की, जो range
एक स्टाइल कंटेनर में लपेटता है, जो बार को कर्सर से पहले आवश्यक होता है। मैंने इस उदाहरण को लिखा है जहां सीएसएस में दो रंगों 'ब्लू' और 'ऑरेंज' को देखना आसान है, इसलिए उन्हें जल्दी से संशोधित किया जा सकता है।
यदि आप पहले उत्तर का उपयोग करते हैं , तो अंगूठे के साथ समस्या है। क्रोम में यदि आप चाहते हैं कि अंगूठा ट्रैक से बड़ा हो , तो बॉक्स छाया अंगूठे की ऊंचाई के साथ ट्रैक को ओवरलैप करता है।
बस इन सभी उत्तरों को संक्षिप्त करें और सामान्य रूप से काम कर रहे स्लाइडर को बड़े स्लाइडर अंगूठे के साथ लिखें: jsfiddle
const slider = document.getElementById("myinput")
const min = slider.min
const max = slider.max
const value = slider.value
slider.style.background = `linear-gradient(to right, red 0%, red ${(value-min)/(max-min)*100}%, #DEE2E6 ${(value-min)/(max-min)*100}%, #DEE2E6 100%)`
slider.oninput = function() {
this.style.background = `linear-gradient(to right, red 0%, red ${(this.value-this.min)/(this.max-this.min)*100}%, #DEE2E6 ${(this.value-this.min)/(this.max-this.min)*100}%, #DEE2E6 100%)`
};
#myinput {
border-radius: 8px;
height: 4px;
width: 150px;
outline: none;
-webkit-appearance: none;
}
input[type='range']::-webkit-slider-thumb {
width: 6px;
-webkit-appearance: none;
height: 12px;
background: black;
border-radius: 2px;
}
<div class="chrome">
<input id="myinput" type="range" min="0" value="25" max="200" />
</div>