Skip to main content

Макет повзунка діапазону

Один діапазон

Макет повзунка з одним діапазоном досить простий:
<!-- Елемент повзунка діапазону -->
<div class="range-slider">
  <!-- введення діапазону-->
  <input type="range" min="0" max="100" step="1" value="10" />
</div>

Подвійний діапазон

Повзунок подвійного діапазону є простішим, оскільки він не вимагає елемента введення, оскільки input:range не підтримує подвійний діапазон:
<!-- Елемент повзунка діапазону -->
<div class="range-slider"></div>

Кольори повзунка діапазону

Повзунок діапазону підтримує всі кольори за замовчуванням . Отже, щоб змінити його колір, просто додайте клас color-[color] до елемента повзунка діапазону.
<!-- червоний повзунок діапазону -->
<div class="range-slider color-red">...</div>

<!-- оранжевий повзунок діапазону  -->
<div class="range-slider color-orange">...</div>

Методи застосунку Повзунок діапазону

Давайте розглянемо пов’язані методи роботи застосунку з повзунком діапазону:
МетодОпис
app.range.create(parameters)
створити екземпляр повзунка діапазону

parameters - object. Об'єкт із параметрами повзунка діапазону

Метод повертає створений екземпляр повзунка діапазону

app.range.destroy(el)
знищити екземпляр повзунка діапазону

el - HTMLElement or string (with CSS Selector) or object Елемент Повзунка діапазону або екземпляр повзунка діапазону для знищення.

app.range.get(el)
отримати екземпляр повзунка діапазону за елементом HTML

el - HTMLElement or string (with CSS Selector) Елемент повзунка діапазону.

Метод повертає екземпляр повзунка діапазону

app.range.getValue(el)
отримати значення повзунка діапазону

el - HTMLElement or string (with CSS Selector) Елемент повзунка діапазону.

Метод повертає значення повзунка діапазону

app.range.setValue(el, value)
встановити нове значення повзунка діапазону

el - HTMLElement or string (with CSS Selector) Елемент повзунка діапазону.

value - number (у разі одного діапазону) або array - масив значень (у разі подвійного діапазону)

Метод повертає значення повзунка діапазону

Параметри повзунка діапазону

Тепер давайте подивимося на список доступних параметрів, необхідних для створення повзунка діапазону:
ПараметрЗа замовчуваннямОписТип
el
Елемент повзунка діапазону. HTMLElement або рядок із CSS-селектором елемента повзунка діапазону
HTMLElement

string

inputEl
Елемент введення повзунка діапазону або селектор CSS елемента введення. Якщо не вказано, буде спроба шукати input type="range" всередині елемента повзунка діапазону
HTMLElement

string

dual
false
Увімкнути повзунок подвійного діапазону
boolean
step
1
Мінімальний крок між значеннями
number
label
false
Вмикає додаткову мітку навколо повзунка діапазону
boolean
formatLabel
Метод має повертати форматований текст мітки регулятора діапазону. Як аргумент він отримує значення мітки
function(value)
min
Мінімальна знаечення
number
max
Максимальне значення
number
value
Початкове значення. Число у разі одного діапазону та масив значень у разі подвійного діапазону
number

array

draggableBar
true
Якщо ввімкнено, також можна взаємодіяти з повзунком діапазону (змінити значення) на панелі діапазону, клацнувши та провівши пальцем
boolean
vertical
false
Вмикає вертикальний повзунок діапазону
boolean
verticalReversed
false
Перевертає повзунок вертикального діапазону ( vertical також має бути ввімкнено)
boolean
scale
false
Вмикає шкалу повзунка діапазону
boolean
scaleSteps
5
Кількість позначок шкали
number
scaleSubSteps
0
Кількість підетапів шкали (кожен крок буде поділено на це значення)
number
formatScaleLabel
Метод має повертати форматоване значення масштабу. Як аргумент він отримує поточне значення кроку масштабу. Цей метод буде викликаний для кожного кроку шкали.
function (value)
limitKnobPosition
Обмежує положення регулятора розміром смужки діапазону. За замовчуванням увімкнено у темі iOS
boolean

ПараметрОписТип
on
Об'єкт з обробниками подій. Наприклад:
object
var range = app.range.create({
  el: '.range-slider',
  on: {
    change: function () {
      console.log('Range Slider value changed')
    }
  }
})

Методи та властивості повзунка діапазону

