【问题标题】:Custom scrolling animations - pausing sections and scrolling elements horizontally自定义滚动动画 - 暂停部分和水平滚动元素
【发布时间】:2019-11-04 21:48:35
【问题描述】:

有一些单页应用程序,用户可以在其中进行垂直滚动——但页面看起来暂停并水平滚动——然后清除一个部分。

我不确定他们是如何做到这一点的——我已经看到应用了变换样式,但不确定如果用户正常滚动,自然会出现的元素会发生什么变化。

我添加了 jquery 任性函数来检测嵌套展开的时间。

类似这样的:

这是 HTML 片段。幻灯片 1 是整页元素,幻灯片 5 和 6 也是如此。这些可以是菜单的锚点。我有兴趣在这里创建的行为——当用户接近嵌套单元时——它锁定在幻灯片 2 的顶部,然后转换幻灯片 3 和 4。

$win.on('scroll', function() {
  var top = $win.scrollTop() / 3;
  console.log("top", top);
  $nested.css('transform', 'translate(' + -top + 'px, 0)');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="section">slide 1</div>
<div class="nested">
  <div class="section first">slide 2</div>
  <div class="section second">slide 3</div>
  <div class="section third">slide 4</div>
</div>
<div class="section">slide 5</div>
<div class="section">slide 6</div>

JSFiddle Example

【问题讨论】:

  • 我试图捕捉嵌套部分高度和宽度、计数的必要信息——滚动在你向下滚动时工作——我现在试图清除粘性和水平滚动一次最后一部分被清除了——但它的故障继续到幻灯片 5 并反转了功能——jsfiddle.net/zny0c8s6

标签: javascript horizontal-scrolling vertical-scrolling


【解决方案1】:

这只是为了让您了解如何实现它。你需要一个占位符容器 当您的幻灯片成为固定元素时,它会保留垂直空间。

下面的代码可以处理同一个页面中的多张幻灯片,你也可以实现 一旦你有了想法,你自己的。

$('.nested').each(function() {
  let $window = $(window), $body = $('body');
  let $nested = $(this), $nestedPlaceholder = $nested.parent();
  let verticalScrollRange, upperMargin, lowerMargin;
  $window.resize(function(){
    $nested.removeClass("sticky").css({left: 0});
    let placeholderHeight = $nestedPlaceholder.css({height: ''}).height();
    verticalScrollRange = placeholderHeight - $window.height();
    upperMargin = $nestedPlaceholder.offset().top;
    lowerMargin = upperMargin + verticalScrollRange;
    $nestedPlaceholder.height(placeholderHeight);
  });
  $window.scroll(function() {
    let scrollTop = $window.scrollTop();
    if (scrollTop > upperMargin && scrollTop < lowerMargin) {
      $nested.addClass("sticky");
      let horizontalScrollRange = $nested.width() - $body.width();
      let verticalScrollPosition = scrollTop - upperMargin;
      let horizontalScrollPosition = verticalScrollPosition / verticalScrollRange * horizontalScrollRange;
      $nested.css({left: -horizontalScrollPosition});
    } else {
      $nested.removeClass("sticky");
    }
  });
  $window.resize();
});
body {
  background: linear-gradient(to bottom, #ffcb77 0%, #deaaff 100%);
}

.section {
  height: 100vh;
  font-size: 5em;
  text-align: center;
  position: relative;
  border: 1px solid red;
}

.nested .section {
  width: 100vw;
}

.nested-placeholder {
  overflow: hidden;
}

.sticky {
  position: fixed;
  z-index: 1;
  top: 0;
  height: 100vh;
  white-space: nowrap;
}

.sticky .section {
  display: inline-block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="section">Start scrolling down!</div>
<div class="section">slide 1</div>
<div class="nested-placeholder">
  <div class="nested">
    <div class="section first">slide 2</div>
    <div class="section second">slide 3</div>
    <div class="section third">slide 4</div>
  </div>
</div>
<div class="section">slide 5</div>
<div class="section">slide 6</div>

【讨论】:

  • 你的幻灯片在第 4 张幻灯片结束时出现了奇怪的颠簸。这是否也适用于响应式设置 - 就像用户翻转 ipad 方向一样?
  • 您能否修复该错误以使其过渡更顺畅 - 进一步整理代码
  • 你想整理哪一部分?过渡是由于固定.nested 元素的显示/隐藏,无论如何都无法摆脱它。您可以减少从幻灯片中移除边框、边距、填充并使幻灯片与窗口大小完全相同的颠簸。试试看,如果你遇到困难,我会帮助你。
  • 干杯 - 我遇到了另一个需要解决的滚动问题 -- stackoverflow.com/questions/56799635/…
【解决方案2】:

我想出了这个解决方案,它会在幻灯片到达页面顶部时激活水平滚动粘性。

https://jsfiddle.net/zny0c8s6/

当嵌套的幻灯片到达页面顶部时,会在嵌套中添加一个粘性类。这将固定批次位置固定并将嵌套转换为松散的转盘。随着用户继续向下滚动,嵌套将水平平移。清除最后一个嵌套幻灯片后,我删除了粘性类 - 并让用户出现在正常的旅程中,试图将嵌套固定到幻灯片的高度和计数。虽然需要处理反转方向 - 如果有多个嵌套也是如此。

$nested.waypoint(function(direction) {    
  var distance = $nested.offset().top;
  var $nestedHeight = $nested.height();
  var $nestedCount = $nested.find(" > .section").length;
  var $nestedSectionWidth = $nested.next(".section").eq(0).width();

  var clearNestedWidth = $nestedSectionWidth * $nestedCount;
  var $window = $(window);

  $window.scroll(function() {
    if ($window.scrollTop() >= distance) {
      // Your div has reached the top        
      $nested.addClass("sticky");

      var $nestedCompactWidth = $nested.width();    
      var $win = $(window);

      $win.on('scroll', function() {
        var top = $win.scrollTop() / 3;   
        $nested.css('transform', 'translate(' + -top + 'px, 0)');

        if (top >= clearNestedWidth) {
          console.log("cleared slides - now clear sticky")
          $nested.removeClass("sticky");              
          $nested.css('height', $nestedHeight);
          //set scroll to end of slide 2
        }
      });

    } else {
      //$nested.removeClass("sticky");
    }
  });


}, {
  offset: '50%'
});

【讨论】:

  • 翻译可能需要重新评估 var newDistance = top - distance; $nested.css('transform', 'translate(' + ($nestedSectionWidth-newDistance) + 'px, 0)');
  • 如果所有面板都嵌套了怎么办 - 但有些只包含 1 张幻灯片,因此水平幻灯片不显示 - 这样一来,如果将新幻灯片添加到不同的幻灯片,功能可能会更加动态以使其工作独奏区
猜你喜欢
  • 1970-01-01
  • 2021-04-03
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多