【发布时间】:2014-10-29 01:02:48
【问题描述】:
(JSFIDDLE提供..)
目标:
- 不断旋转一个元素 3 秒然后停止
- 旋转停止后,将元素旋转 175 度。从 当前 角度开始为旋转设置动画(无论恒定旋转停止时的角度是什么)
问题 #1
在 Chrome 上,停止持续旋转后,元素会旋转 175 度,但没有任何动画。我正在尝试重置动画(我暂停以停止持续旋转)但似乎没有任何效果。
问题 #2
在 Safari 上,停止持续旋转后,元素的 角度会重置为 0 度(自行),然后通过动画将其旋转到 175 度。
因此,在这两种情况下,事件顺序都无法按预期进行。你能看出我做错了什么吗?
您是否有包含 IE10+ 的跨浏览器检查解决方案?
请查看此 JSFIDDLE 以查看下面的代码
CSS:
span {
position:absolute;
top: 10px;
left: 10px;
}
div {
position:absolute;
top: 100px;
left: 100px;
height: 100px;
width: 100px;
background-color: black;
border-top: 10px solid blue;
border-bottom: 10px solid red;
border-left: 10px solid green;
border-right: 10px solid yellow;
}
@-webkit-keyframes constantrotate {
from {
-webkit-transform: rotate(0deg);
}
to {
-webkit-transform: rotate(360deg);
}
}
HTML:
<span></span>
<div></div>
JAVASCRIPT:
/* This function returns the element's current degrees at any given time */
var currentDegreesFor = function($element) {
var matrix = $element.css("-webkit-transform") ||
$element.css("-moz-transform") ||
$element.css("-ms-transform") ||
$element.css("-o-transform") ||
$element.css("transform");
if (matrix !== 'none') {
var values = matrix.split('(')[1].split(')')[0].split(',');
var a = values[0];
var b = values[1];
var angle = Math.round(Math.atan2(b, a) * (180 / Math.PI));
} else {
var angle = 0;
}
return (angle < 0) ? angle += 360 : angle;
};
var $element = $('div');
// INITIALIZING CONSTANT ROTATION
$('span').text('rotating constantly');
$element.css({
"-webkit-animation": "constantrotate infinite 5s linear",
"animation": "constantrotate infinite 5s linear"
});
// AFTER 3 SECONDS
setTimeout(function() {
// STOP CONTSTANT ROTATION
$element.css({
'animation-play-state': 'paused',
'-webkit-animation-play-state': 'paused'
});
// get element's current degrees
var degrees = currentDegreesFor($element);
$('span').text('constant rotation stopped at ' + degrees +
' degrees');
// AFTER 3 SECONDS
setTimeout(function() {
/* This animation has now stopped at X degrees
However the element's current rotation isn't
set to X degrees explicitly with a CSS rule.
Apparently, I need to add that rule myself if I want to
further rotate the element */
$element.css({
'transform': 'rotate(' + degrees + 'deg)',
'-webkit-transform': 'rotate(' + degrees + 'deg)'
});
$('span').text('CSS tranform: rotate() set to ' + degrees +
' degrees');
// AFTER 3 SECONDS
setTimeout(function() {
$('span').text('rotating to 175 degrees with animation');
/* I'm now resetting the animation from
"constantrotate" to "transition". The element is
rotated but with no animation (at least none on Chrome - on Safari the element's angle
is set back to 0 before this animation begins). What am I doing wrong ?
*/
$element.css({
'-webkit-animation': '-webkit-transition',
'animation': 'transition',
'transition': 'transform 10s ease-in',
'-webkit-transition': '-webkit-transform 10s ease-in',
'transform': 'rotate(175deg)',
'-webkit-transform': 'rotate(175deg)'
});
}, 3000);
}, 3000);
}, 4000);
【问题讨论】:
-
您能详细说明一下吗?您可以在我提供的 JSFiddle(如果您喜欢 Chrome 和 Safari)上尝试您的建议,看看它是否真的有效。
-
它本身不会工作。您将需要: 1. 暂停动画并知道停止角度后,将 css 设置为 animation:none,transition:transform 5s,transform: rotate( currentAngle deg) 2. 然后稍等一下并设置 transform: rotate(175deg )
-
为什么我需要“稍等”?我认为这实际上一定是两个浏览器问题的根源。似乎在动画方面没有立即应用 CSS 样式。这是为什么?如果元素在应用新动画样式时已经被动画化(在这种情况下可能会产生冲突),这将是有意义的(需要一段时间才能应用新的动画相关样式)。但是,在我的情况下,我正在等待当前动画(恒定动画)完成,然后再应用新动画(旋转到 175 度)。
-
在这种情况下需要稍等一下,因为您需要在更改转换动画的属性之前设置转换(在这种情况下为转换)
标签: css animation safari rotation transform