Я хочу, щоб ліва сторона була зеленою, а права - сірою. Як показано на малюнку вище, ІДЕАЛЬНО. Бажано чисте рішення CSS (потрібно лише турбуватися про WebKit).
Чи можливо таке?
Я хочу, щоб ліва сторона була зеленою, а права - сірою. Як показано на малюнку вище, ІДЕАЛЬНО. Бажано чисте рішення CSS (потрібно лише турбуватися про WebKit).
Чи можливо таке?
Відповіді:
Чисте рішення CSS :
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
. Дивіться цей приклад того, як з цим справитись лише за допомогою крихітного фрагмента JS.
// .chrome styling Vanilla JS
document.getElementById("myinput").oninput = function() {
this.style.background = 'linear-gradient(to right, #82CFD0 0%, #82CFD0 ' + this.value + '%, #fff ' + this.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" type="range" value="50" />
</div>
+ this.value / (10-0)*100 +'%, #fff
(this.value-this.min)/(this.max-this.min)*100
Так, це можливо. Хоча я б не рекомендував це, оскільки input range
насправді не підтримується належним чином усіма браузерами, оскільки новий елемент, доданий в HTML5, а HTML5 - це лише чернетка (і буде надовго), тому, що стосується стилю, можливо, не найкращий вибір.
Також вам знадобиться трохи JavaScript. Я дозволив собі використовувати бібліотеку 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.
У Chrome / Mozilla ви можете використовувати linear-gradient
техніку, але вам потрібно налаштувати співвідношення , грунтуючись на min
, max
, value
атрибути , як згадано тут по @Attila О. . Потрібно переконатися, що ви не застосовуєте це на Edge, інакше великий палець не відображається. @Geoffrey Lalloué пояснює це детальніше тут .
Ще одне, про що варто згадати, - це те, що вам потрібно налаштувати rangeEl.style.height = "20px";
IE / Older. Простіше кажучи, це тому, що в цьому випадку "висота застосовується не до доріжки, а до всього вводу, включаючи великий палець". скрипка
/**
* 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
в стильований контейнер, додаючи смужку, яка потрібна перед курсором. Я написав цей приклад, де легко побачити два кольори "синій" і "оранжевий", встановлені в css, тому їх можна швидко змінити.
Якщо ви використовуєте першу відповідь , то проблема з великим пальцем. Якщо ви хочете, щоб великий палець був більшим за доріжку , у Chrome , тоді тінь вікна перекриває доріжку висотою великого пальця.
Просто підсумуйте всі ці відповіді та напишіть нормально працюючий повзунок з більшим пальцем повзунка: 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>
Тепер він підтримується псевдоелементами в кожному з WebKit, Firefox та IE. Але, звичайно, в кожному воно різне. : (
Перегляньте відповіді на це запитання та / або знайдіть CodePen з назвою prettify <input type=range> #101
деяких рішень.