如何滚动到第一个子div,而不是一个一个一个地滚动到所有目标子div?

时间:2019-04-04 02:51:27

标签: javascript jquery html css

我针对多个容器div中的多个相似的子div。随后,页面滚动到第一个目标子div。

不幸的是,该页面不会滚动到第一个子div,然后停止滚动。该页面不断滚动浏览所有子div。

没有运气,我正在尝试更改此行为。我希望页面只会在第一个子div处停止滚动。

要查看我的实际问题,请单击标题中的任何年份:http://paintings.directory

当前的jQuery代码:

var $sections = $('section');
$('#index_year p, section p').on('click', function(e) {
  let year = $(this).data('y');
  $sections.each(function() {
    let $section = $(this);
    let $target = $('.' + year, $section);
    if ($target.length) {
      $('html, body').animate({
        scrollTop: $target.offset().top - 128
      }, 2000);
      $section.removeClass('yearNotFound');
      $section.animate({
        scrollLeft: $section.scrollLeft() + $target.position().left
      }, 2000);
    } else {
      $section.addClass('yearNotFound');
    };
  });
});

到目前为止,我一直没有成功尝试:

  1. 给我的子div定位一个类,然后滚动到该类的第一个子div,如下所示:
$('html, body').animate({
    scrollTop: $('.class:visible:first').offset().top
}, 1000);
  1. 在当前滚动代码之后添加return, false;,如下所示:
$('html, body').animate({
    scrollTop: $target.offset().top - 128
}, 2000); return, false;
  1. 使用:first选择器,如下所示:
$( "$target:first" )`
    通过单独制作
  1. 将“滚动代码”放置在循环外部
$('#index_year p, section p').on('click', function() {
    $('html, body').animate({
        scrollTop: $target.offset().top - 128
    }, 2000);
});
  1. 添加scrollIntoView,我只是无法想象在哪里以及如何使用它。

到目前为止,它对我来说还算不上,因此我正在寻求帮助。

1 个答案:

答案 0 :(得分:1)

我将第一个具有“ year”类的绘画存储在另一个变量中,以便在循环后继续滚动。

但是具有匹配日期的每个部分的动画必须在循环中...

$('#index_year p, section p').on('click', function(e) {
  let year = $(this).data('y');
  var $storedTarget;

  $sections.each(function() {
    let $section = $(this);
    let $target = $('.' + year, $section);
    if ($target.length) {

      // Store the target here.
      if(typeof($storedTarget) == "undefined"){
        $storedTarget = $target.first();  // The first one!
      }

      // Animate sections left/right if there's a match
      $section.animate({
        scrollLeft: $section.scrollLeft() + $target.position().left
      }, 1500);

      $section.removeClass('yearNotFound');
    } else {
      $section.addClass('yearNotFound');
    }
  });

  // Make sure there is at least a result..
  if($storedTarget.length>0){

    // Scrolling to the first section that has a match
    $('html, body').animate({
      scrollTop: $storedTarget.offset().top - 128
    }, 1500);

  }
});