Изменить класс div, когда выбран родительский элемент

Моя проблема / вопрос на самом деле связана с двумя проблемами, решения которых я не нашел.

Это div в "нормальном" состоянии (без наведения и выбора). Когда пользователь выбирает этот div, он становится фиолетовой рамкой. Моя проблема: Как мне изменить класс значка (этот синий значок), когда выбран родительский элемент?

Нормальное состояние:

Изменить класс div, когда выбран родительский элемент

Состояние наведения (значок) / выбранное состояние (родительский элемент)

Изменить класс div, когда выбран родительский элемент

Другая проблема: все div со значком относятся к одному классу. Я попробовал один код, и он сработал, но также выбраны все div .icon (есть 4 div, когда я выбираю один, он выбирает все div)

Это полный код: https://jsfiddle.net/905hut4v/ (вкладка результатов не будет работать, так как мне нужно скопировать и вставить весь код из проекта, и я думаю, что не могу [из-за NDA]). Я использую Foundation 6, поэтому в SCSS есть ошибка включения.

JS

$(function() {

    $('form[name = "form-jeitos"] .block-jeito').on('click', function() {
        $(this).siblings().removeClass("selected");
        $(this).addClass("selected");
    });

    $('.image-icon').on('click', function() {
        $(this).siblings().toggleClass('selected');
    });

    $('form[name = "form-jeitos"]').on('submit', function(e) {
        e.preventDefault();
        $(this).addClass("hide");
        $('#jeito-title').addClass("hide");
        var checked = $('input:checked', $(this));
        $('#'+checked.val()).siblings().removeClass("is-active");
        $('#'+checked.val()).addClass("is-active");
    });

    $('#jeito-opcoes a.back').on('click', function(e) {
        e.preventDefault();
        $('#jeito-opcoes .is-active').removeClass("is-active");
        $('form[name = "form-jeitos"]').removeClass("hide");
        $('#jeito-title').removeClass("hide");
    });

});

SCSS

.block-jeito {
    border: 2px solid rgba(1, 33, 105, 0.1);
    border-radius: 8px;
    padding: 30px 38px 30px 38px;
    opacity: 1;
    filter: alpha(opacity=1);
    transition: all 0.3s ease-in-out;
    margin-bottom: 60px;
    cursor: pointer;

    .image-icon {
        position: relative;

        .img {
            @include breakpoint(medium) {
                margin-left: -10px;
            }
        }

    }

    .icon {
        position: absolute;
        top: 35%;
        background-color: #1155CC;
        padding: 20px;
        left: 45%;
        border-radius: 50%;
        max-height: 75px;
        transition: all 0.3s ease-in-out;

        &:hover,
        &.selected {
            background-color: #00C7B1;
        }

        @include breakpoint(xsmall) {
            padding: 20px;
            left: 45%;
            top: 35%;
        }

        @include breakpoint(xxsmall) {
            padding: 20px;
            left: 45%;
            top: 35%;
        }

        @include breakpoint(medium) {
            padding: 20px;
            left: 25%;
            top: 45%;
        }

        @include breakpoint(xmedium) {
            padding: 15px;
            left: 55%;
            top: 45%;
        }

        @include breakpoint(large) {
            padding: 10px;
            left: 65%;
            top: 45%;
        }

        @include breakpoint(xlarge) {
            top: 45%;
            left: 55%;
            padding: 15px;
        }
    }

    &:hover,
    &.selected {
        border: 2px solid #5F249F;
    }

    &.hide {
        opacity: 0;
        filter: alpha(opacity=0);
        transition: opacity 0.3s ease-in-out;
    }

    p {
        font-size: 16px;
        line-height: 24px;
        font-weight: 400;

        @include breakpoint(medium) {
            font-size: 24px;
            line-height: 36px;
        }

        strong {
            font-weight: 700;
        }

    }

    img {

        margin-bottom: 50px;

        @include breakpoint(medium) {
            margin-bottom: 0px;
        }

    }

}

HTML

