Изменить стили большого пальца ввода [тип = диапазон] с помощью Jquery - не работает

Я создал ползунок диапазона, который визуально демонстрирует различные размеры баннеров. Я пытаюсь создать функцию, которая позволяет input-range-thumb изменять цвет фона при запуске событий .mousedown и .mouseup. Я читал, что нет возможности напрямую выбрать большой палец с помощью простого Jquery. Я читал, что лучше всего создать класс и использовать метод .AddClass.

Я пробовал это сам, и я не могу понять, почему большой палец не меняет цвет.

Не могли бы вы посмотреть на мой код?

https://codepen.io/stinkytofu3311/pen/LWomev

    //1. When user clicks their mouse down on the Range-Thumb the thumbs background-color will change to blue.
$("#range-slider").on("mousedown", function() {
    $(this).addClass("thumb-down");
});
//2. When user mouse up on the Range-Thumb the Thumbs background-color will change to Green.
$("#range-slider").on("mouseup", function() {
    $(this).addClass("thumb-up");
});

Проблема решена! Вот исправленная версия https://codepen.io/stinkytofu3311/pen/OpKKMd

var imageUrl = new Array(); 

        imageUrl[0] = 'http://svgshare.com/i/1Ak.svg';

        imageUrl[1] = 'http://svgshare.com/i/1AQ.svg';

        imageUrl[2] = 'http://svgshare.com/i/1Bb.svg';

        imageUrl[3] = 'http://svgshare.com/i/1Am.svg';

        imageUrl[4] = 'http://svgshare.com/i/1CG.svg';

        imageUrl[5] = 'http://svgshare.com/i/1By.svg';
       
$(document).on('input change', '#range-slider', function() {//listen to slider changes
    var v=$(this).val();//getting slider val
   $('#sliderStatus').html( $(this).val() );
  $("#img").prop("src", imageUrl[v]);
});


// ::::: Range Slider Thumb ::::: //

//1. When user clicks their mouse down on the Range-Slider
$("#range-slider").on("mousedown", function() {
  //1.1 Remove default class from CSS, and add the class .thumb-down (changes background color)
    $(this).removeClass().addClass("thumb-down");
  //1.2 Remove default class from CSS, and add the class .hover-ring (changes box-shadow to a green color)
    $(this).removeClass().addClass("hover-ring");
});
//2. When user mouse up on the Range-Slider the Thumbs background-color will change to Green
$("#range-slider").on("mouseup", function() {
  //2.1 Add class .thumb-up
    $(this).addClass("thumb-up");
    $(this).addClass("hover-ring-out");
});
.product-range-wrapper {
  displat: -webkit-flex;
  displat:flex;
  -webkit-flex-direction: column;
  flex-direction:column;
  width:600px;
  margin:0px auto;
  /*outline: 1px solid purple;*/
 }
.product-range-block {
  display: -webkit-flex;
  display:flex;
  -webkit-flex-direction: row;
  flex-direction: row;
  width:100%;
  height:300px;
  /*outline: 1px solid red;*/
}
.ref-height-block {
  flex-grow:3;
  /*background-color:red;*/
}
.size-chart-block {
  flex-grow:9;
  /*background-color:green;*/
}
.product-range-block img {
  width:90%;
  /*outline: 1px solid blue;*/
}
#img {
  width: 100% !important;
}
#slider_count {
  margin:0px auto;
  width:200px;
  padding:20px 20px;
  text-align:center;
  background-color:yellow;
}

/* ::::::::::::::::::::Range Slider Styles::::::::::::::::::::::::: */
.range-slider-block {
  margin:0px auto;
  width:90%;
  }
#range-slider {
  padding:40px 0px;
  width:100%;
  /*outline: 1px solid green;*/
}
/* Remove Range Sliders Default Styles*/
input[type=range]{
    -webkit-appearance: none;
}
/* Track */
input[type=range]::-webkit-slider-runnable-track {
    height: 10px;
    background: #d7d7d7;
    border: none;
    border-radius: 6px;
}
input[type=range]:focus {
    outline: none;
}
/* Thumb */
input[type=range]::-webkit-slider-thumb {
    -webkit-appearance: none;
    border: none;
    height: 30px;
    width: 30px;
    border-radius: 50%;
    background: #46947F;
    margin-top: -9px;
    transition: box-shadow 0.5s;
}
input[type=range]:hover::-webkit-slider-thumb {
    box-shadow: 0 0 0 6pt rgba(190,190,190,0.4);
    cursor:pointer;
}

