以下是 Michał Sajnóg 的客座文章,他是 Netguru 的前端开发人员。Michał 创建了这些“当您滚动到此处时,触发此动画”库之一。我喜欢它的一点是,它尽可能地将创建和控制动画本身留给 CSS。更不用说它在许多生产网站上表现良好,证明了它本身的价值。我将让 Michał 带您了解它。
您是否曾经见过那些长网页,其中不同的动画会在您向下滚动时应用?我想与您分享一个我编写的插件,它可以非常轻松地使用完全的 CSS 控制处理各种动画,而且没有痛苦。
如果您想直接开始使用它,代码在 GitHub 上。
其他库的问题
在我之前的公司,我们使用 WOW.js(或其他类似库)在滚动时为元素设置动画。对于简单的项目来说,这非常好,但在更大的网站上,我们希望对实际发生的事情有更多控制。在所有流行的库中,动画完全由 JavaScript 通过插入内联 CSS 来处理。啊!内联样式是邪恶的。它们很难控制和覆盖。虽然,在某些情况下,可以使用 JavaScript 来设置它们,但仍然更干净,只需将它们留在它们应该在的地方,并在 CSS 文件中处理所有与 CSS 相关的事情。
我决定创建一个库,它的目标很纯粹——检测元素的位置,然后在它们出现在视口中时添加适当的类。
完全在 CSS 中控制动画
我想用我的新库来划分责任
- 将所有逻辑放在 JavaScript 中
- 将所有动画放在 CSS 中
这使您可以轻松添加自己的动画,并执行诸如根据视口更改动画之类的事情。
AOS 的工作原理
AOS 背后的理念很简单:根据您提供的设置,观察所有元素及其位置。然后添加/删除类 aos-animate
。当然,在实践中,它并不总是那么容易,但 AOS 背后的理念就那么简单。动画的各个方面都由 CSS 处理。
CSS 中的动画示例
有很多不同的动画可以立即使用,但创建新的动画也很简单。这是一个示例
[aos="fade"] {
opacity: 0;
transition-property: opacity;
}
[aos="fade"].aos-animate {
opacity: 1;
}
您不必担心持续时间或延迟。在 CSS 中,您只需
- 为
aos
属性添加具有动画名称的样式 - 设置
transition-property
(默认情况下为all
,因此如果您将过渡缩小到预期的属性,它将更高效且更可预测) - 在
.aos-animate
上添加过渡后的属性
持续时间/延迟/缓动之类的内容与动画独立设置。
HTML 示例
<div class="some-item" aos="fade">Example Element</div>
或者使用不同的过渡持续时间
<div class="some-item" aos="fade" aos-duration="500">Example Element</div>
**提示:**您可以使用 data-aos
而不是 aos
使您的 HTML 正确验证。
实时演示
使用不同的动画
查看 CodePen 上 Snik (@michalsnik) 的 Pen AOS – animations。
使用锚点设置
查看 CodePen 上 Snik (@michalsnik) 的 Pen AOS – anchor。
使用锚点放置和不同的缓动
查看 CodePen 上 Snik (@michalsnik) 的 Pen AOS – anchor & anchor-placement。
使用简单的自定义动画
查看 CodePen 上 Snik (@michalsnik) 的 Pen AOS – custom animations。
附加功能
- 锚点 – 基于其他元素的位置为一个元素设置动画
- 锚点放置 – 基于元素在屏幕上的位置为元素设置动画。它不必仅在元素出现在视口中时才设置动画,例如,当它的底部部分接触到屏幕的中间部分时。
- 双向动画 – 默认情况下,元素在您向上和向下滚动时会设置动画,但您可以强制它仅设置一次动画
- 轻松禁用 – 使用预定义的选项(如
mobile
、phone
、tablet
)或自定义条件/函数,在移动设备上禁用动画 - 异步感知 – 在 DOM 更改时重新计算元素的位置,因此在使用 Ajax 加载内容后,您无需担心任何事情(除非您支持 IE9,因为它需要变异观察器)
- 无依赖项 – 此库是用纯 JS 编写的,不依赖于任何依赖项
AOS 完全开源,因此,如果您有一个有趣的想法或某些东西无法按您的预期工作,请打开 issue,并在 GitHub 上 找到您!任何贡献都将受到高度赞赏。
这个插件似乎非常易于使用,我很高兴发现它!
很高兴听到这样的话 :)
不知为何我无法让它正常工作。我使用的是 CDN 版本,并按照 git 设置说明操作,但对我来说什么都不起作用。您知道我哪里可能出错了吗?
我喜欢它附带的所有默认动画,但我仍然更喜欢 jlmakes 的 3.3 KiB scrollreveal.js:https://github.com/jlmakes/scrollreveal.js
Scroll Reveal 也是一个很棒的库——毫无疑问。AOS 提供了类似的功能,但方式略有不同,并为您提供了对动画的更多控制。
最新版本的 Chrome(51)包含一个名为“IntersectionObserver”的新 API,它用于处理检测元素何时进入(“与”)视图。
目前它仅在 Chrome 中可用,但由于 Chrome 是最流行的浏览器,而且大多数用户会在很短的时间内快速更新到最新版本,因此它已经非常“流行”。
感谢您的意见。这是一个非常棒且很有前途的功能,但我愿意支持更多浏览器,因此我宁愿暂时保留现状,它已经过测试,并且似乎在不同的浏览器中运行良好。
这个插件太棒了!我想知道是否可以添加一个功能,让效果只触发一次?
这个插件太棒了!我想知道是否可以添加一个功能,让效果只触发一次?**
谢谢!您可以在初始化 AOS 时设置 once 选项,或者在特定元素上设置 aos-once="true",它就会只动画一次 :)
@pmeriton 谢谢!您可以在初始化 AOS 时设置 `once` 选项,或者在特定元素上设置 `aos-once="true"`,它就会只动画一次 :)
@Ben 这确实是一个很好的功能,但我希望支持更多浏览器,所以我宁愿现在就这样保留。
如果您关心 HTML5 的有效性(谷歌确实关心…),您应该将所有自定义属性添加 “data-” 前缀。
嗨,Phil,你可以使用 `aos` 或 `data-aos`,两种版本都有效。我的朋友前段时间为 AOS 添加了这个功能。
那么,就应该使用正确的 HTML 并使用带有 “data-” 前缀的版本。在我看来,另一个版本根本不应该存在。
如果我在已经可见的元素上使用 data-aos(而不是 aos),这些元素就不会动画。感觉像是小 bug。
@Moo 我会考虑这个,但这将是一个重大改变,因为它会破坏向后兼容性。
@toni 这听起来确实像是 bug。如果你发现了什么,请随时贡献并添加 GitHub 上的 issue :) 这样就更容易跟踪后续更改和现有问题。
嘿,这是一个很棒的库,
这个库可以用来创建视差图片滚动吗?有示例吗?
不幸的是,不行,这个插件没有这个功能。但是,如果你坚持,你可以在背景元素上设置一些锚点,并使用更长的持续时间触发某些动画,比如 transform,这样就可以实现某种视差效果,但这可能不是最佳解决方案。
对于视差,你可以尝试 https://dixonandmoe.com/rellax/ 它看起来是一个很有趣的库,可能适合你的需求 :)
这很棒,谢谢!我一直使用 ScrollReveal,一直在寻找一个流畅、简单的替代方案。这可能就是它。
ScrollReveal 有一个功能,如果能在这里添加会很棒,那就是距离——元素在动画过程中从 A 到 B 移动的距离。如果可以添加,我非常想使用它。
期待使用它!
谢谢 @Daniel,我很高兴你喜欢它。
这是一个很有趣的功能,我很乐意在 GitHub 上讨论它。如果您有想法,请随时添加一个 issue,我很乐意看到其他人对可能的功能有什么看法 :)
天啊… 我正在做一个网站,需要滚动动画,并且有可见的效果。很棒!
我在台式机屏幕上查看了演示 http://michalsnik.github.io/aos/,如果它们应该按照它们工作的方式工作,那么它们工作得很好。我不确定我是否完全理解了这里的情况,因为我在 FF 28 中测试了它。
将它与 Velocity.js 结合起来是否有意义?我的意思是,通过用 Velocity 的缓动函数替换缓动函数,让动画更加平滑一点。这有道理吗?
另一件吸引我眼球的事。当我将浏览器调整为智能手机大小的宽度时,动画几乎总是只在视窗顶部可见。
当我向下滚动到 “Zoom” 部分时,在狭窄视图中根本没有动画。也许让演示响应式,例如,在狭窄视窗(纵向智能手机)上,只有一列动画,可以很好地显示在列的中间,而不是你现在拥有的。这会让演示更加出色,你怎么认为?这样用户就可以检查它在移动设备上的工作情况,我认为这在当今非常重要。
祝贺你做出了伟大的工作。目前正在为客户制作一个单页布局,这可能非常有用。
谢谢。
嗨,你说得完全正确。我必须处理一下这个演示,并让它响应式,希望我能在周末抽出时间 :)
你可能会在调整窗口大小的时候遇到一些问题,因为我今天修复了一个问题,现在应该工作得更好。
说到 Velocity.js——这不是我想要用这个库的方式。整个动画部分是在 CSS 中处理的,因此将缓动函数移动到 JavaScript 中,正是我想用这个库实现的目标的反面。希望你能理解我的观点 :)
但是最近有人提出要添加对 Animate.css 库的支持,我会认真考虑一下。
玩得开心,我们在 GitHub 上见!
不错的东西,这正是我需要的。
哇!我一直在寻找这个!WoW 很棒,但有点太简单了… 我以前用过 superscrollorama… 但是太复杂了,而且已经过时了。
非常感谢,我一定会用它!干得漂亮!
谢谢 John,我真的很感谢 :)
干得漂亮。我们一直在使用 wow.js,但总感觉在行内注入样式规则有点不妥。我刚刚快速浏览了一下 GitHub 上的源代码 JS——您认为使用硬件加速或 `will-change` 属性会有帮助吗?参考:https://dev.opera.com/articles/css-will-change-property/
嗨,Bob,感谢你指出来。不过,我已经把它列入了我的路线图,我很快就会尝试一下,看看它是否真的能提高现代浏览器在这种情况下下的性能。敬请期待。
很棒的资源,我已经在我的一个最新项目中实现了它,感觉很棒。不过,我遇到了一些烦人的 bug。在移动设备上,动画会导致出现 overflow-x,从而在右侧创建空白。有没有办法专门在移动设备上禁用动画?
提前感谢。
嘿,
谢谢!您可以在 `body` 上设置 `overflow-x: hidden`,这应该可以解决这个问题。
但是,如果您想在移动设备上禁用此插件,可以在初始化时设置 `disable` 设置,如下所示
`mobile`——在平板电脑和手机上禁用 AOS
`phone`——在手机上禁用 AOS
`tablet`——在平板电脑上禁用 AOS
您也可以使用一些变量或甚至传递自己的函数,而不是使用预定义的字符串之一 :)
希望您发现这些内容有用!
嗨!
我真的很喜欢你的插件,它超级简单,超级好用。我只有一个问题:有没有办法设置元素在淡入过程中移动的长度?
非常感谢!
干得漂亮!谢谢 :)
看起来很棒,Michal,我很高兴能在一些新项目中试用它。谢谢!
我很高兴发现这个库。感谢您提供它。问题:是否可以将此库用于 WordPress?如果有,您是否有什么推荐或建议?
提前感谢。