<form name = "form-jeitos">

  <div class = "grid-x grid-margin-x">

    <label id = "codigo-block"
           class = "cell labl small-12 medium-6 block-jeito align-middle">

      <div class = "grid-x grid-margin-x">

        <div class = "cell small-12 large-4 image-icon">
          <img src = "../assets/img/foto-codigo.png" class = "img"
               alt = "Imagem de código e programação, representando a Nordware">
          <div class = "icon">
            <img src = "../assets/img/icon-codigo.png" alt = "">
          </div>
        </div>

        <div class = "cell small-12 large-8">
          <input type = "radio" name = "opcoes" value = "teste-nordware"
                 checked = "checked"/>
          <p><strong>Código e programação</strong> é comigo mesmo!</p>
        </div>

      </div>

    </label>

    <label id = "estrategia-block"
           class = "cell labl small-12 medium-6 block-jeito align-middle">

      <div class = "grid-x grid-margin-x">

        <div class = "image-icon" class = "cell small-12 large-4">
          <img src = "../assets/img/foto-estrategia.png" class = "img"
               alt = "Adoro trabalhar com estratégias, pessoas e processos.">
          <div class = "icon">
            <img src = "../assets/img/icon-estrategia.png" alt = "">
          </div>
        </div>

        <div class = "cell small-12 large-8">
          <input type = "radio" name = "opcoes" value = "teste-proxys"/>
          <p>Adoro trabalhar com <strong>estratégias, pessoas e
            processos.</strong></p>
        </div>

      </div>

    </label>

    <label id = "tecnologia-block"
           class = "cell labl small-12 medium-6 block-jeito align-middle">

      <div class = "grid-x grid-margin-x">

        <div class = "image-icon" class = "cell small-12 large-4">
          <img src = "../assets/img/foto-tecnologia.png" class = "img"
               alt = "Imagem de tecnologia e notebooks, representando a BringII">
          <div class = "icon">
            <img src = "../assets/img/icon-tecnologia.png" alt = "">
          </div>
        </div>

        <div class = "cell small-12 large-8">
          <input type = "radio" name = "opcoes" value = "teste-bringit"/>
          <p>Gosto de novidades, do mundo de <strong>tecnologia e
            notebooks.</strong></p>
        </div>

      </div>

    </label>

    <label id = "mobilidade-block"
           class = "cell labl small-12 medium-6 block-jeito align-middle">

      <div class = "grid-x grid-margin-x">

        <div class = "image-icon" class = "cell small-12 large-4">
          <img src = "../assets/img/foto-mobilidade.png" class = "img"
               alt = "Imagem de tecnologia e notebooks, representando a BringII">
          <div class = "icon">
            <img src = "../assets/img/icon-mobilidade.png" alt = "">
          </div>
        </div>

        <div class = "cell small-12 large-8">
          <input type = "radio" name = "opcoes" value = "teste-mobiz"/>
          <p>Seja carro, moto ou bike, eu curto é <strong>mobilidade.</strong>
          </p>
        </div>

      </div>

    </label>

    <div class = "cell small-12">

      <button type = "submit" class = "button">Conferir Resultados</button>

    </div>

</form>

Кстати, если вам интересно, почему в javascript есть еще две функции: когда пользователь выбирает div и нажимает кнопку отправки, мы «перенаправляем» пользователя на другую страницу (на самом деле мы просто отображаем div).

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
38
2

Ответы 2

Вы можете выполнить переключение изображений значков при фокусе родительского div с помощью селекторов CSS, без использования JavaScript.

Минимальный пример:

.outer {
  width: 50vw;
  padding: 2rem;
  border: 2px solid gray;
}

.outer .nofocus {
  display: inline;
}

.outer .focus {
  display: none;
}

.outer:focus .nofocus {
  display: none;
}

.outer:focus .focus {
  display: inline;
}
<p>Click inside the box:</p>
<div class = "outer" tabindex = "0">
  <div class = "icon">
    <img class = "nofocus" src = "https://i.picsum.photos/id/841/60/60.jpg?hmac=O4KlxA1-OGoNAFLLbula_vD6LrmU4H-l-yD5kkXpmLI">
    <img class = "focus" src = "https://i.picsum.photos/id/453/60/60.jpg?hmac=prDxZwonQi-meeXg_btjnTrjJKw5Crr85tpKIiCP_6E">
  </div>
</div>

Привет @terrymorse, спасибо за помощь! На самом деле я решил это с помощью старшего сотрудника компании :) Я оставил свой ответ непроверенным, так как ваш ответ тоже помог :)

Yeltsin Lima 30.03.2021 22:43

Я не решал эту проблему сам, мне на самом деле помогал старший пользовательский интерфейс.

Он сказал, что это было: JS помещал selected в оба div (в основном div, а также в дочернем div).

Так что проблема была не в JS, а в CSS!

Вот как мы решили:

&:hover,
&.selected {
  border: 2px solid #5F249F;
    
  .icon {
    background-color: #00C7B1;
  }
}

Другие вопросы по теме