/* JS Stykes */
/* Changes Thumb color to darker green when mousedownn */
input[type=range].thumb-down::-webkit-slider-thumb {
  background:#316557;
}
/* Changes Thumb color back to light green when mouseup */
input[type=range].thumb-up::-webkit-slider-thumb {
  background:#46947F;  
}
/* Changes Ring color Green */
input[type=range].hover-ring::-webkit-slider-thumb {
    box-shadow: 0 0 0 6pt rgba(70,148,127,0.46);
    cursor:pointer;
}
input[type=range].hover-ring-out::-webkit-slider-thumb {
    box-shadow: 0 0 0 0pt rgba(0,0,0,0);
    cursor:pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="product-range-wrapper">
  
  <div class="product-range-block">
    <div class="ref-height-block">
      <img src="http://svgshare.com/i/1Ba.svg" alt="Product Height Refrence" height="" width="">
    </div>
    <div class="size-chart-block">
      <img src="http://svgshare.com/i/1Ak.svg" style='' id='img'/>
    </div>
  </div>
  
  <div class="range-slider-block">
    <input type="range" id="range-slider" value="0.0" min="0" max="5" step="1" />
  </div>
  
  
</div>




<div id="slider_count">slider value = <span id="sliderStatus">0</span></div>


person StinkyTofu    schedule 10.04.2017    source источник


Ответы (3)


это проблема css у вас есть. в определении цвета фона класса я установил его важным, и он запускается

#range-slider {
  min-height: 100px;
  background-color: grey;
}

.thumb-down {
  background-color: red !important;
}

.thumb-up {
  background-color: blue !important;
}

взгляните на эту рабочую скрипту https://jsfiddle.net/w363w6ke/1/

person TypedSource    schedule 10.04.2017
comment
Я бы не рекомендовал использовать !important, если нет другого пути - person sm1215; 10.04.2017
comment
$("#range-slider").on('mousedown', function(){$('#range-slider').css('background-color', 'red');}); это вариант для вас? - person TypedSource; 11.04.2017
comment
Вы можете сделать это и без использования встроенных стилей. - person sm1215; 11.04.2017
comment
Огромное спасибо. Если у вас есть какие-либо советы, почему imageUrl[0] не отображается по умолчанию при загрузке страницы, мы будем признательны. - person StinkyTofu; 11.04.2017

Как сказал TypedSource, это проблема CSS. Вам просто нужно быть более конкретным в своем селекторе, чтобы ваши стили переопределяли предыдущий цвет фона.

Вы можете сделать это следующим образом:

input[type=range].thumb-down::-webkit-slider-thumb {
  background:blue;
}
input[type=range].thumb-up::-webkit-slider-thumb {
  background:green;  
}
person sm1215    schedule 10.04.2017
comment
Пока что это лучшее решение без особых изменений моего кода. :) //1. Когда пользователь нажимает мышью на Range-Thumb, цвет фона большого пальца меняется на синий. $(#range-slider).on(mousedown, function() { $(this).removeClass().addClass(thumb-down); }); Добавление .removeClass{}. позволяет сбросить его. codepen.io/stinkytofu3311/pen/LWomev - person StinkyTofu; 11.04.2017
comment
Вам также может потребоваться изменить переключатель js, чтобы оба класса не существовали в одном и том же элементе одновременно. Для этого нужно использовать removeClass - person sm1215; 11.04.2017
comment
Спасибо! Знаете ли вы, почему imageUrl[0] не отображается по умолчанию при загрузке страницы? - person StinkyTofu; 11.04.2017

Просто используйте псевдо-селектор :active, чтобы изменить цвет на синий. Вам даже не нужны события мыши.

var imageUrl = new Array(); 

        imageUrl[0] = 'http://svgshare.com/i/1Ak.svg';

        imageUrl[1] = 'http://svgshare.com/i/1AQ.svg';

        imageUrl[2] = 'http://svgshare.com/i/1Bb.svg';

        imageUrl[3] = 'http://svgshare.com/i/1Am.svg';

        imageUrl[4] = 'http://svgshare.com/i/1CG.svg';

        imageUrl[5] = 'http://svgshare.com/i/1By.svg';
       
$(document).on('input change', '#range-slider', function() {//listen to slider changes
    var v=$(this).val();//getting slider val
   $('#sliderStatus').html( $(this).val() );
  $("#img").prop("src", imageUrl[v]);
});
.product-range-wrapper {
  displat: -webkit-flex;
  displat:flex;
  -webkit-flex-direction: column;
  flex-direction:column;
  width:600px;
  margin:0px auto;
  /*outline: 1px solid purple;*/
 }
.product-range-block {
  display: -webkit-flex;
  display:flex;
  -webkit-flex-direction: row;
  flex-direction: row;
  width:100%;
  height:300px;
  /*outline: 1px solid red;*/
}
.ref-height-block {
  flex-grow:3;
  /*background-color:red;*/
}
.size-chart-block {
  flex-grow:9;
  /*background-color:green;*/
}
.product-range-block img {
  width:90%;
  /*outline: 1px solid blue;*/
}
#img {
  width: 100% !important;
}
#slider_count {
  margin:0px auto;
  width:200px;
  padding:20px 20px;
  text-align:center;
  background-color:yellow;
}
/*#range-slider {
  -webkit-appearance: none;
    width: calc(100% - (0px));
    height: 10px;
    border-radius: 5px;
    background: #d7dcdf;
    outline: none;
    padding: 0;
    margin: 0;
}*/

/* ::::::::::::::::::::Range Slider Styles::::::::::::::::::::::::: */
.range-slider-block {
  margin:0px auto;
  width:90%;
  }
#range-slider {
  padding:40px 0px;
  width:100%;
  /*outline: 1px solid green;*/
}
/* Remove Range Sliders Default Styles*/
input[type=range]{
    -webkit-appearance: none;
}
/* Track */
input[type=range]::-webkit-slider-runnable-track {
    height: 10px;
    background: #d7d7d7;
    border: none;
    border-radius: 6px;
}
input[type=range]:focus {
    outline: none;
}
/*input[type=range]:focus::-webkit-slider-runnable-track {
    background: #ccc;
}*/
/* Thumb */
input[type=range]::-webkit-slider-thumb {
    -webkit-appearance: none;
    border: none;
    height: 30px;
    width: 30px;
    border-radius: 50%;
    background: #46947F;
    margin-top: -9px;
    transition: box-shadow 0.5s;
}
input[type=range]:hover::-webkit-slider-thumb {
    box-shadow: 0 0 0 4pt #BEBEBE;
}
input[type=range]::-webkit-slider-thumb:active {
  background:blue;  
}

/*input[type=range]:focus::-webkit-slider-thumb {
    background:#ffffff;
} */
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="product-range-wrapper">
  
  <div class="product-range-block">
    <div class="ref-height-block">
      <img src="http://svgshare.com/i/1Ba.svg" alt="Product Height Refrence" height="" width="">
    </div>
    <div class="size-chart-block">
      <img src="" style='' id='img'/>
    </div>
  </div>
  
  <div class="range-slider-block">
    <input type="range" id="range-slider" value="0.0" min="0" max="5" step="1" />
  </div>
  
  
</div>




<div id="slider_count">slider value = <span id="sliderStatus">0</span></div>

person Robert Wade    schedule 10.04.2017
comment
Я думаю, что это просто меняет цвет фона дорожки ползунков диапазона. Я пытаюсь нацелить ползунок на ту часть, на которую вы нажимаете, и перетащите, чтобы выбрать значение ползунка. - person StinkyTofu; 11.04.2017
comment
Ах, я неправильно понял. Если ваша цель состоит в том, чтобы просто изменить цвет дескриптора, когда он нажат, вам не нужны события мыши, вы можете просто использовать псевдо-селектор :active. Я изменил приведенный выше код, чтобы отразить это. Это гораздо меньше кода и всего 1 строка в вашем css, в отличие от дополнительных классов. - person Robert Wade; 11.04.2017
comment
Спасибо! Будет ли это проще, чем..? input[type=range].thumb-down::-webkit-slider-thumb { background:blue; } input[type=range].thumb-up::-webkit-slider-thumb { background:green; } - person StinkyTofu; 11.04.2017
comment
да, это намного проще, потому что вам не нужно использовать javascript или jquery для добавления и удаления классов. Это чистое решение CSS. У вас есть нормальное состояние, которое зеленое... и ваше активное состояние, которое синее (см. фрагмент кода в этом ответе), и обратите внимание, что javascript больше нет, и все, что я добавил, это новый селектор с с псевдоселектором :active - person Robert Wade; 11.04.2017
comment
Это гениально. :) Я собираюсь опубликовать второй вопрос, но решил спросить. Знаете ли вы, почему изображение [0] не отображается при загрузке страницы по умолчанию? Ползунок загружается с пустым изображением и показывает изображение [0] только после того, как пользователь переместит ползунок диапазона. - person StinkyTofu; 11.04.2017
comment
ваше изображение не имеет атрибута src, заполняемого при загрузке страницы. Пусто. src="". Вы заполняете его javascript только после того, как происходят события. - person Robert Wade; 11.04.2017
comment
Спасибо. Теперь это кажется очевидным. га - person StinkyTofu; 11.04.2017
comment
Это лучшее решение - person sm1215; 11.04.2017