Как реализовать данный эффект?
Ответы (1 шт):
Автор решения: ΝNL993
→ Ссылка
Лично мне это напомнило индикатор урона нанесённого врагу ?♂️
class DamageIndicator {
static createIndicator(damage) {
const indicator = document.createElement('div')
indicator.className = 'indicator'
indicator.textContent = String(damage)
return indicator
}
static getSimilarNum(num) {
return Math.random() * 10 * (Math.random() > 0.5 ? 1 : -1) + num
}
static initIndicator(indicator, x, y) {
x = this.getSimilarNum(x)
y = this.getSimilarNum(y)
document.body.appendChild(indicator)
indicator.style.left = String(x) + 'px'
indicator.style.top = String(y) + 'px'
indicator.style.opacity = '1'
;(function anim() {
const opacity = Number(indicator.style.opacity) - 0.025
indicator.style.left = String(x) + 'px'
indicator.style.top = String(y) + 'px'
indicator.style.opacity = String(opacity)
if (opacity > 0) {
requestAnimationFrame(anim)
y += -1
} else {
return indicator.remove()
}
})()
}
}
const box = document.querySelector('.box')
box.addEventListener('click', ev => {
const { pageX, pageY } = ev
const indicator = DamageIndicator.createIndicator(9)
DamageIndicator.initIndicator(indicator, pageX, pageY)
})
@import url(//fonts.googleapis.com/css?family=Rubik+Mono+One);
body {
background-color: rgb(11, 12, 14);
}
.box {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
background-color: red;
width: 100px;
height: 100px;
}
.indicator {
color: rgb(255, 255, 255);
position: absolute;
font-family: 'Rubik Mono One', 'Segoe UI', Arial, sans-serif;
pointer-events: none;
}
<div class="box"></div>
createIndicator
В этой функции ничего такого, базовое создание элемента.
getSimilarNum
Эта функция возвращает число, которое очень близко к числу введённому в аргументы. Math.random() * 10 - число между 0 и 10. Далее это число умножается либо на -1, либо на 1 (то-есть остаётся как есть), шансы 50 на 50 и это всё плюсуется к введённому числу.
initIndicator
Эта функция потихоньку поднимает элемент наверх и делает его более прозрачным, как только элемент становится полностью невидимым, функция удаляет элемент из DOM и прекращает анимацию.
