【问题标题】:Replace vertical scroll by horizontal scroll vanilla javascript用水平滚动香草javascript替换垂直滚动
【发布时间】:2017-11-22 21:03:39
【问题描述】:

我想在 Vanilla JavaScript 中禁用垂直滚动并将其替换为水平滚动。当我尝试替换我的滚动值时,我被阻止了。我相信有一个简单(非常简单)的解决方案!

/* We define our function ???? */
function replaceVerticalScrollByHorizontal() {
  let scrollX = window.scrollX; /* Horizontal ➡️ */
  let scrollY = window.scrollY; /* Vertical ⬇️ */
  console.log({scrollX, scrollY});

  if (scrollY !== 0) {
    /* If there is a changement in verticalScroll ???? ⬇️ */
    const tempScrollY = scrollY; /* We create a temporary var to stock our scrollY value */
    scrollX = scrollY; /* Horizontal = Vertical */
    scrollY = 0; /* We reset the vertical because we don't want any vertical scroll */
    window.scrollTo(scrollX, scrollY); /* We scroll to our value */
    scrollY = tempScrollY; /* We replace the value of our vertical var with the temporary one */
  }
  /* If no verticalScroll changement, exit of this function ???? ⬇️ */
  return;
}

/* Listener on window once we start scrolling, we run our function ???? */
window.addEventListener('scroll', replaceVerticalScrollByHorizontal);

我的问题有点小问题:https://jsfiddle.net/zynj64m7/2/

【问题讨论】:

    标签: javascript scroll horizontal-scrolling vertical-scrolling


    【解决方案1】:

    如果您只想影响鼠标滚轮事件,您可以尝试使用“滚轮”事件。根据我的测试,这适用于 Firefox 和 Chrome。不是 IE(编辑:实际上该事件确实触发了我用来滚动的方法似乎不起作用,所以你也可以让它在 IE 中工作)。

    然后使用event.deltaY判断滚动是否垂直并阻止它。还可以使用event.deltaY 的方向来水平滚动某个方向(我乘以 5,因为它看起来有点慢,但您可以将滚动量更改为 w/e)。

    更新你jsfiddle

        /* We define our function ? */
        function replaceVerticalScrollByHorizontal(event) {
        	if (event.deltaY != 0) {
          	// manually scroll horizonally instead
            window.scroll(window.scrollX + event.deltaY * 5, window.scrollY);
            
            // prevent vertical scroll
          	event.preventDefault();
          }
          return;
        }
    
        /* Listener on window once we start scrolling, we run our function ? */
        window.addEventListener('wheel', replaceVerticalScrollByHorizontal);
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>
      <h1>Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo</h1>

    【讨论】:

    • 嘿!感谢您的“解决方案”,但滚轮不会阻止其他滚动类型(例如箭头键),我可以为此添加另一个侦听器,但我认为正确的方法是使用“滚动”事件! :) 再次感谢您。
    • 滚动事件的问题是它只有在滚动已经发生后才会触发。因此,即使您将其修复为水平滚动,它也会看起来很卡,因为您必须有效地取消滚动垂直滚动,然后再水平滚动。
    • 谢谢!我不知道 ! :o 实现这一点的方法是使用不同的 addEventListener !
    • 如果你想隐藏垂直滚动条(以防止滚动)你可以使用 css overflow-y: hidden; 或者你需要修复的所有事件的列表看看这个answer
    • preventDefault() 似乎不再起作用,因为滚动事件被认为是被动的:chromestatus.com/features/6662647093133312。工作版本:jsfiddle.net/levigutt/c9L8k3rs/1
    猜你喜欢
    • 2018-04-11
    • 1970-01-01
    • 2021-11-13
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    相关资源
    最近更新 更多