[html]
<style>
.svg {
position: relative;
width: 200px;
height: 200px;
display: inline-block;
}
.svg svg {
width: 200px;
height: 200px;
}
.svg.muted {
opacity: 0.5;
}
.svg.click::before,
.svg.click::after {
position: absolute;
width: 10px;
height: 10px;
opacity: 0.75;
}
.svg.click::after {
content: '';
top: 15%;
right: 15%;
border-bottom: 1px solid #ffa500;
border-left: 1px solid #ffa500;
}
.svg.click::before {
content: '';
bottom: 15%;
left: 15%;
border-top: 1px solid #ffa500;
border-right: 1px solid #ffa500;
}
a {
position: absolute;
top: 50%;
right: 0;
transform: translateY(-50%);
color: #000;
padding: 1em;
background-color: #ffa500;
font-family: 'Monospace';
text-decoration: none;
}
body {
background: #1a1a2e;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
margin: 0;
flex-direction: column;
gap: 20px;
}
</style>
</head>
<body>
<div class="svg click">
<svg id="b1"></svg>
</div>
<!-- ПОДКЛЮЧАЕМ БИБЛИОТЕКИ -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/snap.svg/0.5.1/snap.svg-min.js"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
// ============================================
// ОРИГИНАЛЬНЫЙ КОД (исправленный)
// ============================================
var s1 = Snap('#b1');
var c = 200 / 2;
var clr = 'orange';
// ============================================
// ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ
// ============================================
function r(circumference) {
return circumference / (2 * Math.PI);
}
function s(circumference, count, w, spaceAfter) {
w ? w = w : w = 5;
var res = [w, (circumference / count) - w];
spaceAfter ? res = [(circumference / count) - w, w] : res = res;
return res;
}
// ============================================
// ФУНКЦИИ АНИМАЦИИ
// ============================================
var bezier = function(x1, y1, x2, y2, epsilon) {
var curveX = function(t) {
var v = 1 - t;
return 3 * v * v * t * x1 + 3 * v * t * t * x2 + t * t * t;
};
var curveY = function(t) {
var v = 1 - t;
return 3 * v * v * t * y1 + 3 * v * t * t * y2 + t * t * t;
};
var derivativeCurveX = function(t) {
var v = 1 - t;
return 3 * (2 * (t - 1) * t + v * v) * x1 + 3 * (-t * t * t + 2 * v * t) * x2;
};
return function(t) {
var x = t,
t0, t1, t2, x2, d2, i;
for (t2 = x, i = 0; i < 8; i++) {
x2 = curveX(t2) - x;
if (Math.abs(x2) < epsilon) return curveY(t2);
d2 = derivativeCurveX(t2);
if (Math.abs(d2) < 1e-6) break;
t2 = t2 - x2 / d2;
}
t0 = 0, t1 = 1, t2 = x;
if (t2 < t0) return curveY(t0);
if (t2 > t1) return curveY(t1);
while (t0 < t1) {
x2 = curveX(t2);
if (Math.abs(x2 - x) < epsilon) return curveY(t2);
if (x > x2) t0 = t2;
else t1 = t2;
t2 = (t1 - t0) * .5 + t0;
}
return curveY(t2);
};
};
var duration = 200;
var epsilon = (1000 / 60 / duration) / 4;
var timingFunction = bezier(0.08, 1.05, 0.95, 0.12, epsilon);
var timingFunction2 = bezier(0.5, 0.5, 0.5, 0.5, epsilon);
var timingFunc = bezier(.75, 0, 0.15, 1, epsilon);
var timingFunc2 = bezier(.5, 0, 0, 1, epsilon);
var timingFunc3 = bezier(0, 0, 0.25, 1, epsilon);
// ============================================
// РИСУЕМ КРУГ
// ============================================
var c11 = s1.circle(c, c, r(300)).attr({
fill: 'transparent',
stroke: clr,
strokeWidth: 2,
});
var c12 = s1.circle(c, c, r(300)).attr({
fill: 'transparent',
stroke: clr,
strokeWidth: 6,
strokeDasharray: s(300, 4, 5),
transform: ['r-' + 5 * (2 / 3), c, c]
});
// ============================================
// КЛИК ПО КРУГУ
// ============================================
c12.node.onclick = function() {
c12.attr({
r: r(300),
strokeDasharray: s(300, 4, 5),
transform: ['r-' + 5 * (2 / 3), c, c]
})
Snap.animate(300, 360, function(v) {
var vc = v - 300;
c12.attr({
r: r(v),
strokeDasharray: s(v, 4, 5),
transform: ['r' + ((vc * 1.5) - (5 * (2 / 3))), c, c]
})
}, 800, timingFunc2, function() {
c12.animate({
transform: ['r' + (180 - (5 * (2 / 3))), c, c]
}, 800, mina.bounce, function() {
Snap.animate(360, 300, function(v) {
c12.attr({
r: r(v),
strokeDasharray: s(v, 4, 5)
})
}, 800, timingFunc2)
})
});
}
// ============================================
// АВТОЗАПУСК
// ============================================
setTimeout(function() {
if (c12 && c12.node) {
c12.node.click();
}
}, 500);
</script>
[/html]


















































