javascript - 如何定位内容以在打开时移动到事件 Accordion 的顶部,这样用户就不必滚动

标签 javascript jquery css accordion

打开时,无法在事件 Accordion 的顶部打开内容。我正在尝试改进用户体验并确保用户无需滚动即可查看内容。就目前而言,打开 Accordion 时内容不在 View 中,用户必须根据单击的内容向上或向下滚动。理想情况下,我想确保事件窗口的内容始终显示在顶部。

  $(document).ready(function() {
  $('.accordian-content').hide();
  $('.accordian-title').click(function() {
  const flag = $(this).find('.accordian-title-icon').hasClass('accordian-title-icon-open');
  	$('.accordian-title-icon').removeClass('accordian-title-icon-open');
    $('.accordian-content').not($(this).next('.accordian-content')).slideUp();
    $(this).next('.accordian-content').slideToggle();
    if(!flag) {
    $(this).find('.accordian-title-icon').addClass('accordian-title-icon-open')
    } else {
     $(this).find('.accordian-title-icon').removeClass('accordian-title-icon-open')
    }
  });
});
.accordian {
  display: block;
  width: 100%;
  margin-top: 1em;
  margin-bottom: 1em;
  border-top: 1px solid black;
  border-right: 1px solid black;
  border-left: 1px solid black;
}
.accordian .accordian-item .accordian-title {
  font-size: 22px;
  border-bottom: 1px solid black;
  padding: 0.5em 1em;
  cursor: pointer;
  font-weight: 700;
}
.accordian .accordian-item .accordian-title .accordian-title-icon {
  background: lightblue;
  border-radius: 50%;
  width: 25px;
  height: 25px;
  display: inline-block;
  text-align: center;
  color: white;
  font-weight: 700;
  margin-right: 1em;
  padding: 0 0 0 1px;
  position: relative;
  vertical-align: top;
}
.accordian .accordian-item .accordian-title .accordian-title-icon:before {
  content: '+';
  display: block;
  position: absolute;
  text-align: center;
  width: 100%;
  margin: -1px;
}
.accordian .accordian-item .accordian-title .accordian-title-icon-open:before {
  display: none;
}
.accordian .accordian-item .accordian-title .accordian-title-icon-open:after {
  content: '-';
  margin-top: -2px;
  margin-left: -1px;
  display: block;
  position: absolute;
  text-align: center;
  width: 100%;
}
.accordian .accordian-item:first-of-type .accordian-title {
  border-top: none;
}
.accordian .accordian-item .accordian-content {
  display: none;
  padding: 0.5em 1em;
  border-bottom: 1px solid black;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>
<div class="accordian">
  
  <a class="accordian-item">
    <div class="accordian-title"><span class="accordian-title-icon"></span>Item One</div>
    <div class="accordian-content">
      <p>At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.
      At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.
      At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.</p>
    </div>
  </a>
  
  <a class="accordian-item">
    <div class="accordian-title"><span class="accordian-title-icon"></span>Item Two</div>
    <div class="accordian-content">
      <p>At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.
      At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.</p>
    </div>
  </a>
  
</div>

最佳答案

当它折叠并滚动到该位置时,您可以获得 Accordion 元素的位置,例如:

var self = $(this);    
$(this).next('.accordian-content').slideToggle('slow', function(){
    var position = self.offset();
  $('body').animate({scrollTop: position.top }, 500, 'swing');
});

这必须在幻灯片结束时完成。

这里的创意工作:https://jsfiddle.net/mvrkb1ba/4/

关于javascript - 如何定位内容以在打开时移动到事件 Accordion 的顶部,这样用户就不必滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48328821/

相关文章:

javascript - jQuery 下拉插件 - 如何知道下拉列表是否打开?

数组中的 Javascript 对象引用

html - Z-index 不起作用;不知道为什么。

html - 在不使用 div 溢出的情况下创建可滚动 block :auto or JS

javascript - 获取具有定义类型的 JSON 对象长度

javascript - 在 JavaScript 中查找文本字符串

使用额外 id 提交的 jQuery 表单序列化

php - 脚本处理过程中的 gif 动画

javascript - 为什么javascript在页面底部或有时从页面顶部运行

javascript - 如何让两个 Javascript div 在彼此重叠时可以拖动?