Выбрать более грамотный код с точки зрения оптимизации/производительности
Всем счастья и здоровья! Имеются два скрипта, которые делают одно и то же, ⠀⠀⠀ ⠀⠀⠀ ⠀⠀⠀ ⠀ при наведении мыши на блок, меняется цвет текста на красный и сбрасывается.
Но я не могу понять, какой из этих скриптов лучше по оптимизации/производительности. ⠀⠀⠀ Если блоков будет 100 или 200, то какой способ будет лучше, с методом parentNode или с перебором forEach? ⠀Еще мне кажется, что мой метод с parentNode это костыль какой-то =(
// C методом ***parentNode***
let News_Main_Block = document.querySelector('.Сategory_Main_Block');
News_Main_Block.addEventListener('mouseover', function(e){
let parentNode = e.target.parentNode;
if(parentNode.className == 'Сategory_Block_1'){
parentNode.querySelector('.Сategory_name_1').style.color = 'red';
}
});
News_Main_Block.addEventListener('mouseout', function(e){
let parentNode = e.target.parentNode;
if(parentNode.className == 'Сategory_Block_1'){
parentNode.querySelector('.Сategory_name_1').style.color = '';
}
});
// С методом ***forEach***
/*
let News_Main_Block = document.querySelector('.Сategory_Main_Block');
let News_Block = document.querySelectorAll('.Сategory_Block_1');
News_Block.forEach(function (e) {
e.addEventListener('mouseenter', function(e) {
let target = e.target,
name = target.querySelector('.Сategory_name_1');
if(name) {
name.style.color = 'red';
}
});
e.addEventListener('mouseleave', function(e) {
let target = e.target,
name = target.querySelector('.Сategory_name_1');
if(name) {
name.style.color = '';
}
});
});
*/
.Сategory_Main_Block{
padding-top:2vw;
padding-bottom: 2vw;
display: grid;
grid-template-columns: repeat(6, 30%);
column-gap:1vw;
row-gap:3vw;
margin-left:2vw;
}
.Сategory_Block_1{
background:rgba(255, 255, 255, 1);
border-radius: 1.5vw;
box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
margin:0;
display: flex;
flex-direction: column;
align-items: center;
position: relative;
}
.Сategory_name_1{
text-align:center;
flex: 1;
display: flex;
align-items: center;
padding:10px;
font-size:18px;
color:black;
font-family:arial;
}
.Сategory_img_1{
border-top-right-radius: 1.5vw;
border-top-left-radius: 1.5vw;
width:100%;
height:25vw;
}
.Сategory_Link_1{
border-top-right-radius: 1.5vw;
border-top-left-radius: 1.5vw;
width:100%;
height:25vw;
position:absolute;
display:flex;
box-sizing: border-box;
}
<section class="Сategory_Main_Block">
<figure class="Сategory_Block_1">
<a class ="Сategory_Link_1" href="/"><div></div></a>
<img class="Сategory_img_1" src="https://i.ibb.co/ZW3xn2G/5-1.jpg">
<figcaption class="Сategory_name_1">1 ПЕС И ЛИСА</figcaption>
</figure>
<figure class="Сategory_Block_1">
<a class ="Сategory_Link_1" href="/"><div></div></a>
<img class="Сategory_img_1" src="https://i.ibb.co/N9L9rjq/scale-1200.webp">
<figcaption class="Сategory_name_1">2 ВОЛК И ЛАПША</figcaption>
</figure>
<figure class="Сategory_Block_1">
<a class ="Сategory_Link_1" href="/"><div></div></a>
<img class="Сategory_img_1" src="https://i.ibb.co/sHrLCtS/1412772681-kitajskaya-lapsha-v-domashnix-usloviyax.jpg">
<figcaption class="Сategory_name_1">3 КИДО И ХАДО</figcaption>
</figure>
</section>
Ответы (1 шт):
Отталкиваясь от вашего предыдущего вопроса, где вы сказали что суть только в смене цвета, я (как и @Василий Воронцов) настоятельно рекомендую использовать CSS, если вы гонитесь за оптимизацией. Для браузера это будет куда проще обработать.
.Сategory_Main_Block {
padding-top: 2vw;
padding-bottom: 2vw;
display: grid;
grid-template-columns: repeat(6, 30%);
column-gap: 1vw;
row-gap: 3vw;
margin-left: 2vw;
}
.Сategory_Block_1 {
background: rgba(255, 255, 255, 1);
border-radius: 1.5vw;
box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
margin: 0;
display: flex;
flex-direction: column;
align-items: center;
position: relative;
}
.Сategory_name_1 {
text-align: center;
flex: 1;
display: flex;
align-items: center;
padding: 10px;
font-size: 18px;
color: black;
font-family: arial;
}
.Сategory_img_1 {
border-top-right-radius: 1.5vw;
border-top-left-radius: 1.5vw;
width: 100%;
height: 25vw;
}
.Сategory_Link_1 {
border-top-right-radius: 1.5vw;
border-top-left-radius: 1.5vw;
width: 100%;
height: 25vw;
position: absolute;
display: flex;
box-sizing: border-box;
}
/* Меняем цвет текста при наведение на блок */
.Сategory_Block_1:hover .Сategory_name_1 {
color: red;
}
<section class="Сategory_Main_Block">
<figure class="Сategory_Block_1">
<a class="Сategory_Link_1" href="/"><div></div></a>
<img class="Сategory_img_1" src="https://i.ibb.co/ZW3xn2G/5-1.jpg">
<figcaption class="Сategory_name_1">1 ПЕС И ЛИСА</figcaption>
</figure>
<figure class="Сategory_Block_1">
<a class="Сategory_Link_1" href="/"><div></div></a>
<img class="Сategory_img_1" src="https://i.ibb.co/N9L9rjq/scale-1200.webp">
<figcaption class="Сategory_name_1">2 ВОЛК И ЛАПША</figcaption>
</figure>
<figure class="Сategory_Block_1">
<a class="Сategory_Link_1" href="/"><div></div></a>
<img class="Сategory_img_1" src="https://i.ibb.co/sHrLCtS/1412772681-kitajskaya-lapsha-v-domashnix-usloviyax.jpg">
<figcaption class="Сategory_name_1">3 КИДО И ХАДО</figcaption>
</figure>
</section>
Если же всё таки нужен JS, то будем разбираться.
Начну вот с чего. Вы говорите о оптимизации и производительности, но выводить 100-200 блоков с картинками и вложенными элементами - это уже нарушает условия выше.
Обычно, для того, чтобы показать пользователю карточки, их на страницу выводится 10-20 штук и прибегают к таким трюкам как Пагинация (пейджинг), Lazy Load (только для блоков, принцип тот же) или иные варианты.
Основная проблема всё же кроется в юзере, а точнее в его устройстве, средстве просмотра и скорости\доступности интернет соединения. Более мощным устройствам и современным браузерам будет не так "трудно" обработать 100-200 блоков, а быстрому инету загрузить 100-200 картинок с этих блоков, но не стоит забывать о старых устройствах, людях которые сидят на старых версиях браузеров (IE, ней дай бог..), и плохим соединением инета.
Вернёмся к коду.
Ваш вариант не костыльный, такой подход называется "Делегирование событий", я хотел предложить его вам в прошлом вопросе, но не стал нагружать информацией. (и рад, что вы к этому сами пришли).
Но есть проблемы по коду:
Для начала я хочу попросить прочитать статью о делегирование, чтобы понимать принцип работы кода.
e.target.parentNodeлучше заменить наe.target.closest('.Сategory_Block_1')- вложенность может быть разной, а.parentNodeвернёт прямого родителяe.target, в то время как.closest('.Сategory_Block_1')будет искать родителя именно.Сategory_Block_1, если не найдёт то вернётnull.parentNode.className == 'Сategory_Block_1', лучше так не делать.. Добавите новый класс и условие не пройдёт. Я бы советовал использоватьparentNode.classList.contains('Сategory_Block_1')-.classListвернётмассив(кхм, DOMTokenList) классов элемента, а.contains()проверит есть ли совпадение вмассивеDOMTokenList.
let main = document.querySelector('.Сategory_Main_Block');
main.addEventListener('mouseover', function(e) {
let target = e.target.closest('.Сategory_Block_1');
if(target) { // Проверку на класс делать смысла нет
target.querySelector('.Сategory_name_1').style.color = 'red';
}
});
main.addEventListener('mouseout', function(e) {
let target = e.target.closest('.Сategory_Block_1');
if(target) {
target.querySelector('.Сategory_name_1').style.color = '';
}
});
.Сategory_Main_Block {
padding-top: 2vw;
padding-bottom: 2vw;
display: grid;
grid-template-columns: repeat(6, 30%);
column-gap: 1vw;
row-gap: 3vw;
margin-left: 2vw;
}
.Сategory_Block_1 {
background: rgba(255, 255, 255, 1);
border-radius: 1.5vw;
box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
margin: 0;
display: flex;
flex-direction: column;
align-items: center;
position: relative;
}
.Сategory_name_1 {
text-align: center;
flex: 1;
display: flex;
align-items: center;
padding: 10px;
font-size: 18px;
color: black;
font-family: arial;
}
.Сategory_img_1 {
border-top-right-radius: 1.5vw;
border-top-left-radius: 1.5vw;
width: 100%;
height: 25vw;
}
.Сategory_Link_1 {
border-top-right-radius: 1.5vw;
border-top-left-radius: 1.5vw;
width: 100%;
height: 25vw;
position: absolute;
display: flex;
box-sizing: border-box;
}
<section class="Сategory_Main_Block">
<figure class="Сategory_Block_1">
<a class="Сategory_Link_1" href="#"><div></div></a>
<img class="Сategory_img_1" src="//i.ibb.co/ZW3xn2G/5-1.jpg">
<figcaption class="Сategory_name_1">1 ПЕС И ЛИСА</figcaption>
</figure>
<figure class="Сategory_Block_1">
<a class="Сategory_Link_1" href="#"><div></div></a>
<img class="Сategory_img_1" src="//i.ibb.co/N9L9rjq/scale-1200.webp">
<figcaption class="Сategory_name_1">2 ВОЛК И ЛАПША</figcaption>
</figure>
<figure class="Сategory_Block_1">
<a class="Сategory_Link_1" href="#"><div></div></a>
<img class="Сategory_img_1" src="//i.ibb.co/sHrLCtS/1412772681-kitajskaya-lapsha-v-domashnix-usloviyax.jpg">
<figcaption class="Сategory_name_1">3 КИДО И ХАДО</figcaption>
</figure>
</section>