Преобразование дочернего элемента при наведении курсора с помощью Javascript

Я пытаюсь создать значок, который переключает класс при зависании родительского div. Пока вот мой код:

var actionIcon = document.querySelector(".task > svg")
var taskContainer = document.querySelector(".task")

function iconScale() {
  actionIcon.classList.toggle('big');
}

taskContainer.onmouseenter = iconScale
taskContainer.onmouseleave = iconScale

И HTML:

<div class = "task">
  <h3>Title</h3>
  <svg viewBox = "0 0 24 24">
    <path d = "..." />
  </svg>
</div>

Моя проблема в том, что эффект, которого я пытаюсь достичь, происходит только с самым первым родительским элементом, а не с другими. Я почти уверен, что не уточняю что-то, но не знаю что. Кто-нибудь может мне намекнуть?

Можете ли вы опубликовать сопроводительный HTML-код. Вы использовали консоль, чтобы проверить, есть ли у вас объект (т.е. работает ли querySelector?). Также правильно ли выполняется код после загрузки DOM?

Bibberty 02.01.2019 01:42

Ой, извини. Пропустил. Их несколько?

Bibberty 02.01.2019 01:54

Ага, вот где я застрял.

Moromain 02.01.2019 01:56

Фиксированный ответ. Должен работать на вас сейчас. (пожалуйста, проголосуйте за.)

Bibberty 02.01.2019 01:59

не нужно использовать JS и .big { -> достаточно .task:hover svg { background-color: blue; }

Mister Jojo 02.01.2019 02:05
Поведение ключевого слова "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) для оценки ваших знаний,...
0
6
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Фиксированный код для сопоставления со ВСЕМИ div, которые являются задачами. Невозможно использовать querySelector, поскольку он возвращает только первый экземпляр.

const actionIcon = (parent) => {
  return parent.querySelector('svg');
};

document.addEventListener('DOMContentLoaded', function() {

  // Add events to ALL divs that conform
  let tasks = document.getElementsByClassName('task');
  
  for(let t of tasks) {
    t.onmouseenter = iconScale;
    t.onmouseleave = iconScale;
  }

  function iconScale(event) {
    let icon = actionIcon(event.target);
    icon.classList.toggle('big');
  }
});
svg {
  height: 50px;
  width: 50px;
  background-color: red;
} 

.big {
  background-color: blue;
}
<div class = "task">
  <h3>Title</h3>
  <svg viewBox = "0 0 24 24">
    
  </svg>
</div>
<div class = "task">
  <h3>Title</h3>
  <svg viewBox = "0 0 24 24">
    
  </svg>
</div>
<div class = "task">
  <h3>Title</h3>
  <svg viewBox = "0 0 24 24">
    
  </svg>
</div>
<div class = "task">
  <h3>Title</h3>
  <svg viewBox = "0 0 24 24">
    
  </svg>
</div>

Мой CSS так же прост, как в вашем примере (.big {transform: scale (1.2);}). Я попытался изменить свой код, как вы предложили, но ничего не изменилось ... Он работает только для первого элемента, а не для других. Я не упускаю что-то вроде указания div, когда он зависает ??

Moromain 02.01.2019 01:55

Прекрасно работает! Спасибо большое за вашу помощь :)

Moromain 02.01.2019 02:04

Наиболее желанный. Убедитесь, что вы включили вызов DOMContentLoaded, так как это гарантирует, что ваш контент DOM загружен и готов к привязке событий.

Bibberty 02.01.2019 02:05

у вашей DIV.task один и тот же родитель?

Mister Jojo 02.01.2019 02:08

Обратите внимание, что вы также можете использовать querySelectorAll для получения всех совпадений, а не только первого.

Herohtar 02.01.2019 02:08

Также есть разница между for...in и for...of. Здесь вы должны использовать for...of, потому что for...in также возвращает некоторые дополнительные свойства, к которым вы не должны добавлять .onmouseenter/.onmouseleave.

Herohtar 02.01.2019 02:10

@Herohtar спасибо за подсказку, отредактировал код, чтобы отразить вас на .. комментария. Виноват

Bibberty 02.01.2019 02:14

Вы просили JavaScript, но в качестве альтернативного и более простого примера вам даже не нужно использовать JavaScript; все, что вы хотите, можно сделать полностью в CSS:

svg {
  height: 50px;
  width: 50px;
  background-color: red;
}

.task:hover svg {
  background-color: blue;
}
<div class = "task">
  <h3>Title</h3>
  <svg viewBox = "0 0 24 24">
    
  </svg>
</div>
<div class = "task">
  <h3>Title</h3>
  <svg viewBox = "0 0 24 24">
    
  </svg>
</div>
<div class = "task">
  <h3>Title</h3>
  <svg viewBox = "0 0 24 24">
    
  </svg>
</div>
<div class = "task">
  <h3>Title</h3>
  <svg viewBox = "0 0 24 24">
    
  </svg>
</div>

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