Как настроить внешний вид диапазона ввода HTML5 с помощью CSS?

Я хочу настроить внешний вид типа ввода диапазона в HTML5, чтобы он выглядел как индикатор выполнения. Я попытался применить некоторые общие атрибуты CSS с помощью класса CSS, но кажется, что они не работают.

Может ли кто-нибудь направить меня, как настроить его??


person ptamzz    schedule 24.08.2010    source источник
comment
С комбинацией javascript? С помощью CSS вы можете не отображать ввод и отображать все, что подходит: до и: после элемента. Затем через javascript обработайте, как все это взаимодействует друг с другом.   -  person Serge    schedule 28.03.2014
comment
Вот отличная статья на эту тему: hongkiat.com/blog/html5- стиль ползунка диапазона.   -  person Annie    schedule 07.12.2014
comment
Было бы полезно, если бы вы не приняли принятый в настоящее время ответ (и, возможно, приняли бы другой, который вам нравится). Наличие ответа, в котором говорится, что даже не пытайтесь это сделать, технология слишком новая, 5 лет назад все еще закреплена в верхней части списка ответов, никому не поможет.   -  person Mark Amery    schedule 28.02.2016
comment
Это немного устарело, но все еще всплывает в поисковых системах, поэтому - вот хороший пример реализации и x-браузера brennaobrien.com/blog/2014/05/ . Ничего плохого в принятом ответе нет, он просто немного устарел.   -  person Pete - iCalculator    schedule 07.03.2017
comment
Есть ли способ сделать это программно на основе javascript? Меня интересует динамическое изменение атрибутов элемента thumb.   -  person hrabinowitz    schedule 05.05.2018


Ответы (10)


EDIT: в настоящее время все основные браузеры поддерживают оба

Следовательно, вы должны использовать один из этих двух, как объяснено в других ответах, и этот ответ больше не должен быть принятым.


<input type="range"> довольно новый, и вы уже пытаетесь настроить его с помощью CSS. :)

Я бы не стал пробовать это по двум причинам:

  1. могут возникнуть серьезные проблемы с совместимостью сейчас и в течение следующих нескольких (или многих) лет. Подумайте, что в настоящее время элемент управления формой, такой как <select> (доступный с момента появления Интернета), по-прежнему проблематично настраивать с помощью CSS в кросс-браузерном режиме. Например, если вы установите padding для полей выбора, многие браузеры (IE7, OPERA9, CHROME5, SAFARI4) полностью проигнорируют отступы. Работает только на IE8 и на FF 3.6. (все тесты проводились с HTML5 DOCTYPE в стандартном режиме).

  2. <input type="range"> был создан, чтобы показывать ползунок, а НЕ индикатор выполнения, пытаясь обмануть его с помощью CSS, чтобы преобразовать ползунок в индикатор выполнения, это звучит странно. Это как пытаться использовать CSS для преобразования <textarea> в таблицу, но почему бы вам просто не использовать <table> для рендеринга таблиц?!

Чтобы отобразить индикатор выполнения в HTML5, вы должны следовать предложению, данному marcgg в его ответе. Поскольку в настоящее время ни один браузер не отображает его, вы можете использовать простой div с p внутри, например:

<div id="progress" style="position:relative; width:100px; height:20px; border:1px solid #cccccc;">
   <p style="position:absolute; left:0; top:0; background-color:#0000ff; height:100%; width:30%; font-size:0px;">&nbsp;</p>
</div>

Затем просто обновите style.width внутреннего элемента P в процентах, например:

width: 75%

К вашему сведению: если вы хотите сделать это в простом JS, вот код:

