Показать сообщение отдельно
  #1 (permalink)  
Старый 05.08.2019, 15:17
Новичок на форуме
Отправить личное сообщение для hostias Посмотреть профиль Найти все сообщения от hostias
 
Регистрация: 29.02.2016
Сообщений: 2

Рейтинг 5 звезд несколько блоков без jQuery
Есть код, на рейтинг, все рабочее но нужен рефакторинг, - упростить и сократить js. Чтобы работали все блоки приходится писать 4 функции и менять только 1 переменную внутри них, кто может помочь оптимизоровать и сократить до 1 функции с перебором или любым другим методом?
Благодарю за любые комментарии)

<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
.rating{
box-sizing: border-box;
display: flex;
flex-direction: row-reverse;
justify-content: space-between;
width: 166px;
margin: 37px 0 0 0;
position: relative;}

.rating-item {
transition: 0.3s linear;
width: 21px;
height: 20px;
background: black;
cursor: pointer;}

.rating-item.active, .rating-item.active ~ *, .rating-item:hover, .rating-item:hover ~ *
{background: #1c9fe7;}

  </style>

  <script>
document.addEventListener('click', ({target}) => {
    if(target = target.closest('.rating-item')) {
        const parent = target.parentNode,
              activeElem = parent.querySelector('.active');
        if(activeElem) activeElem.classList.remove('active');
        target.classList.add('active');
    }
})
  </script>
</head>

<body>
<div class="rating">
<div class="rating-item" data-rate-ps="1"></div>
<div class="rating-item" data-rate-ps="2"></div>
<div class="rating-item" data-rate-ps="3"></div>
<div class="rating-item" data-rate-ps="4"></div>
<div class="rating-item" data-rate-ps="5"></div>
</div>
<div class="rating">
<div class="rating-item" data-rate-ps="1"></div>
<div class="rating-item" data-rate-ps="2"></div>
<div class="rating-item" data-rate-ps="3"></div>
<div class="rating-item" data-rate-ps="4"></div>
<div class="rating-item" data-rate-ps="5"></div>
</div>
<div class="rating">
<div class="rating-item" data-rate-ps="1"></div>
<div class="rating-item" data-rate-ps="2"></div>
<div class="rating-item" data-rate-ps="3"></div>
<div class="rating-item" data-rate-ps="4"></div>
<div class="rating-item" data-rate-ps="5"></div>
</div>
<div class="rating">
<div class="rating-item" data-rate-ps="1"></div>
<div class="rating-item" data-rate-ps="2"></div>
<div class="rating-item" data-rate-ps="3"></div>
<div class="rating-item" data-rate-ps="4"></div>
<div class="rating-item" data-rate-ps="5"></div>
</div>

</body>
</html>




(function(){
	var container = document.querySelector('.rating1');
	var items = container.querySelectorAll('.rating-item')
	container.onclick = function(e) {
		if( ! e.target.classList.contains('active') ){
			items.forEach(function(item){
				item.classList.remove('active');
			});
			e.target.classList.add('active');
		}
	}
})();
(function(){
	var container = document.querySelector('.rating2');
	var items = container.querySelectorAll('.rating-item')
	container.onclick = function(e) {
		if( ! e.target.classList.contains('active') ){
			items.forEach(function(item){
				item.classList.remove('active');
			});
			e.target.classList.add('active');
		}
	}
})();
(function(){
	var container = document.querySelector('.rating3');
	var items = container.querySelectorAll('.rating-item')
	container.onclick = function(e) {
		if( ! e.target.classList.contains('active') ){
			items.forEach(function(item){
				item.classList.remove('active');
			});
			e.target.classList.add('active');
		}
	}
})();
(function(){
	var container = document.querySelector('.rating4');
	var items = container.querySelectorAll('.rating-item')
	container.onclick = function(e) {
		if( ! e.target.classList.contains('active') ){
			items.forEach(function(item){
				item.classList.remove('active');
			});
			e.target.classList.add('active');
		}
	}
})();

Последний раз редактировалось hostias, 05.08.2019 в 18:11.
Ответить с цитированием