前一段时间,我做了一个关于视差背景的 小演示。简单回顾一下,视差就是背景有多个不同的层,每个层以不同的速度移动,从而产生非常独特的 3D 效果(想想刺猬索尼克)。在最初的演示中,唯一可以看到视差效果的方法是调整浏览器窗口的大小。
最近,Paul Hayes 采用了这个例子并加以改进。他使用了非常酷的 -webkit-transition 属性,使视差效果可以在无需调整浏览器窗口大小或使用 JavaScript 的情况下移动。Paul 做得非常棒,演示效果也很好,但当然,因为它使用了专有的 CSS 扩展,所以它只在非常现代的基于 WebKit 的浏览器(Safari 4 和 Google Chrome)中有效。
虽然 Paul 的示例是未来此类效果的理想实现方式,但我认为在原始示例中添加一点 JavaScript 并发布一个自动移动版本可能会很酷,这个版本应该可以在所有浏览器中运行*。
工作原理
每个“层”只是一个覆盖整个屏幕的绝对定位的 div。
<div id="background"></div>
<div id="midground"></div>
<div id="foreground"></div>
#background {
background: url(../images/background.png) repeat 5% 5%;
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
z-index: 100;
}
#midground {
background: url(../images/midground.png) repeat 20% 20%;
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
z-index: 200;
}
#foreground {
background: url(../images/foreground.png) repeat 90% 110%;
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
z-index: 300;
}
背景图片是重复的,并使用百分比设置。百分比是使视差效果正常工作的关键。但在这个新的 JavaScript 版本中,我们将覆盖这些百分比并对这些值进行动画处理。这需要使用 jQuery 的 backgroundPosition 插件,因为 jQuery 本身无法对 backgroundPosition 属性进行动画处理。
<script src="js/jquery-1.3.2.min.js" type="text/javascript"></script>
<script src="js/jquery.backgroundPosition.js" type="text/javascript"></script>
<script type="text/javascript">
$(function(){
$('#midground').css({backgroundPosition: '0px 0px'});
$('#foreground').css({backgroundPosition: '0px 0px'});
$('#background').css({backgroundPosition: '0px 0px'});
$('#midground').animate({
backgroundPosition:"(-10000px -2000px)"
}, 240000, 'linear');
$('#foreground').animate({
backgroundPosition:"(-10000px -2000px)"
}, 120000, 'linear');
$('#background').animate({
backgroundPosition:"(-10000px -2000px)"
}, 480000, 'linear');
});
</script>
请注意,在开始动画之前,我们必须在 JavaScript 中重置 backgroundPosition。很奇怪……但这是插件正常工作的一个要求。
延长动画时长
动画函数中的那些大数字(例如 120000)代表千分之一秒。所以 120000 = 120 秒 = 2 分钟。更改这些数字,您可以延长或缩短动画时长。它不是无限的……可能有一种方法可以做到这一点,我只是没有完全想通。也许可以将动画抽象成一个函数,然后可以在回调函数中(或其他方式)再次调用它。
*视差效果高度依赖于透明度。如果您需要它在 IE 6 中工作,请查看 Unit PNG 修复 或 DD_belatedPNG。
这是一个不错的小技巧,尽管在我看来动画有点卡顿。我建议它可能更适合使用较小的背景图像来实现效果——例如,用于动画化 SilverBack 中的树叶效果。
视差真的很酷。如果您也这么认为,请务必查看这个很棒的 jQuery 插件:http://webdev.stephband.info/parallax.html。它允许根据鼠标移动创建动画——只需查看演示即可。
无论如何,Chris 的示例很好。实际上在任何网页设计中都不会真正看到它被使用(因为它过于夸张),但对于一些小东西来说可能很有趣。
继续努力!
酷。:D 希望没有客户会想要这个!
哈哈哈,为什么?这是一个很好的效果!
我认为这很简洁,但应该非常谨慎地使用。动画对我来说有点卡顿,我注意到我的处理器使用率飙升至 100%。
对于大约 3 GHz 的处理器来说,这个背景消耗了大量的能量。
我正在运行新的 Safari 3 Beta 版,考虑到我使用的是一台 4 年前的 Mac,它的渲染和运行效果非常好!很高兴看到新的想法
哎呀,我的意思是说我使用的是 Safari 4 Beta 版:) 这并不重要!
我使用的是 Safari 3.2,它运行完美!
噱头
可惜它不支持 MF。
非常酷——谢谢——对于那些计划使用它的人来说,它确实会消耗大量的 CPU。
嗯……只有 Safari 4?我使用的是 Safari 3.2.1,并且……它可以运行!
很棒的概念。我认为重点在于它 *可以* 实现,但不一定非得用星星。我想到了 Clearleft 为 Silverback 创建的预览网站。如果树叶缓慢地左右移动,那就太好了。感谢分享。
当我不得不滚动页面时遇到了一个问题:背景没有滚动,并且出现了一条白条。我只是将您的 background:absolute 语句更改为 background:fixed,问题就消失了。
我看到同样的情况发生(使用 Chrome)。背景在页面加载时仅为视口宽度的 100%。因此,如果您在加载时没有最大化浏览器,则向下滚动时会出现白条。
你疯了吗?!为什么世界上有人会用这个?!这是我见过的最没用的东西,它是对大量专业网页设计师和开发人员所付出的努力的侮辱,他们努力让互联网摆脱这种垃圾,但是不,总有一些蠢货跳出来宣传这种垃圾。求求你,关闭你的网站吧,我们恳求你
我喜欢你过来评论,Razvan,这总是那么有启发性。
哈哈,很高兴看到“愤怒的白人”的原型确实存在:P
有些人一定过着非常有压力的生活。
我认为它很棒。
显然,演示必须很大并且是全屏的,这样才能获得完整的效果,但如果有人认为你只需“复制并使用”这样的资源,那么他们就是错的。
这可以用多种方式实现,其中大多数更微妙且非常有品位。
听到那个家伙的网站被关闭后,他却说自己是“专业人士”,真是有趣……
这确实是一个很棒的效果,我可以看到它可以被使用(和滥用)。创造性地使用它来制作非常好的效果,而无需依赖 Flash,并为网站增添一些活力,这潜力巨大。
我真不明白那些抱怨 CPU 使用率的人。我正在使用一台装有 Vista 的笔记本电脑,并没有遇到任何速度变慢的情况。
@Razvan
尝试查看多篇文章,你就会发现这个网站是一个很棒的资源。另外,没有人期望你在全屏背景中添加乱七八糟的星星,这叫做尝试看看哪些是可能的(在这种情况下使用视差效果)。也许如果你发挥一下想象力,就能想到一些创造性地使用它的方法。
LOL @ Razvan。
我倾向于同意,我喜欢你的作品,但是我不认为我会实现这个。感谢你的辛勤工作。
不错的技巧,我认为如果你明智而谨慎地使用它,它可以为你的网站增加价值。无论如何,感谢你让我们知道它。
是的,很酷,但没什么用…我认为任何头脑清醒的人都不会发布一个有这种背景的网站 :)
我认为这很厉害。虽然这个例子可能不是你在现实世界中会看到的,但毫无疑问,这项技术会被非常有才华的设计师使用,你最终会再次仰慕他们。
非常棒的效果,但我刚刚遇到一个小问题,如果页面需要滚动,你会错过一部分背景。没有尝试任何东西,但是将背景div的position属性设置为fixed而不是absolute可能会解决问题。
也许他应该使用Canvas标签来实现这种效果,这样应该会更快,并且给你更多选择…
这个“小技巧”消耗了我所有的CPU资源 :-)
哈哈哈,同意,很不错,但与“可访问性”不符。
视差太有趣了!互联网上应该有更多类似的东西(我一直很喜欢动画水平线,它们什么时候会卷土重来?)
我用它做了一个标题作为致敬,并在开发期间将其放在客户的网站上作为一种玩笑,然后他们竟然不允许我把它去掉,他们太喜欢它了。
http://wearerealgold.com/
很棒的技术。我绝对喜欢这项技术。它可以在很多项目中派上用场,尤其是在与宇宙学相关的项目中。
Chris,很棒的作品!!
很棒的功能…
但如果它能随着鼠标移动而工作就更好了,就像我之前看到的那样!!!
无论如何,继续努力,干杯和问候!!
嗨,我正在运行从nettus那里学到的Javascript Innerfade文件。(图像之间切换)。我尝试将它与这个巧妙的小技巧结合起来,但它似乎不喜欢这样。它只会执行其中一个。我做了一些测试,我注意到它是否读取它取决于层次结构,就像级联一样。
如果它位于文件之上,则Innerfade js文件读取,如果它位于Innerfade js文件之下。然后它可以工作,但是我所有的图像都不会过渡,只会显示。
我知道这不在本文的讨论范围内,但是如果你有任何建议可以帮助我修复它,以便我的Innerfade可以正常工作,以及背景位置动画技巧,那就太好了。谢谢!
http://studio.production.com/
看看这个,我在这里使用了它..
非常感谢,它看起来真的很棒。
如何将其扩展到整个页面,以便如果我滚动,也可以在下面看到效果?
在最新版本的jQuery中不起作用。不过,使用旧版本可以正常工作。
亲爱的Chris,
我经常访问你的网站,我不得不说这个教程给了我设计太空主题网站的理由;这太棒了。
以下是我使用它的一种方式!
感谢一切!
好吧,我使用纯JavaScript,在没有jQuery插件的情况下,制作了一个简单的鼠标移动视差效果。它在CodePen上。
http://codepen.io/vahidseo/details/qahfL