document.getElementById('progress').(getElementsByTagName('p')[0]).style.width = '75%';
person Marco Demaio    schedule 24.08.2010
comment
ну я точно не знаю, что лучше сделать. Я прочитал учебник по аудиотегу HTML5, и там они использовали тип диапазона ввода, чтобы показать ход воспроизведения звука. Поэтому я просто хочу настроить внешний вид. Любые предложения о том, что использовать для того же??? - person ptamzz; 25.08.2010
comment
Предложение о том, что использовать для того же, находится в моем ответе! Используйте DIV с P внутри. Он показывает индикатор выполнения, если вы мне не верите, просто скопируйте и вставьте код на страницу и попробуйте. У вас есть ссылка на учебник? Кажется странным, что они предлагают изменить ползунок с помощью CSS, чтобы превратить его в индикатор выполнения, это странно! Ползунок — это то, с чем пользователь может взаимодействовать, перемещая ползунок, индикатор выполнения — это то, что пользователь может видеть, но не может изменить, наведя на него указатель мыши. - person Marco Demaio; 25.08.2010
comment
хорошо спасибо большое. Думаю, я воспользуюсь вашим предложением. И это из dev.opera.com/articles/view/. На самом деле они не предлагали изменить его с помощью CSS. Они просто использовали ползунок, но мне не нравится внешний вид, поэтому я подумал, могу ли я просто изменить его с помощью CSS, поскольку я немного его знаю :) - person ptamzz; 25.08.2010
comment
-1. Ответы на тему «это новинка» ужасны: в наши дни большинство браузеров поддерживают входные данные HTML5 «диапазон» и «прогресс», и правильный ответ приведен ниже, но этот ответ 2010 года о «не делайте этого» по-прежнему отмечен как принятый ответ. - person mikemaccana; 13.11.2013
comment
@nailer: он по-прежнему не поддерживается в IE8/IE9 (см. здесь caniuse.com/#feat=input- диапазон ), и они по-прежнему составляют 15% использования браузера (см. gs.statcounter.com/ ) также частично поддерживается на Android до версии 4.1. Если вы продаете что-то в Интернете с помощью сайта электронной коммерции, стоит ли терять 15% базы ваших потенциальных клиентов из-за <input type="range">? - person Marco Demaio; 06.12.2013
comment
использование ползунка в качестве индикатора выполнения вовсе не такая уж ужасная идея, и это НЕ то же самое, что использование текстового поля для имитации таблицы (как именно вы это сделаете?), + если вы знаете, на какой платформе работает ваш сайт. могут использовать новые теги (например, это может быть ограничено мобильными телефонами или даже типом мобильного телефона) + иногда просто хорошо покончить с прошлым, пора людям использовать хорошие веб-браузеры (вместо IE ) - person Pizzaiola Gorgonzola; 16.12.2013
comment
Кстати, управление диапазоном IE11 выглядит так, как будто это комбинация индикатора выполнения и ползунка. Попробуйте сами, СНИМОК - person Ivan Akcheurov; 04.07.2014

Если вы используете HTML 5, почему бы не использовать тег progress?

<progress value="1534602" max="4603807">33%</progress>
person marcgg    schedule 24.08.2010
comment
Есть ли какой-нибудь браузер, способный отобразить это? - person Marco Demaio; 24.08.2010
comment
Я не думаю, что какой-либо браузер еще отображает это, может быть, modernizr.com может помочь? - person cofiem; 24.08.2010
comment
@MarcoDemaio Firefox, Safari и Chrome отображают это - person marcgg; 14.11.2011
comment
@cofiem Modernizer не помогает неподдерживаемым браузерам отображать новые функции, он только определяет, поддерживают ли они эту функцию или нет. - person Jake Wilson; 09.05.2012
comment
progress и input[type=range] используются по-разному, только range предназначен для пользовательского ввода. - person mcfedr; 06.10.2013
comment
Это не совсем вход - person Code Whisperer; 31.10.2014

Я сделал кроссбраузерное решение (+IE9, FF, Chrome, Safari), только CSS.

[Обновлено 24 ноября 2016 г.]

http://codepen.io/nlfonseca/pen/MwbovQ

@import 'bourbon';

$slider-width-number: 240;
$slider-width: #{$slider-width-number}px;
$slider-height: 2px;
$background-slider: #c7c7c7;
$background-filled-slider: #e33d44;
$thumb-width: 28px;
$thumb-height: 18px;
$thumb-radius: 8px;
$thumb-background: #fff;
$thumb-border: 1px solid #777;
$shadow-size: -8px;
$fit-thumb-in-slider: -8px;

@function makelongshadow($color, $size) {
  $val: 5px 0 0 $size $color;

  @for $i from 6 through $slider-width-number {
    $val: #{$val}, #{$i}px 0 0 $size #{$color};
  }

  @return $val;
}

div {
  height: 100px;
  display: flex;
  justify-content: center;
}

input {
  align-items: center;
  appearance: none;
  background: none;
  cursor: pointer;
  display: flex;
  height: 100%;
  min-height: 50px;
  overflow: hidden;
  width: $slider-width;

  &:focus {
    box-shadow: none;
    outline: none;
  }

  &::-webkit-slider-runnable-track {
    background: $background-filled-slider;
    content: '';
    height: $slider-height;
    pointer-events: none;
  }

  &::-webkit-slider-thumb {
    @include size($thumb-width $thumb-height);

    appearance: none;
    background: $thumb-background;
    border-radius: $thumb-radius;
    box-shadow: makelongshadow($background-slider, $shadow-size);
    margin-top: $fit-thumb-in-slider;
    border: $thumb-border;
  }


  &::-moz-range-track {
    width: $slider-width;
    height: $slider-height;
  }

  &::-moz-range-thumb {
    @include size($thumb-width $thumb-height);

    background: $thumb-background;
    border-radius: $thumb-radius;
    border: $thumb-border;
    position: relative;
  }

  &::-moz-range-progress {
    height: $slider-height;
    background: $background-filled-slider;
    border: 0;
    margin-top: 0;
  }

  &::-ms-track {
    background: transparent;
    border: 0;
    border-color: transparent;
    border-radius: 0;
    border-width: 0;
    color: transparent;
    height: $slider-height;
    margin-top: 10px;
    width: $slider-width;
  }

  &::-ms-thumb {
    @include size($thumb-width $thumb-height);

    background: $thumb-background;
    border-radius: $thumb-radius;
    border: $thumb-border;
  }

  &::-ms-fill-lower {
    background: $background-filled-slider;
    border-radius: 0;
  }

  &::-ms-fill-upper {
    background: $background-slider;
    border-radius: 0;
  }

  &::-ms-tooltip {
    display: none;
  }
}
person nlfonseca    schedule 26.05.2015
comment
Это умная попытка и ответ, который наиболее точно отвечает на вопрос. Но с ним есть проблемы: по сути, он работает за счет удлинения ползунка (большого пальца?). Это нормально для перетаскивания, но вы можете только щелкнуть, чтобы установить положение полосы справа от ползунка. Щелчок влево ничего не делает. - person Rich Smith; 10.06.2015
comment
Хорошо поймал. Спасибо большое. Я уже исправил эту проблему, поставив pointer-events: none; перед большим пальцем. Демо уже обновлено. ;) - person nlfonseca; 11.06.2015
comment
прекрасное решение, спасибо за все усилия! не могу поверить, что они не подумали о снятии шкуры с элемента управления. да ладно, шучу, я вполне могу - person Lorenzo Boccaccia; 20.06.2015
comment
Да @fedeghe. Chrome теперь не разрешает псевдоэлементы на теневых элементах... Таким образом, цель ::-webkit-slider-thumb:before больше не существует. Я не нашел способ решить это. :/ - person nlfonseca; 15.07.2016
comment
Единственное реальное решение, которое я нашел, основано на js - person fedeghe; 15.07.2016
comment
Да :/ какой позор... ибо мелочь на хроме и на предыдущей версии работала :/ - person nlfonseca; 15.07.2016
comment
@fedeghe У меня уже есть другое решение :) проверьте еще раз ссылку: codepen.io/nlfonseca/pen/MwbovQ< /а> - person nlfonseca; 24.11.2016


