我尝试使用PNG序列制作动画,该序列在悬停时有转换,并在悬停状态结束时动画回来。
为此,我使用css过渡和"步骤"计时功能,如:
transition:background .5s steps(9, end);
看一个实例的小提琴(我使用过Googled的随机PNG精灵,它不是我实际使用的那个)
当你慢慢地将鼠标悬停在元素上时,基本上工作正常。当您快速悬停元素时,过渡似乎会触发背景图像,如果在上一次过渡的中途,然后步骤的数量不匹配将产生不良影响。
我可以使用javascript来触发转换,但有人知道是否只有CSS解决方案吗?
答案 0 :(得分:6)
这不是一个完美的解决方案,但你可以通过动画来处理悬停变化。
如果您在动画完成后取消悬停,它将正常工作,但如果您快速悬停则不会动画
CSS
div { width:50px;
height:72px; background:url(http://openbookproject.net/thinkcs/python/english3e/_images/duke_spritesheet.png) left top;
transition:background 1.5s steps(9, end);
background-position: 0px top;
-webkit-animation: none;
}
div:hover {
background-position:-450px top;
-webkit-animation: bkg 1.5s steps(9);
transition: none;
}
@-webkit-keyframes bkg {
0% {background-position: 0px top;}
100% {background-position: -450px top;}
}
并且,使用jQuery的解决方案。这个动画从非悬停时刻开始回放动画。它还会重新计算时间,因此不会减慢速度
的jQuery
$( "div" ).hover(
function() {
var elem = $(this);
var cur = parseInt(elem.css("background-position-x"));
var steps = (450 + cur) / 50;
var time = steps * 0.1;
var trans = "background " + time + "s steps(" + steps + ", end)";
elem.css("transition", trans);
elem.css("background-position", "-450px 0px");
},
function() {
var elem = $(this);
var cur = parseInt(elem.css("background-position-x"));
var steps = - cur / 50;
var time = steps * 0.1;
var trans = "background " + time + "s steps(" + steps + ", end)";
elem.css("transition", trans);
elem.css("background-position", "0px 0px");
}
);
jQuery代码可以简化一点,使用函数来避免重复代码,但我已将其设置为与posible一样清晰