18、script.aculo.us库:视觉效果与动画的全面指南

script.aculo.us动画效果指南

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库过程中遇到的一些问题。如果还有其他问题,可以参考官方文档或在相关社区寻求帮助。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值