Вы можете редактировать CSS ввода диапазона, используя input[type="range"]::-webkit-slider-thumb и input[type="range"].

Вот пример этого,

http://web.archive.org/web/20120407000030/http://webstutorial.com/range-input-slider-html5-css3/html-5

Я знаю, что на этот вопрос уже был дан ответ, но я просто делюсь им.

person Niraj Chauhan    schedule 04.04.2012

Инструменты jQuery предоставляют подключаемый модуль, который создает стилизованные элементы из входного диапазона и, более того, заставляет его работать как слайдер в старых браузерах, которые не поддерживают input[type=range].

Позволяет стилизовать:

  • рукоять
  • ползунок
  • необязательное заполнение прогресса
  • поле вывода значения

Я использовал его много раз, и это отличный инструмент.

ВНИМАНИЕ: не работает на сенсорных устройствах. У меня не так много опыта в этом, но вы можете попробовать мобильный слайдер jQuery: http://view.jquerymobile.com/1.3.0/docs/widgets/sliders/

http://jquerytools.github.io/demos/rangeinput/index.html

person inorganik    schedule 12.03.2013

Когда я посмотрел на этот вопрос, мне нужно было что-то простое. Уже есть несколько ответов фреймворка о том, как это сделать, но иногда проще и гибче просто создать свой собственный. Конечно, вместе с фреймворком вы получаете определенную сумму бесплатно (и часто это правильный выбор, если он подходит), но тогда вам придется беспокоиться о совместимости фреймворка, поддержке и копаться в его недрах, чтобы идти дальше. вне его границ.

