--- title: slug: Web/HTML/Element/Input/range tags: - контроллер - слайдер translation_of: Web/HTML/Element/input/range ---
Элементы {{HTMLElement("input")}} с типом range
позволяют пользователю определить числовое значение, которое должно быть в пределах указанного промежутка. Однако, точное значение должно быть не слишком важно. Обычно они представляет собой слайдер или контроллер, но не текстовое поле как {{HTMLElement('input/number', 'number')}}. Так как этот виджет неточен, его не следует использовать, в случае, если важно установить точное значение .
Исходный код данного примера расположен в GitHub репозитории. Если вы хотите внести внести изменения в привер, пожалуйста склонируйте https://github.com/mdn/interactive-examples и отправте нам пул реквест.
Если используемый браузер не поддерживает тип range
, он будет отображаться как input{{HTMLElement('input/text', 'text')}}.
{{anch("Value")}} | {{domxref("DOMString")}}, содержащий строковое представление выбранного числового значения; используйте {{domxref("HTMLInputElement.valueAsNumber", "valueAsNumber")}} чтобы получить значение {{jsxref("Number")}}. |
События | {{event("change")}} и {{event("input")}} |
Поддерживаемые общие атрибуты | {{htmlattrxref("autocomplete", "input")}}, {{htmlattrxref("list", "input")}}, {{htmlattrxref("max", "input")}}, {{htmlattrxref("min", "input")}}, and {{htmlattrxref("step", "input")}} |
IDL атрибуты | list , value , и valueAsNumber |
Методы | {{domxref("HTMLInputElement.stepDown", "stepDown()")}} и {{domxref("HTMLInputElement.stepUp", "stepUp()")}} |
Для этого поля нет доступного патерна валидации, но следующая валидация реализованны следующие проверки
Атрибут {{htmlattrxref("value", "input")}} содержит {{domxref("DOMString")}}, который содержит строковое представление выбранного числа. Значение никогда не является пустой строкой (""
). Значение, по умолчанию, находится посередине, между указанными минимальным и максимальным значениями — если максимум оказывается меньше минимума, то значение по умолчанию приравнивается к значению атрибута min
. Алгоритм определения значения по умолчанию:
defaultValue = (rangeElem.max < rangeElem.min) ? rangeElem.min : rangeElem.min + (rangeElem.max - rangeElem.min)/2;
Если предпринята попытка установить значение меньше минимального, то оно примет значение атрибута min. Аналогично, попытка установить значение больше максимального, приведет к установлению значения равного атрибуту max.
В дополнение к атрибутам, общим для всех элементов {{HTMLElement("input")}}, range инпуты предлагают следующие атрибуты:
Attribute | Description |
---|---|
{{anch("list")}} |
id элемента <datalist>, который сожержит предопределенные значение (не обязательно) |
{{anch("max")}} |
Максимальное допустимое значение |
{{anch("min")}} |
Минимальное допустимое значение |
{{anch("step")}} |
Шаговый, используемый для пользовательского интерфейса и для проверки |
{{page("/en-US/docs/Web/HTML/Element/input/text", "list", 0, 1, 2)}}
Смотрите управление диапазоном с помощью решетки ниже, для примера того, как параметры диапазона обозначаются в поддерживаемых браузерах.
Это значение должно быть больше или равно значению атрибута min
.
Наименьшее значение в диапазоне допустимых значений. Если {{htmlattrxref("value", "input")}}, введенный в элемент, меньше этого значения, то элемент не проходит проверку ограничения. Если значение атрибута min
не является числом, то элемент не имеет максимального значения.
Это значение должно быть меньше или равно значению атрибута max
.
{{page("/en-US/docs/Web/HTML/Element/input/number", "step-include")}}
По умолчанию шаг для инпута с типом range
равен 1, допустим ввод только целых чисел, если база шага не является целым; например, если вы установили min
на -10 и value
на 1.5, то step
1 позволит только такие значения как 1.5, 2.5, 3.5,... в положительном направлении и -0.5, -1.5, -2.5,... в отрицательном направлении.
Attribute | Description |
---|---|
{{anch("orient")}} |
Устанавливает ориентацию слайдера. Firefox only. |
orient
атрибут определяем ориентацию слайдера. Значение horizontal
, значет что слайдер быдет отображен горизонтально, а vertical
- что вертикально .Note: Следующие атрибуты не применимы: accept
, alt
, checked
, dirname
, formaction
, formenctype
, formmethod
, formnovalidate
, formtarget
, height
, maxlength
, minlength
, multiple
, pattern
, placeholder
, readonly
, required
, size
, src
, и width
. Каждый из них будет проигнорирован в случаее употребления.
Пока тип number
позволяет пользователям вводить число с дополнительными ограничениями, заставляя их значения находиться между максимальным и минимальным, он требует, чтобы они вводили определенное значение. Инпут с типом range
позволяет вам запрашивать у пользователя значение в тех случаях, когда пользователь не может даже знать - каково выбранное конкретное числовое значение.
Несколько примеров основный ситуаций, в которых инпуты с range используются:
Как правило, если пользователь в большей степени интересуется процентным значением между минимумом и максимумом, нежели реальным значением, range инпут является отличным решением. Например, в случае с контролем громкости домашнего стерео, обычно пользователь думает "установить громкости наполовину максимума" вместо "установить громкость на 0.5".
По умолчанию, минимум равен 0, а максимум равен 100. Если вас это не устраивает, вы можете с легкостью указать другие границы, изменив значения атрибутов {{htmlattrxref("min", "input")}} и/или {{htmlattrxref("max", "input")}}. Они могут быть принимать любые значения с плавающей точкой.
Например, указать диапазон значений между -10 и 10, вы можете, используя:
<input type="range" min="-10" max="10">
{{EmbedLiveSample("Specifying_the_minimum_and_maximum", 600, 40)}}
По умолчанию, степень детализации равна 1, тем самым показывая, что значение всегда является целым числом. Вы можете изменить атрибут {{htmlattrxref("step")}} контроля степени детализации. Например, если вам нужно значение между 5 и 10, с точностью до двух знаков после запятой, вы должны установить значение step
на 0.01:
<input type="range" min="5" max="10" step="0.01">
{{EmbedLiveSample("Granularity_sample1", 600, 40)}}
Если вы хотите принять любое значение, независимо от разрядности, вы можете указать значение any
для атрибута {{htmlattrxref("step", "input")}}:
<input type="range" min="0" max="3.14" step="any">
{{EmbedLiveSample("Granularity_sample2", 600, 40)}}
Этот пример позволяет пользователю выбрать любое значение между 0 и π без ограничений на разрядность.
Спецификация HTML дает браузерам некоторую гибкость при представлении диапазонных контроллеров. Нигде эта гибкость не проявляется больше, чем в области хэш-меток и, в меньшей степени, лейблов. Спецификация описывает как добавлять кастомные точки контроллера диапазона, используя атрибут {{htmlattrxref("list", "input")}} и элемент {{HTMLElement("datalist")}}, но не имеет требований или рекомендаций по стандартизации хэш-меток и лейблов по длине контроллера.
Так как браузеры имеют эту гибкость, и на сегодняшний день ни один из них не поддерживает все возможности, определенные HTML, представляем несколько макетов, показывающих как вы можете получить на macOS в браузере, который их поддерживает.
Этот результат вы получите, если не укажите атрибут {{htmlattrxref("list", "input")}}, или браузер не будет его поддерживать.
HTML | Screenshot |
---|---|
<input type="range"> |
Контроллер диапазона, использующий атрибут list
, указывающий ID {{HTMLElement("datalist")}}, который определяет серию хэш-меток на контроллере. Их одиннадцать, одна на 0% и на каждой отметки 10%. Каждая точка представлена с помощью элемента {{HTMLElement("option")}} с его набором {{htmlattrxref("value", "option")}} значений диапазона, при котором должна быть нарисована метка.
HTML | Screenshot |
---|---|
<input type="range" list="tickmarks"> <datalist id="tickmarks"> <option value="0"> <option value="10"> <option value="20"> <option value="30"> <option value="40"> <option value="50"> <option value="60"> <option value="70"> <option value="80"> <option value="90"> <option value="100"> </datalist> |
Вы можете добавить лейблы в свой контроллер диапазонов, добавив атрибут {{htmlattrxref("label", "option")}} элементам {{HTMLElement("option")}}, соответствующим значениям, на которых вы бы хотели видеть лейблы.
HTML | Screenshot |
---|---|
<input type="range" list="tickmarks"> <datalist id="tickmarks"> <option value="0" label="0%"> <option value="10"> <option value="20"> <option value="30"> <option value="40"> <option value="50" label="50%"> <option value="60"> <option value="70"> <option value="80"> <option value="90"> <option value="100" label="100%"> </datalist> |
Примечание: В настоящее время ни один браузер полностью не поддерживает эти возможности. Firefox не поддрживает хэш-метки и лейблы, например, в то время как Chrome поддерживает хэш-метки, но не поддерживает лейблы. Версия 66 (66.0.3359.181) Chrome поддерживает лейблы, но тэг {{htmlelement("datalist")}} должен быть стилизован с помощью CSS, так как его свойство {{cssxref("display")}} по умолчанию - none
, тем самым скрывая лейблы.
По умолчанию, если браузер отображает инпут диапозона как слайдер, он отобразит его так чтоб ползунок ездил в право и в лево. Когда поддержка браузерами будет реализованно, можно будет делать слайдер вертикальным, так чтобы ползунок мог ездить вверх и вниз. Ниодин из наиболее используемых браузеров не имплементировал это пока. (Firefox {{bug(981916)}}, Chrome bug 341071). также, возможно, следующий баг под вопросом.
В реальности, мы можем сделать слайдер вертикальным используя CSS трансформации, или применяя уникальный метод для каждого браузера в отдельности, включая: настройки {{cssxref('appearance')}} для slider-vertical
, использование нестандартной ориентации orient
в Firefox,или изменение text direction для Internet Explorer и Edge
Рассмотрим контроллер диапазона:
<input type="range" id="volume" min="0" max="11" value="7" step="1">
{{EmbedLiveSample("Orientation_sample1", 200, 200, "https://mdn.mozillademos.org/files/14983/Orientation_sample1.png")}}
Это горизонтальный контроллер (по крайне мере на большинстве основных браузеров, другие могут отличаться).
Следуюя спецификации, сделать его вертикальным также просто как добавить CSS, чтобы изменить размеры контроллера, чтобы его высота оказалась больше ширины:
#volume { height: 150px; width: 50px; }
<input type="range" id="volume" min="0" max="11" value="7" step="1">
{{EmbedLiveSample("Orientation_sample2", 200, 200, "https://mdn.mozillademos.org/files/14985/Orientation_sample2.png")}}
К сожалению, большенство браузеров сейчас не поддерживают вертикальные контроллы напрямую.
Но вы, все же, можете сделать вертикльный контролл используя горизонтальный контролл. Самый простой способ - использовать CSS: применяя {{cssxref("transform")}} для поворото элемента на 90 градусов. Посмотрим:
В HTML нужно добавить обертку вокруг {{HTMLElement("input")}} - {{HTMLElement("div")}}, что позволит нам исправить макет после выполнения трансформации (т.к. трансформация автоматически не влияет на макет страницы):
<div class="slider-wrapper"> <input type="range" min="0" max="11" value="7" step="1"> </div>
Теперь нам нужно немного CSS. Во-первых, это CSS для самой обертки; это указание дисплея и размеров для правильного расположения на странице; по сути, он резервирует область страницы для слайдера, так, чтобы можно было поместить повернутый слайдер в зарезервированном пространстве, не создавая беспорядка.
.slider-wrapper { display: inline-block; width: 20px; height: 150px; padding: 0; }
Затем информация о стиле элемента <input>
в зарезервированном пространстве:
.slider-wrapper input { width: 150px; height: 20px; margin: 0; transform-origin: 75px 75px; transform: rotate(-90deg); }
Размеры контроллера это набор из 150 пикселей длины и 20 пикселей высоты. Маржинги установлены на 0 и {{cssxref("transform-origin")}} смещается в середину пространства, на котором вращается слайдер; поскольку слайдер имеет ширину 150 пикселей, он вращается через прямоугольник по 150 пикселей с каждой стороны. Смещение начала координат на 75px по каждой оси означает, что мы будем вращаться вокруг центра этого пространства. Наконец, мы поварачиваем против часовой стрелки на 90°. Результат: инпут range, который вращается таким образом, что максимальное значение находится сверху, а минимальное снизу.
{{EmbedLiveSample("Orientation_sample3", 200, 200, "https://mdn.mozillademos.org/files/14987/Orientation_sample3.png")}}
Свойство {{cssxref('appearance')}} имеет нестандартное значение slider-vertical
, которое делает слайдер вертикальным.
Используем тот же HTML что и в предыдущем примере:
<input type="range" min="0" max="11" value="7" step="1">
Берем только те инпуты что иеют тип range:
input[type="range"] { -webkit-appearance: slider-vertical; }
{{EmbedLiveSample("appearance_property", 200, 200)}}
В Firefox, реализованно нестандартное свойство orient
.
Используем тот же HTML что и в предыдущем примере и добавляем атрибут со значением vertical
:
<input type="range" min="0" max="11" value="7" step="1" orient="vertical">
{{EmbedLiveSample("orient_attribute", 200, 200)}}
Свойство {{cssxref('writing-mode')}} может быть использовано для специальных эфектов
Используем тот же HTML что и в предыдущем примере:
<input type="range" min="0" max="11" value="7" step="1">
Берем только те инпуты что иеют тип range, меняем writing mode с default на bt-lr
, или bottom-to-top и left-to-right:
input[type="range"] { writing-mode: bt-lr; }
{{EmbedLiveSample("writing-mode_bt-lr", 200, 200)}}
Каждый из вышеперечисленных примеров работает в своем браузере, мы попробуем обьединить все вместе чтоб добится кроссбраузерности решения:
Оставим orient
атрибут со значением vertical
для Firefox:
<input type="range" min="0" max="11" value="7" step="1" orient="vertical">
Берем только те инпуты что иеют тип range, меняем writing mode с default на bt-lr
, или bottom-to-top и left-to-right, для Edge и Internet Explorer, и обавляем -webkit-appearance: slider-vertical
для всех -webkit-based браузеров:
input[type="range"] { writing-mode: bt-lr; -webkit-appearance: slider-vertical; }
{{EmbedLiveSample("Putting_it_all_together", 200, 200)}}
Спецификация | Статус | Комментарий |
---|---|---|
{{SpecName('HTML WHATWG', 'forms.html#range-state-(type=range)', '<input type="range">')}} | {{Spec2('HTML WHATWG')}} | Первое определение |
{{SpecName('HTML5.1', 'sec-forms.html#range-state-typerange', '<input type="range">')}} | {{Spec2('HTML5.1')}} | Первое определение |
{{Compat("html.elements.input.input-range")}}
<input type="number">