【问题标题】:How can I horizontally scroll div by mouse wheel, locking the body scroll?如何通过鼠标滚轮水平滚动div,锁定正文滚动?
【发布时间】:2019-08-23 05:12:07
【问题描述】:

我确实让我的 div 水平滚动。但它不会用鼠标滚轮滚动。我尝试了“react-scroll-horizo​​ntal”包,但它的主体锁定选项对我不起作用,而且它没有轮子选项。另外,我想锁定我的文档正文滚动,直到 div 完全滚动到它的末尾。所以我想控制和知道我的 div 滚动状态。

handleDivScroll = (e) => {
    const container = document.getElementsByClassName("labels-box");
    console.log(container.scrollTop)
    console.log(container.scrollLeft)
}

<div className="labels-box">
    {this.handleDivScroll}
    <img className="labels" src={LabelImg} alt="" />
    <img className="labels" src={LabelImg} alt="" />
    <img className="labels" src={LabelImg} alt="" />
    <img className="labels" src={LabelImg} alt="" />                              
</div>

这不能很好地显示控制台消息。

.labels-box {
  min-width: 100%;
  display: flex;
  overflow-x: scroll;
}

这会使 div 水平滚动,但鼠标滚轮不起作用。

我也试过了

transform: rotate(-90deg); //for .labels-box
transform: rotate(90deg); //for .labels

但是鼠标滚轮不起作用。

【问题讨论】:

  • @SteveK 这正是我要找的!!
  • 水平滚动默认使用 Shift + 鼠标滚轮。这也正是我作为用户所期望的。我不建议实施除此标准行为之外的任何其他内容。
  • @connexo 好的,谢谢,但我必须这样做..

标签: javascript reactjs ecmascript-6


【解决方案1】:

您可以使用滚动魔法来实现这一点。你可以看到 scrollmagic 库 Here,他们有一个 react 包,你可以使用 npm 或 yarn Here 安装它。我将我评论过的示例推送到了 github,这样您就可以下载存储库并根据自己的喜好自定义 Here。这背后的基本思想是将一个部分固定到窗口,然后水平移动该部分,同时滚动直到完成,然后继续正常向下滚动站点。所以你的组件看起来像下面这样:

import React, { useState } from 'react';
import { Controller, Scene } from 'react-scrollmagic';
import { Tween, Timeline } from 'react-gsap';

const SlideContainer = () => {
  const [state] = useState({
    sections: [
      { id: 1, imgSrc: 'https://placehold.it/1920x1080' },
      { id: 2, imgSrc: 'https://placehold.it/1920x1080' },
      { id: 3, imgSrc: 'https://placehold.it/1920x1080' },
      { id: 4, imgSrc: 'https://placehold.it/1920x1080' }
    ]
  });

  const tweenPercentage = 100 - 100 / state.sections.length;

  return (
    <Controller>
      <Scene triggerHook="onLeave" duration={2000} pin>
        {progress => (
          <div className="pin-container" style={styles.pinContainer}>
            <Timeline totalProgress={progress} paused>
              <Tween from={{ x: '0%' }} to={{ x: '-' + tweenPercentage + '%' }}>
                <div
                  className="slide-container"
                  style={{
                    ...styles.slideContainer,
                    width: state.sections.length + '00%'
                  }}
                >
                  {state.sections.map(section => (
                    <div
                      className="panel"
                      key={section.id}
                      style={styles.panel}
                    >
                      <div
                        style={{
                          background: 'url(' + section.imgSrc + ')',
                          backgroundSize: 'cover',
                          backgroundPosition: 'center',
                          width: '100%',
                          height: '100%'
                        }}
                      />
                    </div>
                  ))}
                </div>
              </Tween>
            </Timeline>
          </div>
        )}
      </Scene>
    </Controller>
  );
};

const styles = {
  normalSection: {
    background: '#282c34',
    height: '100vh',
    display: 'flex',
    alignItems: 'center',
    justifyContent: 'center'
  },
  pinContainer: {
    height: '100vh',
    width: '100%',
    overflow: 'hidden'
  },
  slideContainer: {
    height: '100%',
    display: 'flex'
  },
  panel: {
    flex: 1,
    padding: '40px',
    display: 'flex',
    flexDirection: 'column',
    alignItems: 'center',
    justifyContent: 'center'
  }
};

export default SlideContainer;

在示例中,我只是循环遍历放置在状态中的对象,然后我有一些方程式可以自动设置 div 宽度,但您可以根据自己的喜好轻松自定义它。将 div 放在 .slide-container 内,并确保根据您的喜好设置幻灯片容器的宽度。如果您有任何问题,请告诉我。

【讨论】:

  • 感谢您的回答。但实现这一点不会锁定窗口主体滚动。我怎样才能在 div 中实现它?
  • 没有理由锁定正文。想法是将容器固定到窗口顶部,然后水平滚动该固定容器子 div,直到滚动超过水平内容,然后继续正常滚动。我已经编辑了 github 以更好地展示这一点。所以下载 github 并运行它,你可以看到我在说什么。至于在您的 div 中实现它,您将使用.pin-container 作为将固定到顶部的 div,.scoll-container 将在.pin-container 内水平滚动,直到...
  • ...您设置的补间设置已结束,然后您可以正常向下滚动站点。因此没有理由锁定 body 的滚动功能,因为您将使用原生滚动功能来滚动水平内容。也许我不理解您要达到的目标,因为您的问题有点含糊,这就是我最初发布带有示例的评论的原因。但是请下载修改后的 github 并运行它,如果您仍有问题,请告诉我。 github中有两个不同的例子,所以一直滚动到底部。
  • 好的,我下次再问详细点。我下载了你的 git 代码并尝试了它。你真的很明白我想要做什么。这正是我想要的!!!我非常感谢您的详细和友好的回答:)
  • 我会深入研究,看看你的代码。我自己用这个可以吗????
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
相关资源
最近更新 更多