我正在制作一个网站,当您向下滚动一条直线时会动画成一个正方形/矩形,效果非常好,但有一件事情可能会让我感到困扰这是一个很难解决的问题,但这里是:画布动画“放慢速度”快速向上滚动时向下滚动
当动画播放并且快速上下滚动(使用视口中的画布)时,您可以看到它稍微减慢。不知道是什么原因造成的,每当元素到达Window
中的某个点时,我只发送一个动画给动画函数。有任何想法吗?
编辑: 更新了链接,只需向下滚动,就会更加清楚我的意思是减慢速度。
请参阅此fiddle或更低版本中的工作示例。
function createBorderAnimation(elm) {
console.log(elm);
var canvas = elm.get(0),
ctx = canvas.getContext('2d');
canvas.width = $(window).width()/4 * 3;
canvas.height = $(window).height()/2;
var Point = function(x, y) {
this.x = x;
this.y = y;
};
var points = [
new Point(0, 0),
new Point(canvas.width, 0),
new Point(canvas.width, canvas.height),
new Point(0, canvas.height),
new Point(0, -10),
];
function calcWaypoints(vertices) {
var waypoints = [];
for (var i = 1; i < vertices.length; i++) {
var pt0 = vertices[i - 1];
var pt1 = vertices[i];
var dx = pt1.x - pt0.x;
var dy = pt1.y - pt0.y;
for (var j = 0; j < 50; j++) {
var x = pt0.x + dx * j/50;
var y = pt0.y + dy * j/50;
waypoints.push({
x: x,
y: y
});
}
}
return (waypoints);
}
var wayPoints = calcWaypoints(points);
ctx.strokeStyle = "rgba(0,0,0,0.5)";
ctx.lineWidth = 5;
ctx.moveTo(points[0].x, points[0].y);
ctx.globalCompositeOperation = 'destination-atop';
var counter = 1,
inter = setInterval(function() {
var point = wayPoints[counter++];
ctx.lineTo(point.x, point.y);
ctx.stroke();
if (counter >= wayPoints.length) {
clearInterval(inter);
$(canvas).parent().addClass('active');
}
}, 1);
ctx.stroke();
}
$(window).scroll(function() {
var st = $(window).scrollTop();
$('canvas').each(function(key, elm) {
var _this = $(elm);
if (st > _this.offset().top - $(window).height()) {
if (!_this.hasClass('animating')) {
_this.addClass('animating');
createBorderAnimation(_this);
}
TweenLite.set(_this, {
y: -(st - _this.offset().top)/(1.5 * 10)
});
}
});
});
canvas {
width: 35vw;
height: 50vh;
display: inline-block;
vertical-align: top;
}
canvas:first-child {
margin: 0 5vw 0 0;
}
div {
width: 75vw;
height: 50vh;
margin: 100px auto;
font-size: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/latest/TweenMax.min.js"></script>
<div>
<canvas></canvas>
<canvas></canvas>
</div>
<div>
<canvas></canvas>
<canvas></canvas>
</div>
<div>
<canvas></canvas>
<canvas></canvas>
</div>
<div>
<canvas></canvas>
<canvas></canvas>
</div>
<div>
<canvas></canvas>
<canvas></canvas>
</div>
唐'使用'setInterval'是放缓的原因。 – Blindman67
'requestAnimationFrame'是要走的路,或者你可以建议替代品吗? – LVDM
requestAnimationFrame是如何计时的任何动画, – Blindman67