script.aculo.us库:视觉效果与动画的全面指南
1. 简介
script.aculo.us库由Thomas Fuchs开发,并得到了社区的众多贡献。它以六个文件的形式分发:
scriptaculous.js
、
builder.js
、
effects.js
、
dragdrop.js
、
controls.js
和
slider.js
。如果
scriptaculous.js
与其他五个文件在同一目录下,引入
scriptaculous.js
会自动包含其他文件。不过,该库依赖的Prototype库需要单独引入。
在Rails项目中,标准的Rails骨架会在
public/javascripts
目录中包含
effects.js
、
dragdrop.js
和
controls.js
。可以使用
javascript_include_tag
辅助方法来引入外部JavaScript文件,通过传递
:defaults
参数,它会包含Prototype、Rails标准的script.aculo.us文件以及
application.js
(如果存在)。示例代码如下:
<script src="/js/prototype.js" type="text/javascript"></script>
<script src="/js/scriptaculous.js" type="text/javascript"></script>
<%= javascript_include_tag :defaults %>
script.aculo.us库的官方网站(http://script.aculo.us )提供演示、下载和公告,官方维基(http://wiki.script.aculo.us )提供文档和示例代码。该库主要包含七个部分:视觉效果、拖放、控件、元素扩展、DOM构建器、JavaScript单元测试和其他实用方法。
2. 视觉效果概述
Effect
对象封装了script.aculo.us的动画效果,定义了五个核心效果,这些核心效果以类的形式实现,继承自
Effect.Base
。核心效果类至少实现
initialize
(构造函数)和
update
方法,
update
方法用于实现效果的主要动作,如改变不透明度、移动元素等。
一般来说,客户端代码不会直接使用核心效果,而是使用组合效果。组合效果是对一个或多个核心效果的封装,script.aculo.us提供了16种标准组合效果,开发者也可以轻松创建自定义效果。
script.aculo.us的效果是基于时间的,而不是基于帧的,必要时会丢弃帧以达到目标效果持续时间。因此,通常情况下,一个持续一秒的效果无论系统速度如何都会持续一秒。
3. 核心效果
核心效果通常不直接使用,而是用于构建组合效果。以下是几种核心效果的介绍:
-
Opacity
:改变元素的不透明度,从
from
(默认是元素的当前不透明度)到
to
(默认是1,即完全不透明)。当不透明度达到0时,元素的
display
属性不会设置为
none
,元素仍会保留在文档流中,即使它是不可见的。示例代码如下:
new Effect.Opacity('target', {to:0}); // 淡出
new Effect.Opacity('target', {from:0, to:1, duration:5}); // 淡入
-
Move
:根据
x和y选项指定的偏移量移动元素。mode选项可以是relative(默认)或absolute。在相对模式下,x和y表示相对于元素当前位置的偏移量;在绝对模式下,它们表示相对于元素原始位置的偏移量。示例代码如下:
// 向上和向右移动
new Effect.Move('target', {x:100, y:-50});
// 向下和向左移动,速度较慢
new Effect.Move('target', {x:-10, y:10, duration:3});
// 向下和向右移动,持续2秒,每秒25帧,线性速率
new Effect.Move('target', {x:100, y:200, duration:2, fps:25, transition:Effect.Transitions.linear});
-
Scale
:相对于元素的当前大小,按百分比缩放元素的大小。除了标准选项外,
Scale()还支持一些额外选项,如ScaleX、ScaleY、scaleContent等。示例代码如下:
// 两个维度都增加到200%
new Effect.Scale('target', 200);
// 垂直方向减小到50%
new Effect.Scale('target', 50, {scaleX:false});
-
Highlight
:将元素的背景颜色更改为浅黄色,然后逐渐变回初始颜色。可以使用
startcolor选项覆盖默认的黄色。示例代码如下:
// 一秒的黄色高亮
new Effect.Highlight('target');
// 半秒的红色高亮
new Effect.Highlight('target', {startcolor:'ff0000',duration:.5});
- ScrollTo :平滑滚动页面,使元素位于视口顶部(或尽可能接近顶部)。示例代码如下:
// 一秒的平滑滚动
new Effect.ScrollTo('target');
// 慢速滚动
new Effect.ScrollTo('target', {duration:5});
// 特殊过渡效果
new Effect.ScrollTo('target', {transition: Effect.Transitions.wobble});
- Parallel :与其他核心效果不同,这个效果不接受元素,而是接受一个其他效果的数组。示例代码如下:
// 向下滑动并淡出
new Effect.Parallel(
[ new Effect.Move('target', {y: 100}),
new Effect.Opacity('target', {to: 0}) ]);
4. 组合效果
组合效果本质上是对一个或多个核心效果的封装。以下是几种组合效果的介绍:
-
Fade
:将元素的不透明度从
from
(默认是其当前状态)改变到
to
(默认是0)。如果结束时不透明度为0,元素会被隐藏(从页面流中移除),并将其不透明度恢复到原始值。示例代码如下:
// 一秒的淡出
new Effect.Fade('target')
// 半秒淡到50%
new Effect.Fade('target', {to:.5, duration:.5})
-
Appear
:将元素的不透明度从
from(默认是其当前状态,如果display属性为none则为0)改变到to(默认是1)。开始前,元素的display属性会设置为空字符串,使其进入页面流。示例代码如下:
// 一秒的淡入
new Effect.Appear('target')
// 半秒淡入到50%
new Effect.Appear('target', {to:.5, duration:.5})
-
Puff
:是
Scale()到200%和Opacity()到0的组合。结束后,元素会被隐藏。传递的选项会传递给Opacity()效果。示例代码如下:
// 一秒的膨胀消失效果
new Effect.Puff('target')
// 三秒的膨胀消失效果
new Effect.Puff('target', {duration:3})
-
BlindUp
:将元素的
x维度缩放到0%,元素内容固定在顶部,就像百叶窗一样。结束后,元素会被隐藏。示例代码如下:
new Effect.BlindUp('target')
-
BlindDown
:将元素的
x维度缩放到其原始高度,元素内容固定在顶部,就像百叶窗一样。开始前,元素会变为可见。示例代码如下:
new Effect.BlindDown('target')
-
SlideUp
:将元素的
x维度缩放到0%,元素内容固定在底部,就像车库门一样。要求元素的内容包裹在一个高度固定的容器元素中。结束后,元素会被隐藏。示例代码如下:
new Effect.SlideUp('target')
-
SlideDown
:将元素的
x维度缩放到其原始高度,元素内容固定在底部,就像车库门一样。要求元素的内容包裹在一个高度固定的容器元素中。开始前,元素会变为可见。示例代码如下:
new Effect.SlideDown('target')
- SwitchOff :模拟旧电视关闭的效果:快速闪烁,然后元素收缩成一条水平线。示例代码如下:
new Effect.SwitchOff('target')
- DropOut :同时淡化元素并将其向下移动,使其看起来像是从页面上掉落。示例代码如下:
new Effect.DropOut('target')
- Shake :使元素左右滑动几次,通常用于表示元素无效,例如在表单字段中。示例代码如下:
new Effect.Shake('target')
-
Grow
:将元素的大小设置为0,然后从中心点开始增加其大小和内容。除了标准选项外,
direction选项可以指定元素增长的方向,可能的值有center(默认)、top-left、top-right、bottom-left和bottom-right。示例代码如下:
new Effect.Grow('target')
new Effect.Grow('target', {direction:'top-left'})
-
Shrink
:将元素及其内容的大小减小到0,收缩到中心点。除了标准选项外,
direction选项可以指定元素收缩的方向,可能的值有center(默认)、top-left、top-right、bottom-left和bottom-right。示例代码如下:
new Effect.Shrink('target')
new Effect.Shrink('target', {direction:'bottom-right'})
- Squish :将元素及其内容的大小减小到左上角。示例代码如下:
new Effect.Squish('target')
-
Pulsate
:快速多次淡入淡出元素,是对
<blink>标签的现代改进。示例代码如下:
new Effect.Pulsate('target')
- Fold :将元素的高度减小到一条细线,然后减小其宽度直到消失。示例代码如下:
new Effect.Fold('target')
5. 效果选项
一些效果可以接受额外的选项,以下是一些常见的效果选项:
| 选项 | 描述 | 默认值 |
| ---- | ---- | ---- |
| duration | 效果持续时间(秒),以浮点数表示 | 1.0 |
| From | 过渡的起始点,一个介于0.0(默认)和1.0之间的浮点数 | 0.0 |
| To | 过渡的结束点,一个介于1.0(默认)和0.0之间的浮点数 | 1.0 |
| Fps | 目标每秒帧数,最大值为100 | 25 |
| Delay | 效果开始前的延迟时间(秒) | 0.0 |
| transition | 一个修改效果当前位置点的函数 | Effect.Transitions.sinoidal |
| Queue | 设置排队选项 | parallel |
| Sync | 如果为
false
(默认),帧将自动渲染;如果为
true
,帧必须使用
render()
手动渲染 | false |
6. 效果实例方法和属性
效果实例具有以下方法和属性:
-
finishOn
:效果完成(或将要完成)的时间(毫秒)。
-
startOn
:效果开始(或将要开始)的时间(毫秒)。
-
currentFrame
:最后渲染的帧数。
-
options
:一个对象,包含创建效果时使用的选项。
-
element
:应用效果的元素。使用
Effect.Parallel
时,请参考
effects
。
-
effects
:使用
Effect.Parallel
时,包含效果应用的元素的数组。
-
position
:一个介于0和1之间的值,表示效果的当前位置,0表示效果开始,1表示效果完全完成,默认值为
null
。
-
start(options)
:将
options
与
Effect.DefaultOptions
合并,将效果添加到全局队列或
options
中指定的队列。
-
loop(timePos)
:根据当前时间位置(介于
startOn
和
finishOn
之间的值),根据过渡函数渲染效果。
-
render(pos)
:根据效果的过渡函数转换
pos
(介于0和1之间的值),并调用
update()
。
-
cancel()
:从队列中移除效果。示例代码如下:
new Effect.Opacity('target', {to:0, from:1}).cancel( );
-
event(eventName)
:触发名为
eventName的事件的回调。示例代码如下:
e = new Effect.Opacity('target', {onFoo:function( ){
alert('Bar');
}})
// 弹出 'Bar'
e.event('onFoo');
- inspect() :返回表示效果对象的字符串。示例代码如下:
new Effect.Opacity('target', {from:1, to:0}).inspect( );
7. 效果过渡
由于效果是基于时间的,script.aculo.us根据当前系统时间(或“时钟时间”)来确定要渲染的帧。例如,假设一个持续两秒的
Appear
效果计划在下午2:30:00开始,当效果队列的主循环将该时间作为
timePos
传递给
Effect.Base.loop
时,它会转换为
pos
,一个表示效果生命周期中当前位置的浮点数,在这种情况下为0。在下午2:30:01,效果计划完成一半,所以
pos
将为0.5。
pos
的值会传递给效果的
update
方法,该方法处理对DOM的实际更改,例如将元素的不透明度设置为50%。
script.aculo.us的效果默认以线性速率变化,即恒定的速度和方向,直接对应于时钟时间。幸运的是,该库提供了一种称为过渡的间接机制,以提供更多的灵活性。每个过渡是一个简单的函数,接受一个介于0和1之间的参数,并返回一个介于0和1之间的值。
Effect.Base
在调用
Effect.update
之前会将
pos
通过当前过渡函数传递,从而让你能够转换当前位置。以下是八种标准过渡的定义:
-
linear
:实际上不改变
pos
。
-
reverse
:反转
pos
,0变为1,1变为0。
-
sinoidal
:类似于
linear
,但开始和结束更平滑。
-
none
:对于任何
pos
值都返回0,实际上使效果停留在起始点。
-
full
:对于每个
pos
值都返回1,实际上使效果直接跳到结束状态。
-
pulse
:在0和1之间跳跃五次,最终停在0。
-
wobble
:开始较慢,在0和1之间滑动四次,最终停在1。
-
flicker
:随机
要创建自定义过渡,可以向
Effect.Transitions
对象添加一个函数。例如:
Effect.Transitions.slight_wobble = function(x) {
return (-Math.cos(x * Math.PI *(9 * x)) / 4) + 0.5;
}
8. 效果回调
在效果的生命周期中,有七种回调函数可用。回调函数在效果的
options
参数中指定,并接收对效果对象的引用作为参数。可用的回调函数有
beforeStart
、
beforeFinish
、
afterFinish
、
beforeSetup
、
afterSetup
、
beforeUpdate
和
afterUpdate
。示例代码如下:
// 效果渲染完成时弹出提示
new Effect.Fade('target', {afterFinish:function(e){
alert('Done');
}});
// 每次帧渲染后,将元素的不透明度放入其innerHTML中
new Effect.Fade('target', {afterUpdate:function(e){
e.element.update(e.element.getOpacity().toString( ));
}});
9. 效果队列
默认情况下,script.aculo.us的效果是并行执行的。在某些情况下,这不会有问题,即使在同一个元素上创建多个效果:
new Effect.Fade('target');
new Effect.BlindUp('target');
但在其他情况下,并行执行效果可能效果不佳:
new Effect.BlindUp('target');
new Effect.BlindDown('target');
queue
选项允许使用队列来实现有序效果。每个队列作为一个单独的作用域,默认的队列名为
global
。在每个作用域内,效果可以指定位置:
front
或
end
。没有指定位置的效果将相互并行执行。例如:
new Effect.BlindUp('target');
new Effect.BlindDown('target', {queue:'end'});
通过为
BlindDown
效果指定
end
位置,即使它们都在全局作用域中,
BlindDown
效果也会在
BlindUp
效果完成后才执行。
要创建独立的作用域,可以向
queue
选项提供一个对象,该对象可以包含
position
、
scope
和
limit
属性。例如:
new Effect.BlindUp('target', { queue:{ scope:'one' } });
new Effect.BlindDown('target', { queue:{ scope:'one', position:'end' } });
new Effect.BlindUp('target2', { queue:{ scope:'two', position:'end' } });
scope
属性用于命名队列,
position
属性可以是
front
或
end
,
limit
属性用于设置队列中一次可以存在的最大效果数。如果队列中的效果数超过
limit
,新效果将不会被添加。
以下是一些与队列相关的方法和属性:
-
Effect.Queue
:返回名为
global
的效果队列。
-
Effect.Queues.instances
:一个队列的哈希表,哈希键是队列名称,值是
Effect.ScopedQueue
实例。
-
Effect.Queues.get(queueName)
:返回由字符串
queueName
指定的队列,如果队列不存在则创建一个新队列。
Effect.ScopedQueue
类包含Prototype的
Enumerable
并实现了
_each
,因此可以使用
Enumerable
方法在队列上迭代其效果。它具有以下方法:
-
effects
:当前队列中的
Effect
实例数组。
-
add(effect)
:将效果添加到队列中。当一个核心效果类被初始化时(除非提供了
sync
选项),它会调用
Effect.Base.start()
,该方法会将效果添加到全局队列(或指定的队列)中。
-
remove(effect)
:从队列中移除效果。当调用
Effect.Base.cancel()
时,效果会从其队列中移除自己。
-
loop()
:这是效果队列的主循环,对于
effects
中的每个效果,调用
loop()
并传递当前时间。
10. 静态效果方法
以下是一些静态效果方法的介绍:
-
Effect.tagifyText(element)
:将元素中的每个字符用一个
position
样式设置为
relative
的
<SPAN>
标签包裹。该方法依赖于
builder.js
,标准的Rails骨架中不包含该文件。示例代码如下:
el = Builder.node('div')
el.innerHTML='test'
Effect.tagifyText(el)
el.innerHTML // => '<span style="position: relative;">t</span><span
// style="position: relative;">e</span><span style="position: relative;"
// >s</span><span style="position: relative;">t</span>'
这允许为单个字符创建效果,例如:
// <h1 id="headline">This is a test.</h1>
Effect.tagifyText('headline');
Effect.multiple($('headline').childNodes,
Effect.Opacity,
{ from:0, to:1,
transition:Effect.Transitions.wobble });
-
Effect.toggle(element, effect[, options])
:检查元素的可见性,并根据需要隐藏或显示它。
effect可以是slide、blind或appear(默认),如Effect.PAIRS中定义的那样。示例代码如下:
// 淡入或淡出
Effect.toggle('target')
// 百叶窗向上或向下
Effect.toggle('target', 'blind')
-
Effect.multiple(elements, effect[, options])
:对
elements中的每个元素调用effect。示例代码如下:
Effect.multiple(['target','target2'], Effect.BlindUp)
Effect.multiple(['target','target2'], Effect.Fade, {duration:4})
综上所述,script.aculo.us库提供了丰富的视觉效果和动画功能,通过核心效果、组合效果、效果选项、过渡、回调和队列等机制,开发者可以创建出各种复杂而生动的动画效果。希望本文能帮助你更好地理解和使用script.aculo.us库。
script.aculo.us库:视觉效果与动画的全面指南
11. 总结与应用建议
script.aculo.us库为开发者提供了一套强大且灵活的工具,用于创建丰富多样的视觉效果和动画。通过核心效果和组合效果的结合,以及效果选项、过渡、回调和队列等机制,开发者可以实现各种复杂的动画场景。
在实际应用中,以下是一些建议:
-
选择合适的效果
:根据具体的需求和场景,选择合适的核心效果或组合效果。例如,如果需要实现元素的淡入淡出效果,可以使用
Fade
或
Appear
组合效果;如果需要实现元素的缩放效果,可以使用
Scale
核心效果。
-
调整效果选项
:利用效果选项来控制效果的持续时间、起始点、结束点、帧率等参数,以达到理想的动画效果。例如,可以通过调整
duration
选项来改变效果的持续时间,通过调整
transition
选项来改变效果的过渡方式。
-
使用回调函数
:回调函数可以在效果的不同阶段执行特定的操作,如在效果开始前、结束后或每次更新时执行代码。可以利用回调函数来实现一些额外的交互效果,如在效果结束后显示提示信息或执行其他动画。
-
管理效果队列
:当需要在同一个元素上执行多个效果时,使用效果队列可以确保效果按顺序执行,避免出现冲突。可以通过设置
queue
选项来控制效果的排队方式,如将效果添加到全局队列或指定的队列中。
12. 示例场景与代码实现
为了更好地理解如何使用script.aculo.us库,以下是一些示例场景及对应的代码实现。
12.1 元素淡入淡出效果
// 元素淡入
new Effect.Appear('elementId', {duration: 2});
// 元素淡出
new Effect.Fade('elementId', {duration: 2});
12.2 元素缩放效果
// 元素放大到200%
new Effect.Scale('elementId', 200, {duration: 1});
// 元素缩小到50%
new Effect.Scale('elementId', 50, {duration: 1});
12.3 元素移动效果
// 元素向右下方移动
new Effect.Move('elementId', {x: 100, y: 100, duration: 2});
// 元素向左上方移动
new Effect.Move('elementId', {x: -100, y: -100, duration: 2});
12.4 组合效果示例
// 元素先放大再淡出
new Effect.Parallel([
new Effect.Scale('elementId', 200, {duration: 1}),
new Effect.Fade('elementId', {duration: 1, delay: 1})
]);
13. 流程图展示
下面是一个简单的流程图,展示了一个元素淡入效果的执行过程:
graph TD;
A[开始] --> B[设置效果选项];
B --> C[开始效果];
C --> D[根据过渡函数计算位置];
D --> E[更新元素状态];
E --> F{效果是否完成};
F -- 否 --> D;
F -- 是 --> G[结束效果];
G --> H[执行回调函数];
H --> I[结束];
14. 注意事项
在使用script.aculo.us库时,需要注意以下几点:
-
兼容性问题
:虽然script.aculo.us库在大多数现代浏览器中都能正常工作,但在一些旧版本的浏览器中可能会存在兼容性问题。在使用前,建议进行充分的测试。
-
性能问题
:过多的动画效果可能会影响页面的性能,特别是在移动设备上。在设计动画效果时,需要考虑性能因素,避免使用过于复杂的效果。
-
依赖关系
:script.aculo.us库依赖于Prototype库,在使用前需要确保Prototype库已经正确引入。
15. 未来发展方向
随着Web技术的不断发展,对于视觉效果和动画的需求也越来越高。script.aculo.us库可以通过以下方式不断发展和改进:
-
支持更多的效果类型
:可以添加更多的核心效果和组合效果,以满足不同的需求。
-
优化性能
:通过优化代码和算法,提高库的性能,特别是在移动设备上的性能。
-
增强兼容性
:确保库在各种浏览器和设备上都能正常工作,提高兼容性。
-
提供更丰富的文档和示例
:提供更详细的文档和更多的示例代码,帮助开发者更好地理解和使用库。
16. 总结
script.aculo.us库是一个功能强大的JavaScript库,为开发者提供了丰富的视觉效果和动画功能。通过本文的介绍,我们了解了库的核心概念、各种效果的使用方法、效果选项的调整、过渡函数的应用、回调函数的使用以及效果队列的管理。同时,我们还通过示例场景和代码实现,展示了如何使用库来创建各种动画效果。在实际应用中,开发者可以根据具体需求选择合适的效果和方法,结合效果选项和回调函数,创建出丰富多样的动画效果。希望本文能帮助你更好地掌握和使用script.aculo.us库,为你的Web项目增添更多的交互性和视觉吸引力。
17. 常见问题解答
以下是一些关于script.aculo.us库的常见问题及解答:
| 问题 | 解答 |
|---|---|
| 如何引入script.aculo.us库? |
首先需要引入Prototype库,然后引入
scriptaculous.js
文件。在Rails项目中,可以使用
javascript_include_tag
辅助方法引入相关文件。示例代码如下:
html<br><script src="/js/prototype.js" type="text/javascript"></script><br><script src="/js/scriptaculous.js" type="text/javascript"></script><br><%= javascript_include_tag :defaults %><br>
|
| 如何创建自定义效果? |
可以通过组合核心效果或创建新的过渡函数来创建自定义效果。例如,可以创建一个新的过渡函数并将其添加到
Effect.Transitions
对象中。
|
| 如何处理效果冲突? |
当在同一个元素上执行多个效果时,可能会出现效果冲突。可以使用效果队列来管理效果的执行顺序,确保效果按顺序执行。通过设置
queue
选项,可以将效果添加到全局队列或指定的队列中。
|
| 如何调试效果? |
可以使用浏览器的开发者工具来调试效果。可以在代码中添加
console.log
语句来输出效果的相关信息,如效果的开始时间、结束时间、当前位置等。同时,可以使用浏览器的调试工具来检查元素的样式和状态,以确保效果按预期执行。
|
通过以上常见问题解答,希望能帮助你解决在使用script.aculo.us库过程中遇到的一些问题。如果还有其他问题,可以参考官方文档或在相关社区寻求帮助。
script.aculo.us动画效果指南
超级会员免费看
1

被折叠的 条评论
为什么被折叠?



