Переключатель для отключения и включения ссылок

#javascript #html #css

#javascript #HTML #css

Вопрос:

В приведенном ниже коде я закодировал переключатель, который отключает и включает мои ссылки с помощью CSS. Проблема в том, что мой переключатель не меняет свой внешний вид. Он выполняет свою работу (функциональность JavaScript работает), но внешний вид — нет. У меня нет большого опыта с

Кнопка HTML:

                 <label class="switch" isValue="0">
                    <div class="slider round">
                    </div>
                </label>
  

CSS:

 .slider:before {
    position: absolute;
    content: "";
    height: 26px;
    width: 26px;
    left: 4px;
    bottom: 4px;
    background-color: white;
    transition: .4s;
}

input[type="checkbox"]:checked   input[type="hidden"]   .slider,
input[type="checkbox"]:checked   .slider {
    background-color: #2196F3;
}

input[type="checkbox"]:focus   input[type="hidden"]   .slider,
input[type="checkbox"]:focus   .slider {
    box-shadow: 0 0 1px #2196F3;
}

input[type="checkbox"]:checked   input[type="hidden"]   .slider:before,
input[type="checkbox"]:checked   .slider:before {
    transform: translateX(26px);
}

 Rounded sliders 
.slider.round {
    border-radius: 34px;
}

    .slider.round:before {
        border-radius: 50%;
    }

.dim.disabled {
    pointer-events: none;
    background-color: grey;
}
  

JavaScript:

    $(document).on('click', '.switch', function () {
        var v = $(".switch").attr("isValue");
        if (v == 1) {
            $(".switch").attr("isValue", "0");
            $(".dim").removeClass("disabled");
        }
        else {
            $(".switch").attr("isValue", "1");
            $(".dim").addClass("disabled");
        }
    });
  

Я знаю, что с этим что-то не так, потому что это флажок типа ввода.

Спасибо за любую помощь, которую вы можете предоставить.

Комментарии:

1. ваш css неверен. / * Закругленные ползунки * / я полагаю?. и ваш HTML не показывает никаких входных данных, поэтому я могу воспроизвести для четкого тестирования — И я не думаю, что это хорошая идея — помещать DIV внутри метки

2. ему не нужно показывать какие-либо входные данные, это просто переключатель, который включает / отключает ссылку. что мне нужно, так это заставить внешний вид работать, когда я привязываю его к своему JS

Ответ №1:

Хорошо, игнорируя предлагаемый код, который слишком расплывчатый, вот как работает переключение класса jQuery:

 $(".switch").on('click', function () {
  $(this)
    .toggleClass('disabled')
    .data('status', ($(this).hasClass("disabled")? '0':'1'));
    
  console.clear();
  console.log('data-status value is :', $(this).data('status') );
});  
 .switch > span {
  display: block;
  width: 68px;
  height: 68px;
  background-color: green;
  border-radius: 34px;
}

.switch.disabled > span  {
  background-color: grey;
}  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="switch" data-status="1"><span></span></div>  

Комментарии:

1. Четкое, лаконичное решение. Я бы добавил в комментарии или в в JavaScript, просто чтобы убедиться, что OP знает, как это работает.

Ответ №2:

Используя только CSS, если вы хотели пойти этим путем. Подумал, что это может быть полезно, поскольку вы говорите, что Javascript работает, но внешний вид не изменится.

Базовый переключатель

 /** Format Example Body **/

body {
  margin: 0;
  padding: 0;
  background: #f0f0f0;
}

* {
  box-sizing: border-box;
}

.container {
  max-width: 500px;
  margin: 0 auto;
  background: #fff;
}

.components {
  padding: 20px;
}

.components .content {
  margin-bottom: 20px;
}

.default {
  margin: 0 5px;
}

.switch {
  display: inline-block;
}

.switch input {
  display: none;
}

.switch small {
  display: inline-block;
  width: 100px;
  height: 18px;
  background: #3a3a3a;
  border-radius: 5px;
  position: relative;
  cursor: pointer;
}

.switch small:after {
  content: "No";
  position: absolute;
  color: #fff;
  font-size: 11px;
  font-weight: 600;
  width: 100%;
  text-align: right;
  padding: 0 6px;
  box-sizing: border-box;
  line-height: 18px;
}

.switch small:before {
  content: "";
  position: absolute;
  width: 12px;
  height: 12px;
  background: #fff;
  border-radius: 50%;
  top: 3px;
  left: 3px;
  transition: .3s;
  box-shadow: -3px 0 3px rgba(0, 0, 0, 0.1);
}

.switch input:checked~small {
  background: #3fc55c;
  transition: .3s;
}

.switch input:checked~small:before {
  transform: translate(25px, 0px);
  transition: .3s;
}

.switch input:checked~small:after {
  content: "Yes";
  text-align: left;
}  
 <div class="container">
  <div class="components">
    <div class="content">
      <label class="switch default">
                <input type="checkbox">
                <small></small>
            </label>
    </div>
  </div>
</div>  

Комментарии:

1. мой переключатель на самом деле работает, но когда я привязываю его к своему javascript, он работает, но внешний вид не

2. Я предлагаю сначала тщательно сформулировать вопрос, чтобы мы не отвечали, а затем вы отредактировали свой вопрос.

Ответ №3:

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

Стиль

 .link_enabled {
    /* style for enabled link */
}
.link_disabled {
    /* style for disabled link */
}
  

скрипт

 $(document).on('click', '.switch', function () {
    var v = $(".switch").attr("isValue");
    if (v == 1) {
        $(".switch").attr("isValue", "0");
        $(".switch").removeClass("link_enabled").addClass("link_disabled");
        $(".dim").removeClass("disabled");
    }
    else {
        $(".switch").attr("isValue", "1");
        $(".switch").removeClass("link_disabled").addClass("link_enabled");
        $(".dim").addClass("disabled ");
    }
});
  

Комментарии:

1. css для включен / отключен, да, у меня уже есть проблема в том, что когда я нажимаю на переключатель, он активирует мой css для отключения ссылок, но сам переключатель не меняет внешний вид

Ответ №4:

Для справки, пожалуйста, обратите внимание, что в JS (es6) это проще. И поскольку тема упоминает только javascript (не jQuery) в списке тегов.

 document.querySelector('.switch').onclick = function(e) {
  this.dataset.status = this.classList.toggle('disabled')?'0':'1';

  console.clear();
  console.log('data-status value is :', this.dataset.status );
}  
 .switch>span {
  display: block;
  width: 68px;
  height: 68px;
  background-color: green;
  border-radius: 34px;
}

.switch.disabled>span {
  background-color: grey;
}  
 <div class="switch" data-status="1" ><span></span></div>