【发布时间】:2011-03-16 23:43:21
【问题描述】:
我想用路径机制绘制一个简单的形状来制作一个 html5 画布元素的动画。将鼠标悬停在它上面时,我想放大它,使其更不透明并更改颜色。我可以用 jQuery 的 animate() 函数来做到这一点吗?最好的方法是什么?画布有做这种动画的机制吗?
【问题讨论】:
我想用路径机制绘制一个简单的形状来制作一个 html5 画布元素的动画。将鼠标悬停在它上面时,我想放大它,使其更不透明并更改颜色。我可以用 jQuery 的 animate() 函数来做到这一点吗?最好的方法是什么?画布有做这种动画的机制吗?
【问题讨论】:
不幸的是,使用画布你想要做的事情会非常困难(不再是这种情况 - 请参阅下面的更新)因为一旦你在画布上绘制了一条路径,它就只是像素,所以你不能只是附加事件处理程序就像 DOM 一样。
幸运的是,如果您使用 SVG 而不是 canvas,那么您可以做到这一点,因为 SVG 中的所有形状都是 DOM 节点,就像 HTML 中的 div 和 span 一样。
很遗憾,IE 不支持 SVG。
幸运的是,在 IE 上你可以使用VML 而不是 SVG。
很遗憾,您不能使用 jQuery 轻松地为 SVG 和 VML 对象制作动画。
幸运的是,Raphaël 是一个 JavaScript 库,其 API 深受 jQuery 启发,可以为您完成所有工作。它在 IE 上使用 VML,在其他浏览器上使用 SVG。它适用于 Firefox 3.0+、Safari 3.0+、Chrome 5.0+、Opera 9.5+ 和 Internet Explorer 6.0+。
这就是你如何制作一个红色圆圈,当鼠标悬停时它会慢慢变成黄色:
// make a Raphael "paper" similarly to an HTML5 canvas:
var paper = Raphael(10, 10, 320, 240);
// make a circle on this paper:
var circle = paper.circle(100, 80, 20);
// change some attributes:
circle.attr({
fill: 'red'
});
// register mouse enter and mouse leave event handlers:
circle.hover(
function() {
circle.animate({
fill: 'yellow'
}, 300);
},
function() {
circle.animate({
fill: 'red'
}, 300);
}
);
就是这样——见DEMO。
请看这个更复杂的DEMO,它会形成一个圆圈,鼠标悬停时会完全按照您的要求进行操作 - 放大它,使其更不透明并更改颜色。
另请参阅我为this answer 写的关于拉斐尔的this demo。
当我最初发布这个答案时,我写道,使用画布很难做到你所要求的,因为你必须维护一些在画布中不存在的对象层次结构,就像在 SVG 或 VML 中一样。这仍然是正确的,但是现在有一些库可以为您完成“非常困难”的部分,例如 EaselJS, KineticJS, Paper.js 或 Fabric.js 和其他一些人(有关更多信息,请参见 Fabric.js 的作者维护的 comparison of canvas libraries)。
【讨论】:
谷歌在这个页面上使用了一些动画画布图标。 http://www.google.com/chromeos/features.html
当您深入研究代码时,您会发现他们使用了 JS Tweener。 http://coderepos.org/share/wiki/JSTweener
如果谷歌选择它,我认为它比 raphaelJS 更可靠;)。画布动画代码虽然非常复杂。我几乎不明白发生了什么。
【讨论】: