Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.04.2021, 13:10
Профессор
Отправить личное сообщение для giwuf Посмотреть профиль Найти все сообщения от giwuf
 
Регистрация: 16.05.2017
Сообщений: 167

Как реализовать плавное заполнение ползунка input range с фиксацией на заданных метка
Есть временная шкала input[type="range"] с ползунком и метками на 4,6,12 месяцев.

У меня не получается сделать так, чтобы можно было плавно тянуть за кругляш по всей длине ползунка, но чтобы он мог фиксироваться только на заданных отметках: 4,6,12. Сейчас реализован резкий переход.

А также вопрос как отцентрировать кругляш относительно метки и сдвинуть метку 4 месяца по шкале, чтобы она сохраняла адаптивность

Ссылка на фидл

var values = [4, 6, 12];
var range = document.getElementById('range');

range.addEventListener('input', function() {
  var rangeval = parseInt(this.value);
  var num = values.reduce(function(prev, curr) {
    return (Math.abs(curr - rangeval) < Math.abs(prev - rangeval) ? curr : prev);
  });
  this.value = num;
  this.style.background = 'linear-gradient(to right, rgb(223, 149, 52) 0%, rgb(223, 149, 52) ' + Math.floor(num / this.max * 100) + '%, rgb(234, 236, 238) ' + Math.floor(num / this.max * 100) + '%, rgb(234, 236, 238) 100%)';
});

range.addEventListener('mousemove', function() {
  this.style.background = 'linear-gradient(to right, rgb(223, 149, 52) 0%, rgb(223, 149, 52) ' + Math.floor(this.value / this.max * 100) + '%, rgb(234, 236, 238) ' + Math.floor(this.value / this.max * 100) + '%, rgb(234, 236, 238) 100%)';
});


<input class="slider" id="range" type="range" min="1" max="12" value="6" step="1">
<div class="bottom-row"><span>4 месяца</span><span>6 месяцев</span><span>12 месяцев</span>


.bottom-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-top: 12px;
  margin-bottom: 12px;
}

#range {
  -webkit-appearance: none;
  width: 100%;
  height: 2px;
  padding: 0;
  border-radius: 1px;
  border: none;
  background: linear-gradient(to right, rgb(223, 149, 52) 0%, rgb(223, 149, 52) 50%, rgb(234, 236, 238) 50%, rgb(234, 236, 238) 100%);
  outline: none;
  opacity: 0.7;
  -webkit-transition: .2s;
  transition: opacity .2s;
}

#range:focus {
  outline: none;
}

#range:hover {
  opacity: 1;
}

#range::-webkit-slider-thumb {
  -webkit-appearance: none;
  appearance: none;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background: rgb(223, 149, 52);
  cursor: pointer;
}

#range::-moz-range-thumb,
#range::-ms-thumb {
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background: rgb(223, 149, 52);
  cursor: pointer;
}

#range::-ms-fill-lower,
#range::-moz-range-progress {
  background-color: #ffdd2d;
}

#range::-ms-fill-upper,
#range::-moz-range-track {
  background-color: #eaecee;
}
Ответить с цитированием
  #2 (permalink)  
Старый 03.04.2021, 14:27
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

input range animate
giwuf,
<!DOCTYPE html>
<html>

<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        .bottom-row {
            display: flex;
            align-items: center;
            justify-content: space-between;
            margin-top: 12px;
            margin-bottom: 12px;
        }

        #range {
            -webkit-appearance: none;
            width: 100%;
            height: 2px;
            padding: 0;
            border-radius: 1px;
            border: none;
            background-image: linear-gradient(to right, rgb(223, 149, 52) 0%, rgb(223, 149, 52) 50%, rgb(234, 236, 238) 50%, rgb(234, 236, 238) 100%);
            outline: none;
            opacity: 0.7;
            transition: 1.2s;
        }

        #range:focus {
            outline: none;
        }

        #range:hover {
            opacity: 1;
        }

        #range::-webkit-slider-thumb {
            -webkit-appearance: none;
            appearance: none;
            width: 16px;
            height: 16px;
            border-radius: 50%;
            background-color: rgb(223, 149, 52);
            cursor: pointer;
        }

        #range::-moz-range-thumb,
        #range::-ms-thumb {
            width: 16px;
            height: 16px;
            border-radius: 50%;
            background-color: rgb(223, 149, 52);
            cursor: pointer;
        }

        #range::-ms-fill-lower,
        #range::-moz-range-progress {
            background-color: #ffdd2d;
        }

        #range::-ms-fill-upper,
        #range::-moz-range-track {
            background-color: #eaecee;
        }
    </style>
    <script>
        document.addEventListener("DOMContentLoaded", function() {
            var values = [4, 6, 12];
            var range = document.getElementById('range');

            function getPersent(value, max) {
                return value / max * 100 | 0;
            }

            function setBackground(percent) {
                range.style.backgroundImage = `linear-gradient(to right, rgb(223, 149, 52) 0%, rgb(223, 149, 52) ${percent}%, rgb(234, 236, 238) ${percent}%, rgb(234, 236, 238) 100%)`
            }

            function move(from, to, duration) {
                var now = performance.now();
                requestAnimationFrame(function animate(time) {
                    time = (time - now) / duration;
                    1 < time && (time = 1);
                    var value = from + (to - from) * time;
                    var percent = value / 2 * 100 | 0;
                    range.value = value;
                    setBackground(percent);
                    time < 1 && requestAnimationFrame(animate)
                })
            }
            range.addEventListener('mousemove', function() {
                var percent = getPersent(this.value, this.max);
                setBackground(percent)
            });
            range.addEventListener('mouseup', function() {
                var from = +this.value,
                    to = Math.round(+this.value);
                duration = 800;
                move(from, to, duration)
                document.querySelector('input.hidden').value = values[to]
            });
        });
    </script>
</head>

<body>
    <input class="hidden" value="6" readonly="readonly">
    <input class="slider" id="range" type="range" min="0" max="2" value="1" step=".01">
    <div class="bottom-row"><span>4 месяца</span><span>6 месяцев</span><span>12 месяцев</span></div>
</body>

</html>
Ответить с цитированием
  #3 (permalink)  
Старый 03.04.2021, 15:24
Профессор
Отправить личное сообщение для giwuf Посмотреть профиль Найти все сообщения от giwuf
 
Регистрация: 16.05.2017
Сообщений: 167

Рони, благодарю!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно реализовать такой функционал? Julian Общие вопросы Javascript 3 16.01.2015 12:34
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Ограничение ползунка input range HJ90 Элементы интерфейса 0 21.06.2013 13:22
Разным элементам input - разное форматирование. Как? eclipse (X)HTML/CSS 1 25.10.2007 13:55