Помогите правильно перехватить событие
Здравствуйте, коллеги! :-)
Помогите пожалуйста с перехватом события там где нужно. Есть карточки. Нужно навел на карточку курсор (mouseover), - появилась тень, убрал курсор, - пропала тень. 1. Я реализовал путем навешивания двух addEventListener на один элемент двух функций. Можно ли попроще? 2. Внутри карточки есть ребенок <p>, - при наведении точно на него, событие не происходит. Как сделать так, чтобы addEventListener навесить на родителя <ul> и отлавливать события только на карточках <li>, игнорируя внутренние <p>? Спасибо!
<nav class="main__menu">
<ul class="main__menu__list">
<li class="main__menu__list__item js__button">
<p clas="main__menu__content">I am</p>
</li>
<li class="main__menu__list__item js__button">
<p clas="main__menu__content">I have</p>
</li>
<li class="main__menu__list__item js__button">
<p clas="main__menu__content">I know</p>
</li>
<li class="main__menu__list__item js__button">
<p clas="main__menu__content">I want</p>
</li>
<li class="main__menu__list__item js__button">
<p clas="main__menu__content">I dream</p>
</li>
<li class="main__menu__list__item js__button">
<p clas="main__menu__content">Lorem</p>
</li>
<li class="main__menu__list__item js__button">
<p clas="main__menu__content">Lorem</p>
</li>
<li class="main__menu__list__item js__button">
<p clas="main__menu__content">Lorem</p>
</li>
<li class="main__menu__list__item js__button">
<p clas="main__menu__content">Lorem</p>
</li>
</ul>
</nav>
.main__menu__list {
display: flex;
flex-wrap: wrap;
justify-content: space-evenly;
}
.main__menu__list__item {
width: 100px;
height: 100px;
list-style-type: none;
font-weight: bolder;
font-family: Tahoma;
border-radius: 20px;
-webkit-border-radius: 20px;
-moz-border-radius: 20px;
-ms-border-radius: 20px;
-o-border-radius: 20px;
background-color: #69B8E7;
text-transform: uppercase;
color: white;
font-size: 1em;
text-shadow: 2px 2px blue;
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 0.3rem;
cursor: pointer;
/* box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5); */
transition: 0.5s;
-webkit-transition: 0.5s;
-moz-transition: 0.5s;
-ms-transition: 0.5s;
-o-transition: 0.5s;
}
.test {
box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5);
}
'use strict';
const button = document.querySelectorAll ('.js__button');
function createColor () {
const R = Math.random () * 256;
const G = Math.random () * 256;
const B = Math.random () * 256;
return `rgb(${R},${G},${B})`;
}
function createArr (arr) {
const colorArr = [
createColor (),
createColor (),
createColor (),
createColor (),
createColor (),
createColor (),
createColor (),
createColor (),
createColor (),
];
colorArr.forEach (function (item, i) {
arr[i].style.backgroundColor = item;
});
}
createArr (button);
const clickButton = document.querySelector ('.main__menu__list');
clickButton.addEventListener ('mouseover', handler1);
function handler1 (event) {
const target = event.target;
if (target.nodeName !== 'LI') return;
target.classList.add ('test');
// target.classList.remove('test');
console.log (target);
}
clickButton.addEventListener ('mouseout', handler2);
function handler2 (event) {
const target = event.target;
if (target.nodeName !== 'LI') return;
// target.classList.add('test');
target.classList.remove ('test');
console.log (target);
}
|
А на css это не сделать? Почему?
|
Цитата:
|
Может там событие клик будет висеть, я не знаю точно. Я хочу понять вот что: можно ли поймать событие на исключительно <li>(на промежуточном элементе), чтобы при наведении на <p> оно не пропадало, тем не менее <p> чтобы продолжало быть ребенком <li>.
<ul> <li> <p></p> </li> </ul> |
AndriiS,
css лучше, но если хочется погорячее ...
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
.main__menu__list {
display: flex;
flex-wrap: wrap;
justify-content: space-evenly;
}
.main__menu__list__item {
width: 100px;
height: 100px;
list-style-type: none;
font-weight: bolder;
font-family: Tahoma;
border-radius: 20px;
-webkit-border-radius: 20px;
-moz-border-radius: 20px;
-ms-border-radius: 20px;
-o-border-radius: 20px;
background-color: #69B8E7;
text-transform: uppercase;
color: white;
font-size: 1em;
text-shadow: 2px 2px blue;
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 0.3rem;
cursor: pointer;
/* box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5); */
transition: 0.5s;
-webkit-transition: 0.5s;
-moz-transition: 0.5s;
-ms-transition: 0.5s;
-o-transition: 0.5s;
}
.test {
box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5);
}
</style>
</head>
<body>
<nav class="main__menu">
<ul class="main__menu__list">
<li class="main__menu__list__item js__button">
<p clas="main__menu__content">I am</p>
</li>
<li class="main__menu__list__item js__button">
<p clas="main__menu__content">I have</p>
</li>
<li class="main__menu__list__item js__button">
<p clas="main__menu__content">I know</p>
</li>
<li class="main__menu__list__item js__button">
<p clas="main__menu__content">I want</p>
</li>
<li class="main__menu__list__item js__button">
<p clas="main__menu__content">I dream</p>
</li>
<li class="main__menu__list__item js__button">
<p clas="main__menu__content">Lorem</p>
</li>
<li class="main__menu__list__item js__button">
<p clas="main__menu__content">Lorem</p>
</li>
<li class="main__menu__list__item js__button">
<p clas="main__menu__content">Lorem</p>
</li>
<li class="main__menu__list__item js__button">
<p clas="main__menu__content">Lorem</p>
</li>
</ul>
</nav>
<script>
'use strict';
const button = document.querySelectorAll ('.js__button');
function createColor () {
const R = Math.random () * 256|0;
const G = Math.random () * 256|0;
const B = Math.random () * 256|0;
return `rgb(${R},${G},${B})`;
}
function createArr (arr) {
arr.forEach (function (item, i) {
item.style.backgroundColor = createColor();
});
}
createArr (button);
const clickButton = document.querySelector ('.main__menu__list');
clickButton.addEventListener ('mouseover', handler1);
let temp;
function handler1 (event) {
const target = event.target;
if (target.nodeName == 'LI'&& temp !== target){
handler2();
temp = target;
target.classList.add ('test');
}
}
clickButton.addEventListener ('mouseleave', handler2);
function handler2 () {
let target = clickButton.querySelector('.test');
target && target.classList.remove('test');
temp = null;
}
</script>
</body>
</html>
|
| Часовой пояс GMT +3, время: 19:39. |