Отже, щоб створити повзунок діапазону, ми повинні викликати:
var range = app.range.create({ /* parameters */ })
Після цього у нас є його ініціалізований екземпляр (як range змінна у прикладі вище) з корисними методами та властивостями:
Властивості
Властивість Опис
range.app
Посилання на глобальний екземпляр застосунку
range.el
HTML-елемент повзунка діапазону
range.$el
Примірник Dom64 із HTML-елементом повзунка діапазону
range.inputEl
Вхідний HTML-елемент повзунка діапазону
range.$inputEl
Екземпляр Dom64 із вхідним HTML-елементом повзунка діапазону
range.rangeWidth
Ширина повзунка діапазону (у пікселях)
range.dual
Логічна властивість, яка вказує, чи є вона подвійною чи ні
range.min
Мінімальне значення діапазону
range.max
Максимальне значення діапазону
range.value
Значення діапазону
range.scale
Логічна властивість, яка вказує, чи scale ввімкнено чи ні
range.scaleSteps
Кількість ступенів шкали
range.scaleSubSteps
Кількість підступень шкали
range.$scaleEl
Екземпляр Dom64 із згенерованим елементом HTML масштабу
range.knobs
Масив, де кожен елемент представляє HTMLElement створеної ручки діапазону (2 ручки у випадку подвійного повзунка)
range.labels
Масив, де кожен елемент представляє HTMLElement створеної мітки регулятора діапазону (2 мітки у випадку подвійного повзунка)
range.vertical
Логічна властивість, яка вказує на те, вертикальна вона чи ні
range.verticalReversed
Логічна властивість, яка вказує, чи є вона вертикальною та перевернутою чи ні
range.params
Параметри повзунка діапазону
Методи
МетодОпис
range.getValue()
Повертає значення повзунка діапазону
range.setValue(value)
Установіть нове значення повзунка діапазону
range.updateScale()
Повторно обчислити та повторно відобразити шкалу повзунка
range.destroy()
Знищує екземпляр повзунка діапазону
range.on(event, handler)
Додати обробник подій
range.once(event, handler)
Додати обробник подій, який буде видалено після запуску
range.off(event, handler)
Видалити обробник подій
range.off(event)
Видалити всі обробники для вказаної події
range.emit(event, ...args)
Запустити подію на примірнику

Події повзунка діапазону

Повзунок діапазону запускатиме такі події DOM в елементі діапазону та події в екземплярі застосунку та діапазону:

Події DOM

ПодіяОб'єктОпис
range:change
Елемент повзунка діапазона

<div class="range-slider">

Подія буде ініційована, коли значення повзунка діапазону буде змінено
range:changed
Елемент повзунка діапазона

<div class="range-slider">

Подія буде ініційована після відпускання повзунка після зміни значення
range:beforedestroy
Елемент повзунка діапазона

<div class="range-slider">

Подія буде запущена безпосередньо перед знищенням повзунка діапазону

Події екземплярів застосунку та повзунка діапазону

Екземпляр повзунка діапазону запускає події як у себе, так і в екземплярі застосунку. Події екземплярів застосунку мають ті самі назви з префіксом range.
ПодіяАргументОписОб'єкт
change
(range, value)
Подія буде ініційована, коли значення діапазону буде змінено. Як аргумент обробник події отримує екземпляр діапазону
range
rangeChange
(range, value)
Подія буде ініційована, коли значення діапазону буде змінено. Як аргумент обробник події отримує екземпляр діапазону
app
changed
(range, value)
Подія буде ініційована після відпускання повзунка після зміни значення. Як аргумент обробник події отримує екземпляр діапазону
range
rangeChanged
(range, value)
Подія буде ініційована після відпускання повзунка після зміни значення. Як аргумент обробник події отримує екземпляр діапазону
app
beforeDestroy
(range)
Подія буде запущена безпосередньо перед знищенням повзунка діапазону. Як аргумент обробник події отримує екземпляр діапазону
range
rangeBeforeDestroy
(range)
Подія буде запущена безпосередньо перед знищенням повзунка діапазону. Як аргумент обробник події отримує екземпляр діапазону
app

Автоматична ініціалізація повзунка діапазону

Якщо вам не потрібен API повзунка діапазону, а повзунок діапазону знаходиться всередині сторінки та представлений у DOM на момент ініціалізації сторінки, його можна автоматично ініціалізувати, просто додавши додатковий клас range-slider-init:
<!-- додати клас range-slider-init -->
<div class="range-slider range-slider-init">
  <input type="range" min="0" max="100" step="1" value="10" />
</div>
У цьому випадку, якщо вам потрібно отримати доступ до створеного екземпляра повзунка діапазону, ви можете скористатися app.range.get методом застосунку:
var range = app.range.get('.range-slider');

if (range.value > 50) {
  // щось зробити
}
Під час використання автоматичної ініціалізації може знадобитися передати додаткові параметри. Це можна зробити двома способами:

● У випадку, якщо ви використовуєте повзунок з одним діапазоном і у вас є input:range всередині, тоді параметри step, min, max, value можна встановити з тих самих атрибутів введення:

<!--Параметри min, max, step, value будуть встановлені для відповідних вхідних атрибутів -->
<div class="range-slider range-slider-init">
  <input type="range" min="0" max="100" step="1" value="10" />
	</div>

● В іншому випадку, якщо у вас немає input:range або ви використовуєте введення подвійного діапазону, ви можете встановити всі доступні параметри за допомогою data-атрибутів елемента повзунка діапазону.

<!-- параметри встановлені через data- attributes -->
<div
  class="range-slider range-slider-init"
  data-min="0"
  data-max="100"
  data-step="10"
  data-label="true"
  data-value="50"
	></div>
● Якщо у вас повзунок із подвійним діапазоном, вам потрібно перейти до значень за допомогою атрибутів data-value-leftі data-value-right:
<!-- параметри  встановлені через data- attributes -->
<div
  class="range-slider range-slider-init"
  data-dual="true"
  data-min="0"
  data-max="100"
  data-step="10"
  data-label="true"
  data-value-left="30"
  data-value-right="60"
></div>

Змінні CSS

Нижче наведено список пов’язаних змінних CSS (спеціальні властивості CSS).
Зауважте, що коментовані змінні не вказано за замовчуванням, і в цьому випадку вони повертаються до їхніх значень.
:root {
  /*
  --t4-range-bar-active-bg-color: var(--t4-theme-color);
  --t4-range-scale-bg-color: var(--t4-range-bar-bg-color);
  --t4-range-scale-substep-bg-color: var(--t4-range-bar-bg-color);
  */
  --t4-range-scale-step-height: 5px;
  --t4-range-scale-substep-width: 1px;
  --t4-range-scale-substep-height: 4px;
  --t4-range-bar-bg-color: rgba(0, 0, 0, 0.2);
}
:root .dark,
:root.dark {
  --t4-range-bar-bg-color: rgba(255, 255, 255, 0.2);
}
.ios {
  --t4-range-size: 28px;
  --t4-range-bar-size: 4px;
  --t4-range-bar-border-radius: 2px;
  --t4-range-knob-size: 28px;
  --t4-range-knob-color: #fff;
  --t4-range-knob-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
  --t4-range-label-size: 24px;
  --t4-range-label-text-color: #000;
  --t4-range-label-bg-color: #fff;
  --t4-range-label-font-size: 12px;
  --t4-range-label-font-weight: 500;
  --t4-range-label-border-radius: 5px;
  --t4-range-label-padding: 0px 2px;
  --t4-range-scale-text-color: #666;
  --t4-range-scale-step-width: 1px;
  --t4-range-scale-font-size: 12px;
  --t4-range-scale-font-weight: 400;
  --t4-range-scale-label-offset: 4px;
}
.md {
  --t4-range-size: 20px;
  --t4-range-bar-size: 2px;
  --t4-range-bar-border-radius: 0px;
  --t4-range-knob-size: 12px;
  --t4-range-knob-box-shadow: none;
  --t4-range-label-size: 26px;
  --t4-range-label-font-weight: normal;
  --t4-range-label-font-size: 10px;
  --t4-range-label-border-radius: 50%;
  --t4-range-label-padding: 0px;
  --t4-range-scale-step-width: 2px;
  --t4-range-scale-font-size: 12px;
  --t4-range-scale-font-weight: 400;
  --t4-range-scale-label-offset: 4px;
}
.md,
.md .dark,
.md [class*='color-'] {
  --t4-range-knob-color: var(--t4-theme-color);
  --t4-range-label-text-color: var(--t4-md-on-primary);
  --t4-range-label-bg-color: var(--t4-theme-color);
  --t4-range-scale-text-color: var(--t4-md-on-surface-variant);
}

Приклади

