【发布时间】:2021-04-03 08:15:04
【问题描述】:
我正在尝试创建一个网络动画,其中一个矩形根据鼠标位置围绕浏览器窗口的中心点旋转(如下面的 gif 所示)。
动画 99% 可以正常工作,但我遇到了无法修复的边缘情况问题。请参阅 gif 以获取视觉参考:当鼠标位于屏幕的右半部分时,动画的行为符合预期 - 当鼠标位于屏幕的左半部分并穿过水平轴时会出现问题,从而导致矩形翻转一个完整的 360 度,而不是平滑过渡。
这是因为矩形快速从 270 度捕捉到 90 度 - 两个角度在视觉上是相同的,但由于过渡动画,您可以观察到矩形翻转 360 度。
如何解决此问题以确保屏幕左侧的平滑过渡?
var rect = document.getElementById('orange_rect'); // Target rectangle
var window_width = $(window).width();
var window_height = $(window).height();
$(window).resize(function() { //set window width and height again everytime the window is resized
var window_width = $(window).width();
var window_height = $(window).height();
});
// Update rotation degrees on mousemove
$(document).mousemove(function(e) {
var x_pos = e.pageX / window_width;
var y_pos = e.pageY / window_height;
if (y_pos >= 0.5) {
var deg = 270 - (x_pos * 180);
} else if (y_pos < 0.5) {
var deg = (x_pos * 180) - 90;
};
rect.style.webkitTransform = 'rotate(' + deg + 'deg)';
rect.style.mozTransform = 'rotate(' + deg + 'deg)';
rect.style.msTransform = 'rotate(' + deg + 'deg)';
rect.style.oTransform = 'rotate(' + deg + 'deg)';
rect.style.transform = 'rotate(' + deg + 'deg)';
});
body {
overflow: hidden;
}
#orange_rect {
/* Homepage orange rect */
background-color: #FF4734;
height: 100vh;
width: 200vw;
overflow: hidden;
position: absolute;
top: 50vh;
margin-right: auto;
margin-left: -50vw;
transform-origin: 50% 0;
transition: transform 0.3s;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body>
<div id="orange_rect"></div>
</body>
【问题讨论】:
标签: javascript animation rotation css-animations image-rotation