嗯,我一直在研究这个问题一段时间,我认为使用 CSS 动画是不可能的。我一直在尝试使用这个 JSFiddle做很多不同的事情,并浏览有关 CSS 动画的教程 (看看是否有人提到了同样的问题)以及有关它的其他信息。
然后我确实意识到了你想要完成的事情,我认为也许有一个更简单的解决方案。如果位置是动态计算的,我会假设你确实在使用某种级别的 Javascript(或一些疯狂的高级 CSS 计算方法),所以我至少认为你会用新的left
或top
位置设置 DOM 元素的样式。虽然我不是在谈论 jQuery 动画,但您可以做的是将CSS3 转换与 Javascript 结合使用。这意味着您可以获得 CSS 动画的一些好处,例如计算更加原生(硬件加速),而不是在 Javascript 中完成,但您确实失去了一些东西。
最重要的是,浏览器没有像 CSS 动画那样的转换事件,你也不能对关键帧进行细粒度控制,但你可以动态地使用它。我只建议它,因为您的问题仅涉及 的关键帧0%
和100%
.
您尝试做的问题是使用 CSS 动画需要是静态的,并且不会提取当前设置为执行动画的值(与过渡不同)。当您使用inherit
时,您实际上是在尝试使其使用父级中的top
等left
。
同样,这不符合您对纯 CSS 的要求,但使用 CSS 转换确实意味着仅通过 Javascript 进行有限的 DOM 操作,而不是 jQuery animate 所做的。
这是另一个不使用 jQuery(仅使用非常基本的 javascript 来设置类或内联样式)和 CSS 转换的 JSFiddle。
HTML
<div class="myselector-one" id="a">Click Me</div>
<div class="myselector-two" id="b">Click Me</div>
Javascript
document.getElementById("a").onclick = function()
{
if (this.className.indexOf("animate-complete")!=-1)
{
this.className = this.className.replace(/animate\-complete/g,"");
}
else
{
this.className += " animate-complete";
}
}
var bIsTransitioned = false;
document.getElementById("b").onclick = function()
{
if (!bIsTransitioned)
{
this.style.top = "50%";
this.style.left = "50%";
this.style.width = "100%";
this.style.height = "60%";
}
else
{
this.style.top = "";
this.style.left = "";
this.style.width = "";
this.style.height = "";
}
bIsTransitioned = !bIsTransitioned;
}
CSS
.myselector-one {
top:10em;
left:0em;
width:10em;
height:5em;
transition:all 2s;
background-color:#ffaa99;
position:absolute;
}
.myselector-two {
top:4em;
left:30em;
width: 15em;
height: 8em;
transition:all 2s;
background-color:#aaff99;
position:absolute;
}
.animate-complete
{
top: 50%;
left:50%;
width: 100%;
height: 60%;
}