Вот простой слайдер только для javascript. В основном это img для ползунка, img для кнопки и обратный вызов с процентом выполнения. Не поющий и танцующий слайдер, а что-то простое в использовании.

Демо

HTML

<div id='bb_sliderContainer'  ondragstart="return false;" ondrop="return false;">
    <img id='bb_slider' src='slider.png'/>
    <img id='bb_sliderButton' src='sliderbutton.png'/>
</div>

Сценарий

Поместите в файл javascript:

(function(bb,undefined){    
bb.Slider = function(buttonCssId,sliderCssId,initialPercentage,progressUpdate)
{
    var halfButtonWidth = 5;
    var sliderMoving = false;
    var buttonElement = document.getElementById(buttonCssId);
    var sliderElement = document.getElementById(sliderCssId);                
    var length = sliderElement.clientWidth;                
    var leftPos = 0;
    var rightPos = leftPos + length;
    length = rightPos - leftPos;              

    if( initialPercentage )
    {
        var buttonPos = leftPos + initialPercentage / 100 * length;
        buttonElement.style.left = buttonPos - halfButtonWidth + 'px';  
    }        

    buttonElement.addEventListener( 'mousedown', function(){ 
        sliderMoving = true;
    } );        

    document.addEventListener( 'mousemove', function(event){
        if( sliderMoving == true )
        {                      
            var rect = sliderElement.getBoundingClientRect();                                                                        
            var mouseX = event.clientX - rect.left;
            var prop = mouseX / length;
            if( prop < 0 )
            {
                prop = 0;
                mouseX = 0;
            }
            if( prop > 1 )
            {
                prop = 1;
                mouseX = length;
            }                
            buttonElement.style.left = leftPos + prop * length - halfButtonWidth + 'px';                
            progressUpdate(prop * 100);         
        }
    });
    document.addEventListener( 'mouseup', function(){
        sliderMoving = false;
    });
}    
}(window.bb = window.bb || {}));

Пример использования

HTML:

<img src='space.png' style='width:50%;position:relative;top:20px' id='bb_sliderSubject'>

Javascript:

function sliderUpdate(percentage)
{
    var sliderSubject = document.getElementById('bb_sliderSubject');
    sliderSubject.style.width = percentage + '%';
}
window.onload=function()
{
    var slider = new bb.Slider('bb_sliderButton','bb_slider',50,sliderUpdate);
}
person acarlon    schedule 08.05.2014

Вот пример:

