Я использую анимацию по ключевым кадрам, чтобы сделать увеличивающийся круг в 1 пиксель прозрачным. Но граница div увеличивается с шириной и высотой. Есть ли способ сделать круг с неувеличивающейся границей?
$(document).on({
click: function (e) {
var d = document.createElement('div');
d.className = 'clickEffect';
d.style.width = '1px';
d.style.height = '1px';
d.style.top = `${e.clientY}px`;
d.style.left = `${e.clientX}px`;
document.body.appendChild(d);
d.addEventListener('animationend', (() => {
d.parentElement.removeChild(d);
}).bind(this));
}
});div.clickEffect {
position: fixed;
border:1px solid #000;
border-radius: 50%;
z-index: 99999;
animation: clickEffect 1s ease-out;
}
@keyframes clickEffect {
0% {
opacity: 1;
}
100% {
opacity: 0.5;
transform: scale(20);
}
}<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
</body>
</html>Для меня важна производительность. Есть ли способ добиться такого эффекта только масштабом ??
Нет, только масштабом добиться этого не удастся.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Анимируйте ширину и высоту вместо масштаба.
$(document).on({
click: function(e) {
var d = document.createElement('div');
d.className = 'clickEffect';
d.style.width = '1px';
d.style.height = '1px';
d.style.top = `${e.clientY}px`;
d.style.left = `${e.clientX}px`;
document.body.appendChild(d);
d.addEventListener('animationend', (() => {
d.parentElement.removeChild(d);
}).bind(this));
}
});div.clickEffect {
position: fixed;
border: 1px solid #000;
border-radius: 50%;
z-index: 99999;
transform: translate(-50%,-50%);
animation: clickEffect 1s ease-out;
}
@keyframes clickEffect {
0% {
opacity: 1;
}
100% {
opacity: 0.5;
//transform: scale(20);
width: 20px;
height: 20px;
}
}<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>У вашего решения проблемы с производительностью - анимация ширины и высоты работает медленнее, чем масштаб
Вы должны анимировать высоту и ширину вместо масштаба.
И чтобы он оставался в центре, вы должны перевести X и Y
Итак, код будет выглядеть так:
$(document).on({
click: function (e) {
var d = document.createElement('div');
d.className = 'clickEffect';
d.style.width = '1px';
d.style.height = '1px';
d.style.top = `${e.clientY}px`;
d.style.left = `${e.clientX}px`;
document.body.appendChild(d);
d.addEventListener('animationend', (() => {
d.parentElement.removeChild(d);
}).bind(this));
}
});div.clickEffect {
position: fixed;
border:1px solid #000;
border-radius: 50%;
z-index: 99999;
animation: clickEffect 0.5s ease-out;
}
@keyframes clickEffect {
0% {
opacity: 1;
}
100% {
opacity: 0.5;
transform: translateX(-20px) translateY(-20px);
width: 40px;
height: 40px;
}
}<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
</body>
</html>У вашего решения проблемы с производительностью - анимация ширины и высоты работает медленнее, чем масштаб
Да, но с помощью scale () вы не можете масштабировать высоту и ширину без масштабирования размера границы.
Вот еще одна идея, которая полагается на перевод и перспективу для достижения эффекта масштаба, сохраняя ту же границу.
$(document).on({
click: function (e) {
var d = document.createElement('div');
d.className = 'clickEffect';
d.style.top = `${e.clientY}px`;
d.style.left = `${e.clientX}px`;
document.body.appendChild(d);
d.addEventListener('animationend', (() => {
d.parentElement.removeChild(d);
}).bind(this));
}
});div.clickEffect {
position: fixed;
border-radius: 50%;
z-index: 99999;
width:20px;
height:20px;
margin:-10px 0 0 -10px;
border:1px solid #000;
transform:perspective(200px) translateZ(-250px);
animation: clickEffect 1s ease-out;
}
@keyframes clickEffect {
0% {opacity: 1;}
100% {opacity: 0.5;
transform:perspective(200px) translateZ(90px)}
}<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
Не совсем, по крайней мере, не с преобразованием, вам нужно анимировать ширину и высоту
@keyframes clickEffect { 0% { opacity: 1; width: 1px; height: 1px} 100% { opacity: 0.5; width: 20px; height: 20px}}. Немного хуже по производительности, но что ж, это работает.