【问题标题】:flex container can't detect window scrollTop offsetflex 容器无法检测到窗口 scrollTop 偏移量
【发布时间】:2019-08-04 05:41:18
【问题描述】:

我需要获取window.pageYOffset || document.documentElement.scrollTop; 值。 确定
1) 如果用户滚动了标题
2)和方向st < delta && lastScrollTop !== 0

$(window).on('scroll', fn) 没有用,所以我使用了$('main').on('scroll', fn)。那是因为我在使用

body {
  display: flex;
  flex-direction: column;
}

但现在我无法拉开滚动距离。有任何想法吗? codepen波纹管

var lastScrollTop = 0;
var delta = 5;


$(window).on('scroll', () => {
     var st = window.pageYOffset || document.documentElement.scrollTop;
     console.log('not triggering', st);
});

$('main').on('scroll', () => {
    var st = window.pageYOffset || document.documentElement.scrollTop;
    console.log('is triggering', st);
});

我正在使用这个解决方案 - https://codepen.io/elna-legzdia/pen/YgYqoW

【问题讨论】:

  • $(window) 不是$('window')
  • 只需使用display: block 创建另一个容器,然后将您的弹性容器放入该容器中。然后从 block 容器中获取您的 scrollTop 值。

标签: javascript jquery html css flexbox


【解决方案1】:

我个人认为更改body元素的显示类型是一个糟糕的选择。它是根容器,谁知道每个浏览器如何指定它的显示。恕我直言,最好创建自己的根元素并从那里开始。

CodePen Example

var $main = $('main');
$main.on('scroll', () => {
  var pos = $main.scrollTop();
  var isTop = pos == 0;
  $main.toggleClass('top', isTop);
  var isBottom = pos + $main.innerHeight() >= $main.prop('scrollHeight');
  $main.toggleClass('bottom', isBottom);
  console.log('is triggering', pos);
});
html, body {
  height: 100vh;
  margin: 0;
  padding: 0;
}

#root {
  height: 100vh;
  display: flex;
  flex-direction: column;
}

.sticky-header, .sticky-footer {
  flex: 0 0 auto;
  background: purple;
}

.sticky-content {
  flex: 1 1 auto;
  overflow-y: scroll;
  background-color: green;
}
.top {
  background-color: yellow;
}
.bottom {
  background-color: orange;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="root">
    <header class="sticky-header">
      <h1>I'm Sticky</h1>
    </header>

    <main class="sticky-content top">
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
      <p>This is a large amount of scrollable content.</p>
    </main>

    <footer class="sticky-footer">
      <small>I'm sticky</small>
    </footer>
  </div>

【讨论】:

    【解决方案2】:

    您在 body 元素上使用了 dispay: flex。这不是一个好主意,请改用 div 。只需在 body 上移除 flex(其他元素都很好),你就可以让它工作了!

    显示:弹性; 弹性方向:列;

    【讨论】:

    • 此解决方案适用于固定的动态高度标题。
    • 就像 Erik 和我所说的那样,这是一个糟糕的设计选择。您可以通过其他 Technic 实现相同的目标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 2012-09-26
    • 1970-01-01
    相关资源
    最近更新 更多