У меня есть небольшой совет на сегодня
Вы когда-нибудь собирали такой компонент?
Прежде чем я узнал о хаке, который я вам покажу,
я хочу рассказать о таком компоненте, который я собрал с помощью JavaScript и переключения классов. Код вы можете найти здесь. Это работало так:
1. добавить обработчик события mouseover на звездах
2. найти индекс наведенной звезды
3. добавить к нему класс gold и все звезды с индекс ниже наведенного
Это сработало, но вам нужно удалить класс золото из всех звезд на mouseout.
Итак, теперь у вас есть два слушателя и есть этот момент мигания, когда для доли секунды все Звезды теряют свое свечение:
Я думаю, что я поднял дело, так что вернемся к моей подсказке.
В CSS есть хороший селектор, который позволяет вам выбирать elem и его братьев и сестер.
Но сначала давайте встроим звезды в HTML:
<!-- html --> <div class="container" id="stars"></div> /* css */ /* not important css */ button { border: none; background: none; padding: 0; cursor: pointer; } svg { transition: fill .1s ease; } /* important css */ .container { display: inline-flex; } // js const container = document.getElementById("stars") const ratings = [5, 4, 3, 2, 1] const deathStar = `<svg xmlns="https://www.w3.org/2000/svg" xmlns:xlink="https://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M2.05,13H21.95C21.45,18.05 17.19,22 12,22C6.82,22 2.55,18.05 2.05,13M21.95,11H2.05C2.55,5.95 6.82,2 12,2C17.18,2 21.45,5.95 21.95,11M12,6.75A2.5,2.5 0 0,0 9.5,4.25A2.5,2.5 0 0,0 7,6.75A2.5,2.5 0 0,0 9.5,9.25A2.5,2.5 0 0,0 12,6.75Z"/></svg>`; function createStar(rating) { const star = document.createElement("button") star.innerHTML = deathStar star.classList = `star star--${rating}` star.title = rating return star } const stars = ratings.map(createStar) stars.forEach(star => container.appendChild(star))
Результат выглядит следующим образом:
Теперь добавим эффект наведения, чтобы изменить заливку SVG и его братьев и сестер:
.star:hover, .star:hover ~ .star { fill: gold; }
Эффект:
Поскольку CSS-селектор ~
для братьев и сестер может «поймать» только следующих братьев и сестер (селектора для предыдущих по-прежнему нет), наши звезды выглядят как выделенные сзади.
Думаю, теперь вы уже догадались, что я вам покажу 😊
Если мы подготовим наши классы CSS, используя порядок гибкости для отображения в обратном направлении:
.star--1 { order: 1; } .star--2 { order: 2; } .star--3 { order: 3; } .star--4 { order: 4; } .star--5 { order: 5; }
Мы получим что-то вроде этого:
У нас есть симпатичный компонент рейтинга смерти ⭐ ✔
Весь код можно найти по этой ссылке codepen.io.
Отказ от ответственности. С этим решением есть небольшая проблема.
Поскольку мы изменили порядок отображения элементов с помощью flex-box, они отображаются на экране в правильном направлении от с 1 по 5.
Хотя в HTML они по-прежнему присутствуют в обратном порядке от 5 до 1.
При переходе с помощью кнопки «Tab» на клавиатуре по элементам сначала фокусируется на последнем элементе (5). Что для меня совсем не плохо.
Это похоже на предложение покупателю поставить оценку выше, а затем ниже 😊
Вот и все, спасибо за чтение💛🐱💻