【发布时间】:2012-03-24 11:13:47
【问题描述】:
今天我看到了最令人惊叹的 ipad 应用程序,我确信它是使用 html5、css3 和 javascript 编写的...该应用程序最好的部分是他们完美地创建了一个视差滚动...我的问题是...如何?...我找不到任何有关可以在iOS设备上创建视差滚动的文档...如果有人可以给我一个链接或任何有关如何执行此操作的建议,将不胜感激...有人吗? ...亲切的问候J
【问题讨论】:
今天我看到了最令人惊叹的 ipad 应用程序,我确信它是使用 html5、css3 和 javascript 编写的...该应用程序最好的部分是他们完美地创建了一个视差滚动...我的问题是...如何?...我找不到任何有关可以在iOS设备上创建视差滚动的文档...如果有人可以给我一个链接或任何有关如何执行此操作的建议,将不胜感激...有人吗? ...亲切的问候J
【问题讨论】:
我们最近发布了一个在 iPad 上进行视差滚动的网站。有一点解释,这里有一段使用的视频:http://www.aerian.com/portfolio/one-potato/one-potato-html5-website
如果您有 iPad 可以玩,网站本身:
为此,我们编写了一些 JavaScript 库代码,希望在不久的将来开源。
基本思想是编写一个滚动容器,它接受触摸输入并跟踪内容的 x 和 y 位置(如果需要二维)。为了使这种视差成为可能,我们发现最好的方法是使用委托给各种控制器。我不记得我们使用的确切语法而不看
container.on('touchmove', function(e) {
//get our offset
var offset = <some value>; //e.g. { x : 0, y : -1300 }
var easing = 'ease-out';
self.delegate.scrollViewDidScrollToOffsetWithAnimation(self, offset, easing);
});
然后在Controller中,是这样的:
var scrollView = new ScrollView($('#container'));
var controller = {
scrollViewDidScrollToOffsetWithAnimation : function(scrollView, offset, easing) {
//here you need to respond to offset, by changing some css properties of your parallax elements:
parallaxElement.css('transform', 'translate(-offset.x, -offset.y * 0.8)');
anotherParallaxElement.css('transform', 'translate(-offset.x, -offset.y * 0.1)');
}
}
scrollView.setDelegate(controller);
这个委托模式深受 UIKit 的影响,因为我觉得它提供了一种更简洁的方式来通知系统的不同部分另一个事件。我发现使用过多的事件分派变得难以维护,但这完全是另一回事。
希望这会有所帮助。
【讨论】:
这个网站展示了一个很好的例子,说明视差样式效果如何在 iO 上工作https://victoriabeckham.landrover.com/INT
他们根据您提供的输入类型模拟滚动。您实际上并没有滚动页面,然后为各种属性设置动画。它正在读取触摸事件、鼠标滚轮或它们自定义的烘焙滚动条,并查看您想要滚动多少。页面中的所有内容都在一个容器中。这样,当您执行触摸事件时,它只会读取您在页面上的移动量。
最重要的是,他们使用动画循环来让所有东西都移动。他们正在使用 window.requestAnimationFrame 方法来优化他们页面中的更改,以便它在 iPad 和浏览器中顺利运行。这是一个带有描述的页面:
http://paulirish.com/2011/requestanimationframe-for-smart-animating/ 浏览器可以将并发动画一起优化为单个 回流和重绘循环,导致更高保真度的动画。为了 例如,与 CSS 过渡或 SVG 同步的基于 JS 的动画 微笑。另外,如果您在不是 可见,浏览器不会继续运行,这意味着更少的 CPU、GPU、 和内存使用,从而延长电池寿命。
除此之外,他们还构建了一个自定义关键帧对象,该对象将决定页面上所有内容的动画方式。我对这个设置流口水了。太糟糕了,它不是一个开放的框架。您可以在关键帧对象中设置效果的开始位置、结束位置、缓动等,它们的框架将通过动画循环处理所有其余部分。
{
selector: '#outro2 > .content2',
startAt: outroStart+500,
endAt: outroStart+1000,
onEndAnimate:function( anim ) {},
keyframes: [
{
position: 0,
properties: {
"margin-top": 650
}
},
{
position: 1,
ease: TWEEN.Easing.Sinusoidal.EaseOut,
properties: {
"margin-top": 650
}
}
]
},
总之,我相信自定义实现的滚动和使用 requestAnimationFrame 方法的自定义动画循环的组合超越了通常与 iOS 设备相关的视差限制。
【讨论】:
我最近查看了 Skrollr:http://prinzhorn.github.com/skrollr/
该示例在 iO 和桌面上运行良好!
【讨论】:
开发 stellar.js 的 Mark Dalgleish 解释得非常好 how to achieve this using iScroll.js to simulate an iOS scroll(YouTube 视频)。
【讨论】:
我也在考虑这样做。查看 Mark Dalgeish 的 stellar.js。它在大多数情况下都非常有效。如果有人有任何其他链接或信息,很高兴听到。
http://markdalgleish.com/projects/stellar.js/demos/ios.html
它使用可滚动性。我希望像 stellar.js 那样让 scrollarama 在 iPad 上工作。嗯,这就是梦想!
希望这对您的搜索有所帮助。
【讨论】:
我发现这个网站有一篇关于视差的文章在 ios 中效果很好。但是,那只支持触摸设备。如果有人结合起来让它在桌面和 ios 设备上工作,这将是很棒的。 http://torontographic.wordpress.com/2012/08/11/so-you-want-parallax-scrolling-in-ios-ipad-and-ipod/
【讨论】:
目前,这在 iOS 设备上是不可能的。 iOS 设备在滚动期间冻结 DOM 操作,将它们排队以在滚动完成时应用。所以你最多会得到厚实的动画。不要打扰。
【讨论】: