滚动捕捉中断了jQuery动画滚动

时间:2019-10-15 16:05:10

标签: javascript jquery css scroll

我有一个带有强制滚动捕捉的滚动视图:

scroll-snap-type: y mandatory;

我还有一些按钮,它们提供了滚动视图中不同元素的快捷方式。单击按钮时,我使用jQuery将所选元素设置为动画:

$('#scroller').animate({ scrollTop:$('#scroller').scrollTop() + $(element).offset().top -$('#scroller').offset().top }, { duration: 'slow', easing: 'swing'});

这在Safari中非常有效。但是,在Chrome和Firefox(Mac)中,滚动捕捉似乎破坏了jQuery的动画功能。除了平滑滚动之外,该元素还笨拙地进入了视野。如果删除滚动捕捉,它将按预期工作。

我试图变得聪明,每当单击一个按钮时都禁用滚动捕捉,然后在手动鼠标滚轮滚动时再次启用它:

$('#scroller').on('wheel', function(e) {
  $('#scroller').css('scroll-snap-type', 'y mandatory');
});

这样,我就可以在Safari和Firefox中使用它。但是Chrome仍然无法发挥作用。技巧种类是有效的,但奇怪的是,只有一次或两次。单击按钮后,似乎只是忽略了再次启用滚动捕捉。

有人知道如何解决此问题吗?谢谢!

演示:https://codepen.io/gurgel/pen/yLLORar

编辑:阅读this post后,我在使用该smoothscroll polyfill的所有浏览器上都可以使用它。不过,我仍然希望使用香草解决方案-似乎太接近了。

编辑2:为每个建议添加摘要:

$(document).ready(function() {
    
   $('#scroller').on('wheel', function(e) {
     /* This gets the scroll-snapping working again in Firefox, but not in Chrome */
  $('#scroller').css('scroll-snap-type', 'y mandatory');
  });               
  
  
});
  
  
function changeView(index) {
  
  /* Workaround to enable smooth scrolling in Chrome and Firefox  */
  $('#scroller').css('scroll-snap-type', 'none');
  
  var id = 'view ' + index;
  var element = document.getElementById(id);
 $('#scroller').animate({ scrollTop:      $('#scroller').scrollTop() + $(element).offset().top -$('#scroller').offset().top }, { duration: 'slow', easing: 'swing'});
}
#wrapper {
  height:100vh;
  width:50vw;
  overflow: hidden;
  display: flex;
  flex-direction:row;
}
#menu ul {
  list-style:none;
  padding:0 20px 0 0;
  cursor: pointer;
  width:60px;
}
#menu ul li {
  border:1px solid green;
}

#scroller {
  flex-grow:1;
  overflow-y: scroll;
  scroll-snap-type: y mandatory;
  /* 
  This breaks the animated scrolling in Chrome/FF.
  */
}
.view {
  padding:10px;
  scroll-snap-align: start;
}




/* Irrelevant styling */
.view:nth-child(1) {
  background:#b3de81;
}
.view:nth-child(2) {
  background:#6eb5c0;
}
.view:nth-child(3) {
  background:#E94353;
}
.view:nth-child(4) {
  background:#faaf08;
}
.view:nth-child(5) {
  background:#CFA4DB;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="wrapper">
  
  <div id="menu">
  	<ul>
    	<li onclick="changeView(1)">1</li>
  		<li onclick="changeView(2)">2</li>
  		<li onclick="changeView(3)">3</li>
  		<li onclick="changeView(4)">4</li>
  		<li onclick="changeView(5)">5</li>
    </ul>
  </div>
  
  <div id="scroller">
    <div id="view 1" class="view">
     <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    </div>
    <div id="view 2" class="view">
     <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    </div>
    <div id="view 3" class="view">
      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    </div>
    <div id="view 4" class="view">
      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    </div>
    <div id="view 5" class="view">
     <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    </div>
  </div>
</div>

0 个答案:

没有答案