Як оформити введення діапазону HTML5, щоб мати різний колір до і після повзунка?


94

введіть тут опис зображення

Я хочу, щоб ліва сторона була зеленою, а права - сірою. Як показано на малюнку вище, ІДЕАЛЬНО. Бажано чисте рішення CSS (потрібно лише турбуватися про WebKit).

Чи можливо таке?


Напевно, що ви пробували? Опублікуйте тут свій код.
j08691


Дуже корисне запитання.
Саурав Кумар

Відповіді:


118

Чисте рішення CSS :

  • Chrome: приховати переливу від input[range]і заповнити кольором тіні весь простір, що залишився від великого пальця.
  • IE: немає необхідності винаходити колесо:::-ms-fill-lower
  • Firefox не потрібно винаходити колесо:::-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"/>


1
Привіт deathangel908, приємне рішення. Я б просто покращив тіньову частину вікна: box-shadow: -80px 0 0px 80px # 43e5f7;
Філіп Вітковський

32
Проблема з цим у chrome полягає в тому, що якщо ви хочете, щоб великий палець був більше доріжки, тоді тінь вікна перекриває доріжку з висотою великого пальця. Чи є спосіб обмежити тінь вікна всередині доріжки?
mharris7190

1
Це не працює для входів із шириною на основі відсотків. Хто-небудь має для цього обхідний шлях?
Ремі Стюре


3
@tenwest Wow, це жахливо. Дякуємо за оновлення!
CodeF0x

50

Хоча прийнята відповідь хороша в теорії, вона ігнорує той факт, що великий палець тоді не може бути більше розміру доріжки, не відрізавши її 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>


чи можете ви запропонувати мені, коли я додав max = 5 в HTML, тоді колір не заповнюється належним чином
Husna

@Husna Я розширив цю відповідь, щоб також обробляти мінімальні атрибути max, сподіваюся, це допоможе.
htmn

1
@Husna Ви повинні розрахувати% як різницю між вашим максимальним та мінімальним значенням. Наприклад, якщо у вас є min: 0 і max: 10, ви повинні використовувати в JS :,+ this.value / (10-0)*100 +'%, #fff
Росаріо Руссо

4
@Rosario Russo Вам просто потрібно виправити this.value у JS with(this.value-this.min)/(this.max-this.min)*100
Сільван

29

Так, це можливо. Хоча я б не рекомендував це, оскільки input rangeнасправді не підтримується належним чином усіма браузерами, оскільки новий елемент, доданий в HTML5, а HTML5 - це лише чернетка (і буде надовго), тому, що стосується стилю, можливо, не найкращий вибір.

Також вам знадобиться трохи JavaScript. Я дозволив собі використовувати бібліотеку jQuery для цього для простоти.

Ось: http://jsfiddle.net/JnrvG/1/ .


8
Не в цьому було питання, що iu потрібно робити це за допомогою css, повинен бути спосіб лише з css.
Ipad,

10
Ви можете змусити його працювати в Chrome без JS ( jsfiddle.net/1xg1j3tw ). Для IE10 + ви можете використовувати псевдоелементи -ms-fill-lower та -ms-fill-upper.
Алесь

1
@Ales Ви повинні вказати це в додатковій відповіді.
Luca Steeb

4
Змініть .change(на on('input', func..так, щоб змінився фон, коли користувач рухає великим пальцем, а не просто мишею вгору.
Ямі Одімель

10

Невелике оновлення до цього:

якщо ви використовуєте наступне, оновлення буде оновлюватися на льоту, а не під час випуску миші.

"змінити рух миші", функція "

<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>

7

Спираючись на відповідь @ 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" />


5

Попереднє прийняте рішення більше не працює .

Я закінчив кодувати просту функцію, яка обертає rangeв стильований контейнер, додаючи смужку, яка потрібна перед курсором. Я написав цей приклад, де легко побачити два кольори "синій" і "оранжевий", встановлені в css, тому їх можна швидко змінити.


1

Якщо ви використовуєте першу відповідь , то проблема з великим пальцем. Якщо ви хочете, щоб великий палець був більшим за доріжку , у 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>


0

Тепер він підтримується псевдоелементами в кожному з WebKit, Firefox та IE. Але, звичайно, в кожному воно різне. : (

Перегляньте відповіді на це запитання та / або знайдіть CodePen з назвою prettify <input type=range> #101деяких рішень.


-5
input type="range" min="0" max="50" value="0"  style="margin-left: 6%;width: 88%;background-color: whitesmoke;"

вище код змінює стиль введення діапазону .....


Працює у FireFox 57, але не в Opera 49 та Safari 11 - гірше, ніщо не підтримує кольори переднього плану.
Девон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.