Приклади
<template>
  <div class="page">
    <div class="navbar">
      <div class="navbar-bg"></div>
      <div class="navbar-inner sliding">
        <div class="title">Range Slider</div>
      </div>
    </div>
    <div class="page-content">
      <div class="block-title">Volume</div>
      <div class="list list-strong-ios list-outline-ios simple-list">
        <ul>
          <li>
            <div>
              <i class="icon t4-icons if-not-md" style="width: 28px">speaker_fill</i>
              <i class="icon material-icons md-only" style="width: 24px">volume_mute</i>
            </div>
            <div style="width: 100%; margin: 0 16px">
              <div class="range-slider range-slider-init">
                <input type="range" min="0" max="100" step="1" value="10" />
              </div>
            </div>
            <div>
              <i class="icon t4-icons if-not-md" style="width: 28px">speaker_3_fill</i>
              <i class="icon material-icons md-only" style="width: 24px">volume_up</i>
            </div>
          </li>
        </ul>
      </div>
      <div class="block-title">Brightness</div>
      <div class="list list-strong-ios list-outline-ios simple-list">
        <ul>
          <li>
            <div>
              <i class="icon t4-icons if-not-md" style="width: 28px">sun_min</i>
              <i class="icon material-icons md-only" style="width: 24px">brightness_low</i>
            </div>
            <div style="width: 100%; margin: 0 16px">
              <div class="range-slider range-slider-init color-orange" data-label="true">
                <input type="range" min="0" max="100" step="1" value="50" />
              </div>
            </div>
            <div>
              <i class="icon t4-icons if-not-md" style="width: 28px">sun_max_fill</i>
              <i class="icon material-icons md-only" style="width: 24px">brightness_high</i>
            </div>
          </li>
        </ul>
      </div>
      <div class="block-title display-flex justify-content-space-between">
        Price Filter <span class="price-value">$${priceMin} - $${priceMax}</span>
      </div>
      <div class="list list-strong-ios list-outline-ios simple-list">
        <ul>
          <li class="item-row">
            <div>
              <i class="icon t4-icons if-not-md" style="width: 28px">money_dollar_circle</i>
              <i class="icon material-icons md-only" style="width: 24px">attach_money</i>
            </div>
            <div style="width: 100%; margin: 0 16px">
              <div class="range-slider range-slider-init color-green" @range:change=${onPriceChange} data-label="true"
                data-dual="true" data-min="0" data-max="500" data-step="1" data-value-left="200" data-value-right="400">
              </div>
            </div>
            <div>
              <i class="icon t4-icons if-not-md" style="width: 28px">money_dollar_circle_fill</i>
              <i class="icon material-icons md-only" style="width: 24px">monetization_on</i>
            </div>
          </li>
        </ul>
      </div>
      <div class="block-title">With Scale</div>
      <div class="block block-strong-ios block-outline-ios">
        <div class="range-slider range-slider-init" data-min="0" data-max="100" data-label="true" data-step="5"
          data-value="25" data-scale="true" data-scale-steps="5" data-scale-sub-steps="4"></div>
      </div>
      <div class="block-title">Vertical</div>
      <div class="block block-strong-ios block-outline-ios display-flex justify-content-center">
        <div class="range-slider range-slider-init margin-right" data-vertical="true" data-min="0" data-max="100"
          data-label="true" data-step="1" data-value="25" style="height: 160px"></div>
        <div class="range-slider range-slider-init margin-horizontal" data-vertical="true" data-min="0" data-max="100"
          data-label="true" data-step="1" data-value="50" style="height: 160px"></div>
        <div class="range-slider range-slider-init margin-horizontal" data-vertical="true" data-min="0" data-max="100"
          data-label="true" data-step="1" data-value="75" style="height: 160px"></div>
        <div class="range-slider range-slider-init margin-left" data-dual="true" data-vertical="true" data-min="0"
          data-max="100" data-label="true" data-step="1" data-value-left="25" data-value-right="75"
          style="height: 160px"></div>
      </div>
      <div class="block-title">Vertical Reversed</div>
      <div class="block block-strong-ios block-outline-ios display-flex justify-content-center">
        <div class="range-slider range-slider-init color-red margin-right" data-vertical="true"
          data-vertical-reversed="true" data-min="0" data-max="100" data-label="true" data-step="1" data-value="25"
          style="height: 160px"></div>
        <div class="range-slider range-slider-init color-red margin-horizontal" data-vertical="true"
          data-vertical-reversed="true" data-min="0" data-max="100" data-label="true" data-step="1" data-value="50"
          style="height: 160px"></div>
        <div class="range-slider range-slider-init color-red margin-horizontal" data-vertical="true"
          data-vertical-reversed="true" data-min="0" data-max="100" data-label="true" data-step="1" data-value="75"
          style="height: 160px"></div>
        <div class="range-slider range-slider-init color-red margin-left" data-dual="true" data-vertical="true"
          data-vertical-reversed="true" data-min="0" data-max="100" data-label="true" data-step="1" data-value-left="25"
          data-value-right="75" style="height: 160px"></div>
      </div>
    </div>
  </div>
</template>
<script>
  export default (props, { $t4, $el, $update }) => {
    let priceMin = 200;
    let priceMax = 400;

    const onPriceChange = (e) => {
      const range = $t4.range.get(e.target);
      priceMin = range.value[0];
      priceMax = range.value[1];
      $update();
    };

    return $render;
  };
</script>