我正在玩我的新 Nexus 7(我真的很想拥有一台真正的 Android 设备),我注意到随附的 Google+ 应用中有一个很酷的小效果。当您向下滑动时,新的内容模块会向上滑动到位。视频在此处效果最佳
我们可以做到!这是一个非常简单的两步过程
当窗口滚动时,检查模块是否可见
jQuery 有一个 :visible 选择器,但这不是我们这里需要的。我们需要查看元素的任何部分是否在视觉视口中。也就是说,一个元素在技术上可能是可见的,但位于屏幕外。我们可以通过数学计算来确定一个元素是否在视觉视口中。窗口有多宽多高,滚动到多远,元素有多宽多高,它位于哪里等等。幸运的是,jquery-visible 插件很好地总结了这些数学运算。
(function($) {
/**
* Copyright 2012, Digital Fusion
* Licensed under the MIT license.
* http://teamdf.com/jquery-plugins/license/
*
* @author Sam Sehnert
* @desc A small plugin that checks whether elements are within
* the user visible viewport of a web browser.
* only accounts for vertical position, not horizontal.
*/
$.fn.visible = function(partial) {
var $t = $(this),
$w = $(window),
viewTop = $w.scrollTop(),
viewBottom = viewTop + $w.height(),
_top = $t.offset().top,
_bottom = _top + $t.height(),
compareTop = partial === true ? _bottom : _top,
compareBottom = partial === true ? _top : _bottom;
return ((compareBottom <= viewBottom) && (compareTop >= viewTop));
};
})(jQuery);
剩下的就是当窗口“滚动”时使用它来添加一个类名。
$(window).scroll(function(event) {
$(".module").each(function(i, el) {
var el = $(el);
if (el.visible(true)) {
el.addClass("come-in");
}
});
});
CSS 将处理滑入效果
.come-in {
transform: translateY(150px);
animation: come-in 0.8s ease forwards;
}
.come-in:nth-child(odd) {
animation-duration: 0.6s; /* So they look staggered */
}
@keyframes come-in {
to { transform: translateY(0); }
}
如果元素已经可见,则保持原样
因此,我们不会在第一次滑动时对已经可见的模块触发动画,我们将添加一个类名来移除该动画。我们还可以在这里提高效率,“缓存”选择器,这样我们就不必在每次滚动事件(会触发很多次)上查找它们。
var win = $(window);
var allMods = $(".module");
// Already visible modules
allMods.each(function(i, el) {
var el = $(el);
if (el.visible(true)) {
el.addClass("already-visible");
}
});
win.scroll(function(event) {
allMods.each(function(i, el) {
var el = $(el);
if (el.visible(true)) {
el.addClass("come-in");
}
});
});
这就行了
查看 CodePen 上 Chris Coyier 的作品
从底部滑入的盒子 (@chriscoyier)
在 CodePen 上。
请注意,CSS 过渡可以是任何东西。它们可以从侧面滑入,可以使用缩放和不透明度,看起来像是飞入的。可以涉及颜色。随便。
很酷,但滑动效果只在您第一次向下滚动时有效……
是的,它在 G+ 应用中就是这样工作的。就像一个视觉指示器“这是新的,您以前没有见过”。
查看 此分支 以了解向下和向上滚动时不同的效果。
我敢肯定这里还使用了 AJAX 式的无限滚动功能。在我的 Nexus 10 上,似乎还有很多动画。它就像从上面和上面而来……如果这说得通的话。就像一个 3D 过渡。
您可以通过将 visible 插件与 toggleClass 函数关联来使其双向工作。例如。但请注意,当您向上滚动时,效果很奇怪——一点也不直观。
同意 Anja 的观点。
“这是新的,您以前没有见过。”……我认为这是一种非常主观的解释。
我个人认为这种行为仅仅是对 UI 体验的增强,仅此而已。
如果您曾经见过 iPhone/iPad 应用 Vodio,它在向下滚动时具有非常类似的效果,但在向上滚动时也具有。
它确实感觉更“完整”。
继续,查看 Vodio 并亲自体验。
我试图在我的网站上使用类似的东西,但我无法使其工作。起初我以为是我自己的问题,但我尝试从 codepen 复制整个工作代码,它会立即执行所有动画,而不是在滚动时。
这里哪里出错了?
非常巧妙,我相信我们现在将在大量基于网格的网站上看到它。
太棒了 Chris :D
很高兴看到它是如何完成的,最简单的途径通常是正确的途径
在桌面端效果很好,但在我的 HTC One X 上的 Chrome 中,该框首先出现在其最终位置,然后跳下并进行滑入动画到其最终位置。Nexus 7 上也是这样吗?
移动版 Safari 这里也存在完全相同的问题。您是否已经弄清楚问题出在哪里?
将已查看的元素从缓存数组中删除是否有益,这样如果页面上有数百个元素,您正在迭代的数组会随着您的操作而变得越来越小?
非常聪明
做得好!一个小小的挑剔的观察。将删除的类称为“模块”似乎有点令人困惑(对我来说)。如果您与其他开发人员一起工作,我可能会将这些元素归类为“off-window”或与“come-in”主题保持一致,“on-waitlist”。^_^
喜欢这个。我将来一定会用到它!
注意
“它滚动了多少”,
应该正确地写成
“它滚动了多远”,
谢谢。因为已修复,所以将其隐藏。
哈哈,“我真的很想拥有一台真正的 Android 设备”:D Nexus 7 确实很棒 :)
抱歉各位,但我无法获得输出,请指出我犯了什么错误?
使用 visible 插件的正确方法是?
此致
John
嘿,我也遇到错误了……
查看我的 -> http://goo.gl/Niqiz
你能告诉我哪里错了?
很巧妙的技巧。在桌面版 Windows Chrome 中有效,但在 Firefox 中无效。好吧——这不是什么大问题,这只是一个增强功能。但有没有可能让它在 Firefox 中也能运行?
在我的桌面版 Firefox 上运行没有任何问题。
尝试通过您的 Apache 服务器,假设您有一个。我发现 Firefox 在脱机工作时无法很好地初始化 js。不确定为什么会出现这种情况,但这就是解决方案。
很棒的作品,我前几天买了一台 Nexus 4,因为想要一部 Android 手机(一直都是 iPhone),我几周前看到了这个和其他一些东西,他们添加了一些不错的小效果来保持您的兴趣,大多数人不会注意到(我的妻子)。很棒的代码片段
不错,我一直很喜欢这种效果,很高兴看到一种简单的方法来模仿它。
它似乎只在 Safari 中以相反的方向工作
这个页面上的那个 - 是的!即使在 Chrome 中也是如此。JSFiddle 版本似乎可以在两个方向上工作 :-)
哇!我昨天刚做了笔记,想弄清楚如何做到这一点,以便为客户显示一个很长的作品集项目列表。谢谢!
这个 jQuery 插件在我的 Safari 移动版或 Chrome 移动版(在我的 iPhone5 上)上似乎不起作用。还有其他人能够在移动设备上看到此插件工作吗?我在几周前在我的一个笔上使用了它,并注意到了同样的问题:http://codepen.io/dganoff/full/jtvay
大多数移动设备在滚动时不会暂停动画吗?
来这里说这个,因为移动 Safari 确实会这样做。
这真是太棒了 :P 您是否认为它可以与延迟加载图库或 WordPress 帖子(例如)一起使用?
那真是不错!我将在我的下一个基于网格的设计中实现这一点。
刚刚将 Google+ 应用添加到我的 iPad 中,它具有相同的效果,但更好,它们会飞进来。太棒了
我将在我的下一个基于网格的设计中实现这一点。
这是我的分支。现在动画可以在两个方向上工作。
http://codepen.io/PawelGIX/pen/kmhLl
Yo,Pawel,这真是太棒了!!!它确实可以双向工作!!!
这正是我认为这种效果应该如何工作。
Meh。这里有太多动画了。我更喜欢 Google+ 上仅针对新内容提供的有限动画。
我也是。Google 不会做一些“制作很酷的动画,哈哈很有趣!”的事情。这是一个帮助用户了解新内容何时开始的功能。
这正是我认为这种效果不应该如何工作。
这看起来真的很棒,而且它是一种即时的灵感。只有一个潜在的缺点 - 因为我正在完成一个稍微类似于这个的网站,但只有四个方块,(临时位置Mambo Stars 临时)你甚至无法想象它在 IE 10 以下版本中看起来有多可怕。必须从头开始创建条件样式表,它实际上是一个全新的网站,这个我甚至不想想象。
Chris,IE7 总是让人抓狂 :)
非常聪明,而且很棒!您无需在已经看过动画后再次查看它。这样就完美了
这个动画当然很漂亮。我真的很喜欢它,但我不知道它是否有用。即使没有这个动画,您也知道您没有看到隐藏的内容。对我来说没有意义。
我完全不明白为什么这对我来说不起作用,即使我尝试制作与 Codepen 上完全相同的东西。
好东西!我在使用代码时遇到了一些麻烦。(可能与上面 Kris 和其他人遇到的问题相同)
解决方案
我认为 Codepen 使用 SCSS,这不是必需的
您已在 Codepen 中启用了“前缀免费”选项,这意味着 Codepen 将添加必要的上前缀。当您将代码复制到自己的服务器时,您需要添加前缀。
这是一个在 Chromium 和 Firefox 中有效的 Codepen
感谢您的回答!它帮助我调试了我遇到的问题 :)
不错的效果,真的谢谢!
太棒了..它在台式机上运行良好,但在手机上不行?有没有办法让它在手机上工作?
谢谢 :)
当您缓慢滚动时,它还可以,但快速滚动时它是什么样子,尤其是在智能手机上。
在 iPhone 上滚动时,动画也会被锁定。
这很棒,喜欢这个实现!对于更高级的“是否可见”,我建议您查看 jQuery.fracs。
也适用于 Zepto!
我只是想提一下,这在 Canary 上不起作用,因为它不再允许使用 MIME 类型错误的脚本。
抱歉,我的意思是 CodePen 示例不起作用,而不是方法。
另请参阅 stroll.js:http://lab.hakim.se/scroll-effects/
在 Chrome 中,当应用类
.come-in时,元素会立即出现在其最终位置,然后向下平移 150px。Chrome 似乎在平移之前就在屏幕上绘制了<div>。这在视觉上有点刺眼,并且稍微破坏了效果。要解决此问题,元素应默认不可见然后,在 js 应用类
.come-in后,它可以使用一行 jQuery 取消visibility属性可见性检测插件会忽略 css 可见性属性,因此这不会干扰它,如果用户禁用了 javascript,则
.come-in将永远不会被应用,因此内容将永远不会被隐藏!哦,实际上,应将
visibility: hidden;应用于.module。我的类混淆了!如果要确保与非 js 用户兼容,则应使用 javascript 而不是 css 应用
visibility: hidden;。结合我上面评论中的 js,这应该按承诺工作!:P
我想通过 ajax 来实现这一点,这样当用户向下滚动时,它会自动获取结果,在我的例子中是图像,并使用相同的 css3 效果显示它。有办法吗?
感谢脚本。它正在工作!我现在只有一个问题。是否可以稍后触发事件(给它一个特定像素/屏幕高度百分比的偏移量)。因此,当元素在某个“查看高度”处滚动时触发事件?
感谢您的努力
这有点慢吗?
我不知道为什么,但是
if (el.visible(true)) {el.addClass("come-in");
}
这部分会触发我的重新计算样式(Chrome 时间轴),即使我还没有为我的
come-in类设置样式。当我滚动足够多时,例如超过 20 个元素(大而重),体验非常糟糕。此脚本不起作用。奇怪。我将 SCSS 编译成 CSS,包含 jQuery,将完全相同的 JS 和 HTML 复制到纯文本文件中,制作了一个简单的演示,但不起作用。有人知道原因吗?
这里也是同样的问题。当我让它工作时,只有在你重新加载页面底部并向上滚动时它才会工作。
我一直在努力让该脚本工作几个小时,直到我删除了 body height:100%;现在它运行完美了。
这种新效果叫什么名字?我在很多网站上都见过。
它不起作用……请帮帮我。
在进行 BrowserStack 测试时,旧版本的 IE 无法正常工作。这没问题,但回退方案导致出现一行方块,顶部有一个很大的空白区域。
有什么方法可以使其更优雅地回退吗?
谢谢
你好,Chris,
我想尝试这种效果,但遇到了问题。
我尝试复制所有这些代码,但没有任何反应。
我应该怎么做才能运行这种效果?
太棒了!
我有一个额外的优化:在调整大小的时候。