input[type='range'] {
	-webkit-appearance: none;
	border-radius: 5px;
	box-shadow: inset 0 0 5px #333;
	background-color: #999;
	height: 10px;
	vertical-align: middle;
}
input[type='range']::-moz-range-track {
	-moz-appearance: none;
	border-radius: 5px;
	box-shadow: inset 0 0 5px #333;
	background-color: #999;
	height: 10px;
}
input[type='range']::-webkit-slider-thumb {
	-webkit-appearance: none !important;
	border-radius: 20px;
	background-color: #FFF;
	box-shadow:inset 0 0 10px rgba(000,000,000,0.5);
	border: 1px solid #999;
	height: 20px;
	width: 20px;
}
input[type='range']::-moz-range-thumb {
	-moz-appearance: none;
	border-radius: 20px;
	background-color: #FFF;
	box-shadow:inset 0 0 10px rgba(000,000,000,0.5);
	border: 1px solid #999;
	height: 20px;
	width: 20px;
}
<input type="range">

person Edwin Thomas    schedule 23.08.2014
comment
Откуда автор фрагмента взял имена селекторов, такие как moz-range-track? Есть ли возможность найти их в хроме? - person Ini; 29.07.2018

См. http://afarkas.github.io/webshim/demos/demos/webforms/styler/index.html?range

Это инструмент, который создает кросс-браузерный код для стилизации как нативных, так и веб-диапазонов, как вы хотите.

.ws-range, input[type="range"] {
    /* Range styles: width, height, border-radius, background */
    -webkit-appearance: none;cursor: pointer;border: 0;outline: none;padding: 0;margin: 20.5px 0;
}
.ws-range .ws-range-thumb {
    /* Thumb styles: width, height, border, border-radius, background */
}
.ws-range.ws-focus .ws-range-thumb {
    /* Thumb focus styles: border-color, background */
}
.ws-range.ws-active .ws-range-thumb {
    /* Thumb active styles: border-color, background */
}
.ws-range .ws-range-min {
    /* Thumb progress styles: display, background */
    border-radius: /* same as range */;
    height: 100%;
}
input[type="range"]::-moz-range-track {
    border: none;background: transparent;
}
input[type="range"]::-ms-tooltip {
    display: none;
}
input[type="range"]::-webkit-slider-thumb {
    /* Thumb styles: width, height, border, border-radius, background */
    -webkit-appearance: none;
}
input[type="range"]::-ms-track {
    /* Range styles: width, height, border-radius, background */
    color: transparent;border: 0;
}
input[type="range"]::-moz-range-thumb {
    /* Thumb styles: width, height, border, border-radius, background */
}
input[type="range"]::-ms-thumb {
    /* Thumb styles: width, height, border, border-radius, background */
}
input[type="range"]:focus::-webkit-slider-thumb {
    /* Thumb focus styles: border-color, background */
}
input[type="range"]:focus::-moz-range-thumb {
    /* Thumb focus styles: border-color, background */
}
input[type="range"]:focus::-ms-thumb {
    /* Thumb focus styles: border-color, background */
}
input[type="range"]:active::-webkit-slider-thumb {
    /* Thumb active styles: border-color, background */
}
input[type="range"]:active::-moz-range-thumb {
    /* Thumb active styles: border-color, background */
}
input[type="range"]:active::-ms-thumb {
    /* Thumb active styles: border-color, background */
}
input[type="range"]::-moz-range-progress {
    /* Thumb progress styles: display, background */
    border-radius: /* same as range */;
    height: 100%;
}
input[type="range"]::-ms-fill-lower {
    /* Thumb progress styles: display, background */
    border-radius: /* same as range */;
    height: 100%;
}
.no-cssrangeinput input[type="range"] {
    background: transparent;margin: 0;border: 0;min-height: 51px;
}
person Oriol    schedule 18.01.2014

person    schedule
comment
Это работает и на iOS 5.0, что хорошо, потому что по умолчанию для сенсорного устройства довольно мало. - person Husky; 21.10.2011