【问题标题】:Scroll snap CSS skipping elements滚动捕捉 CSS 跳过元素
【发布时间】:2020-08-26 19:55:36
【问题描述】:

长话短说,在 Chrome (81.0.4044.138) 上,由于某种原因,滚动捕捉会跳过 中间 <div class="item2">。在 Firefox (76.0.1) 上它工作正常。知道为什么吗?

 html {
      scroll-snap-type: y mandatory;
    }
    
    body {
      margin: 0;
      padding: 0;
      overflow-x: hidden;
      overflow-y: scroll;
    }
    
    div {
      height: 100vh;
      scroll-snap-align: center;
    }
    
    .item1 {
      background-color: blue;
      font-size: 5rem;
    }
    
    .item2 {
      background-color: yellow;
      font-size: 5rem;
    }
    
    .item3 {
      background-color: red;
      font-size: 5rem;
    }
<body class="container">
        <div class="item1">Hello World</div>
        <div class="item2">Hello World</div>
        <div class="item3">Hello World</div>
    </body>

【问题讨论】:

    标签: html css google-chrome scroll-snap


    【解决方案1】:

    这是我经过一段时间的修补后想出的一种解决方法。 希望这会有所帮助!

    const scrollContainer = document.querySelector('.container')
    
    // don't forget to add "scroll-behavior: smooth;" to the .container CSS
    
    scrollContainer.onwheel = function(event) {
      // use scrollBy using the deltaY just as a direction
      // the exact value is not important because of "scroll-snap-type: y mandatory;"
      scrollContainer.scrollBy(0, event.deltaY);
    
      // this will stop the original scroll event.
      return false;
    };
    body {
      margin: 0;
      padding: 0;
      overflow: hidden;
    }
    
    .container {
      scroll-snap-type: y mandatory;
      scroll-behavior: smooth;
      overflow-y: scroll;
    }
    
    div {
      height: 100vh;
      scroll-snap-align: center;
    }
    
    .item1 {
      background-color: blue;
      font-size: 5rem;
    }
    
    .item2 {
      background-color: yellow;
      font-size: 5rem;
    }
    
    .item3 {
      background-color: red;
      font-size: 5rem;
    }
    <body>
      <div class="container">
        <div class="item1">Hello World</div>
        <div class="item2">Hello World</div>
        <div class="item3">Hello World</div>
      </div>
    </body>

    【讨论】:

      【解决方案2】:

      在子元素上使用 scroll-snap-stop: always;

      【讨论】:

        【解决方案3】:

        实际上,chrome浏览器中存在一个关于它的错误(其背后的原因,直到现在还不清楚,所以没有人知道为什么)。因此,您不能将scroll-snap-type 直接应用于html(同时将其应用于body 也不起作用)标签。因此,为了使其正常工作,您应该创建另一个 div 并将您的元素包装在其中,而不是它。

        所以试试这个吧:

        body {
          margin: 0;
          padding: 0;
          overflow: hidden;
        }
        
        .container {
          scroll-snap-type: y mandatory;
          overflow-y: scroll;
        }
        
        div {
          height: 100vh;
          scroll-snap-align: center;
        }
        
        .item1 {
          background-color: blue;
          font-size: 5rem;
        }
        
        .item2 {
          background-color: yellow;
          font-size: 5rem;
        }
        
        .item3 {
          background-color: red;
          font-size: 5rem;
        }
        <body>
          <div class="container">
            <div class="item1">Hello World</div>
            <div class="item2">Hello World</div>
            <div class="item3">Hello World</div>
          </div>
        </body>

        注意:CSS-tricks 中存在同样的问题。

        【讨论】:

        • 您可以将scroll-snap-type 附加到body。不幸的是,不管你怎么做,这是不可用的 IRL,因为移动浏览器打破了 100vh。滚动html 是他们保持稳定的唯一方法。
        • @lawrence-witt 好吧,正如你所说,我们可以在正文中使用它,但不幸的是它不适用于 Chrome 浏览器,而且它与视口或其他东西无关。此外,在某些情况下,将其附加到 html 在 safari 中不起作用,因此最好将其附加到其他元素。
        猜你喜欢
        • 2019-07-14
        • 2019-09-02
        • 2019-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-07
        • 2017-12-25
        • 1970-01-01
        相关资源
        最近更新 更多