Автор: Stasyuk Eugene 176 Метки: , 30.06.2022

В этой статье я покажу как сделать визуальную часть звездного рейтинга. А именно:

  • как можно стилизовать
  • как правильно сделать hover
  • как правильно сохранить заливку звезды после клика

Готовый вариант:

Разметка

В качестве разметки у нас есть блок контейнер с классом .rate внутри которого я разместил 5 ссылок. В качестве звезды я использовал шрифт. Но скорее всего на практике вместо него придется использовать изображение.

<div class="rate">
  <a href="#">☆</a>
  <a href="#">☆</a>
  <a href="#">☆</a>
  <a href="#">☆</a>
  <a href="#">☆</a>
</div>

Стили

При стилизации стоит обратить внимание на следующее:

  • чтобы каждая ссылка имела position: relative;
.rate a{
  text-decoration: none;
  color: yellow;
  position: relative;
  display: inline-block;
}
  • Создаем псевдоэлемент :before. Мы будем его использовать в качестве заполнителя звезды. В дефолтном состоянии присваиваем ему opacity: 0;
.rate a:before{
  content: '★';
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  pointer-event: none;
  opacity: 0;
}
  • при ховере мы будем присваивать ссылке класс .hover, а при клике на нее — класс .active. Эти классы будут делать наш псевдоэлемент видимым. Поэтому данный момент мы тоже прописываем в стилях.
.rate a.hover:before,
.rate a.active:before{
  opacity: 1;
}

Скрипт

В скрипте собираем наши звезды на странице и для каждой из них прописываем добавление или удаление соответствующего класса при наведении или при нажатии

let rateLink = document.querySelectorAll('.rate a');

rateLink.forEach((link, i) => {
  //mouseenter
  link.addEventListener('mouseenter', function(e){
    let num = 0;

    while(num <= i){
      rateLink[num].classList.add('hover');

      num++;
    }
  });
  
  //mouseleave
  link.addEventListener('mouseleave', function(e){
    rateLink.forEach(item => {
      item.classList.remove('hover');
    });
  });
  
  //click
  link.addEventListener('click', function(e){
    e.preventDefault();

    let num = 0;

    rateLink.forEach(item => {
      item.classList.remove('active');
    });

    while(num <= i){
      rateLink[num].classList.add('active');

      num++;
    }
  });

});

Другие статьи

Всплывающее окно на сайте (попап, модальное окно) pop-up window

Всплывающее окно на сайте (попап, модальное окно)

Всплывающее окно на сайте (попап, модальное окно)

Когда я только осваивал азы разработки, всплывающее окно я делал вручную. Да, да — вместо того, чтобы найти какое-то готовое решение, я занимался этим неблагодарным делом 🤪. Мне казалось, что особо ничего сложного в этом нет. Но, только спустя какое-то время работы над данным вопросом, я начал осознавать, что сделать это не так уж и […]

Как вытянуть содержимое svg из тега img? Вариант 2 svg

Как вытянуть содержимое svg из тега img? Вариант 2

Как вытянуть содержимое svg из тега img? Вариант 2

Если мы используем php в разработке, то вытянуть содержимое svg из картинки становиться проще простого. Для этого нам достаточно иметь путь к картинке. В данном деле к нам на помощь приходит функция file_get_contents() . Более подробно про нее можно прочитать здесь. Примерно использование данной функции будет выглядеть так: Здесь нужно обратить внимание на два момента: […]