Нужно сделать голосование для фотографии с непонятной мне концепцией
Нужно разместить в документе в вертикальный ряд несколько фотографии. Каждой фотографии сопоставить ссылки + и - имитируя голосования за нее. Сбоку от фотографии отображать прямоугольник, длина которого должна быть пропорциональна поданному за фотографию кол-ву голосов (справа - для положительного рейтинга, слева - для отрицательного)
Помогите пожалуйста((
Не очень понимаю, как сделать такое голосование
Ответы (1 шт):
Автор решения: UModeL
→ Ссылка
Для понимания концепции:
document.querySelector('.set').addEventListener('click', function(ev) {
let target = ev.target;
if (target.tagName !== 'BUTTON') return;
let meter = target.closest('.rate').querySelector('.meter');
let voteUp = parseInt(meter.dataset.up) || 0;
let voteDown = parseInt(meter.dataset.down) || 0;
if (target.classList.contains('up')) {
meter.dataset.up = ++voteUp;
} else {
meter.dataset.down = ++voteDown;
}
meter.textContent = `${voteUp} • ${voteDown}`;
meter.style.setProperty('--vote', `${(voteUp / (voteUp + voteDown)) * 100}%`);
});
.set {
display: flex;
flex-flow: column nowrap;
gap: 1em;
width: 100%;
}
.item {
display: flex;
flex-flow: row wrap;
gap: 1em;
}
img {
display: block;
width: 45%;
aspect-ratio: 16 / 9;
object-fit: cover;
}
.rate {
display: flex;
flex-flow: column nowrap;
justify-content: center;
gap: 1em;
width: 45%;
}
.meter {
display: flex;
flex-flow: row nowrap;
justify-content: center;
align-items: center;
height: 1.5em;
width: 100%;
border-radius: 1000px;
color: #fff;
background-color: #fff;
background-image: linear-gradient(#090 0 0), linear-gradient(#e91b0c 0 0);
background-position: left 50%, right 50%;
background-repeat: no-repeat;
background-size: calc(var(--vote, 50%)) 100%, calc(100% - var(--vote, 50%)) 100%;
text-shadow: 0 1px 1px #000;
box-shadow: 0 0 1px 1px #ccc;
transition: 0.5s ease-in-out;
}
.meter:not([data-up]):not([data-down]) { background-size: 0 0; }
.votes {
display: flex;
flex-flow: row nowrap;
justify-content: center;
align-items: center;
gap: 1em;
}
.votes > button {
display: flex;
flex-flow: row nowrap;
justify-content: space-around;
align-items: center;
gap: 1em;
padding: 0.25em;
border: none;
border-radius: 1000px;
font: 28px/1em monospace;
box-shadow: inset 0 0 2px #0008, 0 0 1px 1px #0008;
cursor: pointer;
}
.votes > button:hover::before { mix-blend-mode: color-burn; }
.up::before { content: '\1F44D'; color: #090; }
.down::before { content: '\1F44E'; color: #e91b0c;
}
<div class="set">
<div class="item">
<img src="https://i.stack.imgur.com/MraLT.jpg" alt="red wall">
<div class="rate">
<div class="meter">0</div>
<div class="votes">
<button class="up"></button>
<button class="down"></button>
</div>
</div>
</div>
<div class="item">
<img src="https://i.stack.imgur.com/VxVNC.jpg" alt="yellow flower">
<div class="rate">
<div class="meter">0</div>
<div class="votes">
<button class="up"></button>
<button class="down"></button>
</div>
</div>
</div>
<div class="item">
<img src="https://i.stack.imgur.com/A9VLC.jpg" alt="green forest">
<div class="rate">
<div class="meter">0</div>
<div class="votes">
<button class="up"></button>
<button class="down"></button>
</div>
</div>
</div>
<div class="item">
<img src="https://i.stack.imgur.com/oYG0R.jpg" alt="blue rose">
<div class="rate">
<div class="meter">0</div>
<div class="votes">
<button class="up"></button>
<button class="down"></button>
</div>
</div>
</div>
</div>