【问题标题】:How can I make a parallax scrolling site that works on iOS and desktop?如何制作适用于 iOS 和桌面的视差滚动网站?
【发布时间】:2012-06-18 17:09:45
【问题描述】:

在你说这不可能之前,我知道这是不可能的。这是一个例子:http://victoriabeckham.landrover.com/INT

主要问题是 iOS 在滚动时冻结了 DOM 操作,因此您必须使用某种技术来克服该问题。我希望使用的视差插件是 stellar.js,但我遇到的问题是该插件的“iOS 演示”在桌面上并不能真正使用。我今天早上摆弄了 3 个小时,但无法获得在 iOS 和桌面上都能正常工作的设置。

我需要一些想法,或者是一种配置 stellar.js 以在两者上以相同方式工作的技术(我不确定这是否可能),或者另一个可以同时在两者上工作的库,或者也许对我如何能有一些见解自己编写一个解决方法。

感谢任何帮助。

【问题讨论】:

  • 我不明白你为什么指望有人说这不可能。
  • +1 仅用于链接该站点。该死的,这是一个不错的设计。

标签: javascript css ios parallax


【解决方案1】:

第 1 步:像这样创建和对象

{
startFrameNumber: {
     //first obj
     id: idOfElement
     duration: howeverManyFrames
     startLeft: whatever
     endLeft: whatever
     startTop: stillWhatever
     endTop: whateverAgain
   },

   nextStartFrameNumber: {

   }
}

第 2 步:通过 CSS 使页面不可滚动,即 100% 的高度和宽度以及溢出:隐藏

第 3 步:当用户滚动时(通过自定义滚动条、键盘操作或触摸事件),根据滚动的距离或其他内容将动画推进 x 帧。如果您创建的动画对象有一个关键[帧],则将其添加到可见和移动的事物队列中,并将队列中的所有这些事物移动到它们的适当位置和/或将它们从活动对象队列中删除

就是这样。移动物体的功能应该非常简单,除了让动画平滑需要一点时间。

【讨论】:

  • 基本上,你是说,让页面不再通过普通浏览器控件滚动,然后使用该JS对象通过视差库控制任何“滚动事件”?你的回答是有道理的,但我认为我需要更多的上下文来具体弄清楚你指的是什么。
  • 到目前为止,这是最好的答案。如果你完成它,我可以奖励它全部赏金。否则,它可能只会得到一半,因为还有很多事情要弄清楚。
  • 这是一个工作示例,它并不真正令人兴奋,但它应该向您展示一切是如何工作的。 jsfiddle.net/rBdY3/14
  • 哦,显然,要添加触摸支持(或其他键盘),您只需像捕获鼠标事件一样捕获这些事件。
【解决方案2】:

只需手动滚动每一层视差效果,自行控制,无需依赖浏览器的页面滚动。

【讨论】:

  • 有点道理。你能提供更多细节吗?我不知道该怎么做。
  • hobberwickey 的回答更详细。简而言之,在使页面适合整个屏幕/不可滚动后,您可以将所有图层放在单独的<div> 中,每个图层都有absolute 定位,然后只需根据视差计算更改计时器/事件的topleft 属性。
【解决方案3】:

Zynga Scroller js library 的帮助下,我成功实现了跨设备/浏览器视差滚动。 它解决了您主要关心的问题之一,即点击和触摸事件的互操作性以及移动 webkit 设备上的滚动——这允许您在滚动时操纵 DOM。

然后,要创建视差效果,您有三个选择:

  1. 使用 3d 变换模拟真实世界的 3d 视差(使用控制透视和变换原点的父/包装元素)。
  2. 使用二维视差库,例如 stellar.js 或 skrollr
  3. 构建您自己的视差滚动算法。
选项 1 的

Here's a quick demo(使用现有示例代码)显示了视差滚动在桌面和移动设备上的流畅程度。当然,您仅限于支持 3d 转换的设备。请注意,Zynga Scroller 通过点击/触摸和拖动来工作——它可能不应该用作桌面解决方案,因为唯一需要的是 CSS 中的 overflow: scroll

【讨论】:

  • 您的快速演示在当前稳定的 Firefox 或 Chrome 版本中不起作用。
  • @arttronics 你能更具体一点吗?您是否尝试使用鼠标滚轮? Zynga 滚动条示例只能通过触摸(或单击)和拖动来工作。
  • 我的台式电脑上没有触摸屏显示器。对于演示,我可以抓取文本,但红色块没有视差效果,因为它们只是随着文本移动。但是,当我将浏览器窗口的大小从“水平非常大”调整为“水平非常小”时,我确实看到红色框垂直动画。可以肯定的是,我通过鼠标单击/抓取,移动鼠标会导致文本/框以打包方式垂直滚动,即没有视差效果。
  • 在 Chrome、Safari 和 Mobile Safari 中非常适合我。 Firefox 有问题,但这是可以预料的,因为您使用的是 -webkit 供应商前缀。
【解决方案4】:

查看 jQuery 插件“滚动路径”http://joelb.me/scrollpath 并将其与不同的层和速度相结合。您将认识到示例页面的滚动不仅仅是垂直视差阶段,而且在您上下滚动时还会水平移动图层。滚动路径可以做到这一点。

【讨论】:

    【解决方案5】:

    尝试同时使用http://cubiq.org/iscroll-4 和 stellar.js。

    【讨论】:

      【解决方案6】:

      正常为桌面做视差处理,然后添加一个“touchmove”事件监听器来触发滚动事件:

      document.body.addEventListener('touchmove', function(){$window.scroll()}, true);
      

      在 iOs 5.1.1 的 iPad 2 上测试和工作

      【讨论】:

      • @OliverJones 首先,您必须为桌面创建视差。这是一个非常简单的例子:http://jsfiddle.net/renan_santos/cJsHd/
      • 不是视差示例,只是滚动交互!从 $(window).scrollTop() 或 window.scrollY 你可以得到滚动的像素数量,然后你可以使用这个值。
      • 这仅部分有效。如果启用了“动量滚动”效果,那么它不会因为滚动的“减速”尾部而触发,只会在用户的手指与屏幕接触时触发。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 2012-06-28
      相关资源
      最近更新 更多