Javascript从滚动事件中获取原始数据

时间:2013-07-10 23:16:01

标签: javascript jquery scroll

有没有办法在不使用scrollTop和scrollLeft的情况下将滚动事件应用于多个元素?我尝试在第一个元素滚动处理程序中添加$('#element2')。scroll(event),但它似乎不起作用。

否则,是否可以获取jQuery用于从javascript滚动事件更新其滚动条的原始数据并手动执行此操作?

我想要这样做的原因主要是因为我无法找到一种可靠的方法来将iframe的高度可靠地调整为内容(如果内容包含未指定高度的元素,则会有一些非常奇怪的现象)。 (或者,如果有人知道这样做的可靠方法那就太棒了)

所以我有一个“视口”,可以这么说,在我的UI中,它包含一个iframe,它包含一个内容页面,如果它比iframe大,你可以滚动它。因为我无法可靠地将iframe的高度调整为其内容,我将iframe高度设置为此视口的高度并将其设置为垂直滚动其内容,但我无法将iframe的宽度设置为视口的宽度它会在内容的css中触发某些媒体查询,即使该内容的html大于该内容。 (如果我可以欺骗iframe认为它的大小与它不同,那么这也可以解决问题)

我的解决方案是将iframe的宽度设置为其内容的宽度,然后在框架周围设置一个包装器,设置为视口的宽度,这将滚动框架。这里的问题是滚动是非常不稳定的,因为iframe只是垂直滚动而且包装只是水平滚动(对角滚动只是向上和向下滚动或者有时突然向侧面滚动)。我想从iframe捕获这些滚动事件,并将它们(或至少它的x组件)应用于包装器,以平滑滚动。

我无法使用scrollLeft()执行此操作的原因是iframe的宽度根据其内容调整大小并且仅垂直滚动,因此scrollLeft始终为0.

很抱歉这么长的解释:/

提前致谢

1 个答案:

答案 0 :(得分:0)

所以我找到了一个似乎运作良好的解决方法。

我添加了一个ui-mask,可以捕获所有滚动输入。掩码需要能够滚动,所以我在掩码中创建了一个大的掩码内容,它不断地获得它的scrollLeft和scrollTop重置(所以你永远不能滚动到它的边缘)。我还将ui-mask包装在一个mask-wrapper中,这样我就可以隐藏滚动条了。

HTML:

<div id="viewport">
  <div id="mask-wrapper">
    <div id="ui-mask">
      <div id="mask-content"></div>
    </div>
  </div>
  <iframe ... ></iframe>
</div>

的CSS:

#viewport {
  overflow-x: scroll;
  width: 100%;
  height: 100%;
}

#mask-wrapper {
  overflow: hidden;
  position: absolute;
  width: 100%;
  height: 100%;
  z-index: 10;
}

#ui-mask {
  overflow: scroll;
  height: 100%;
  width: 100%;
  z-index: 11;
  position: absolute;
  /* To hide the scrollbars (20 is just arbitrary, might want more) */
  right: -20px;
  padding-right: 20px;
  bottom: -20px;
  padding-bottom: 20px;
}

#mask-content {
  width: 200%;
  height: 200%;
  position: absolute;
  left: 0%;
  top: 0%;
}

然后我只是将ui-mask的scrollLeft和scrollTop设置为某个偏移量(这样我们可以滚动所有四个方向)然后将scroll事件绑定到ui-mask。在滚动事件中,我获取并存储ui-mask的scrollTop和scrollLeft(减去偏移量),然后再将它们重置为偏移量。现在我有滚动偏移,我可以使用它来插入我想要的任何其他元素。

(我正在使用coffeescript)

offset = 200 # Offset just needs to be something bigger than what you can scroll in one event
mask = $('#ui-mask')
mask.scrollTop(offset)
mask.scrollLeft(offset)
mask.scroll ->
  top = mask.scrollTop() - offset
  left = mask.scrollLeft() - offset
  mask.scrollLeft(offset)
  mask.scrollTop(offset)
  # Do something with top and left
  $(someEl).scrollLeft($(someEl).scrollLeft() + left)
  $(anotherEl).scrollTop($(anotherEl).scrollTop() + top)