javascript - 简单 Accordion 在先前打开的 div 关闭后滚动到顶部

标签 javascript jquery css accordion

这个 Accordion 由一个显示 div onclick 的无序列表组成。单击另一个列表项会关闭之前打开的 div。我遇到的问题是内容向上滚动(在 Safari/iOS 和 Firefox 中),因为之前的链接已关闭。

“ Accordion ”在 Chrome 中正常工作,在上一个链接关闭后不向上滚动 div – fiddle here

但是,如果您在 safari 或 Firefox 中打开 fiddle ,您将看到新打开的 div 滚动到顶部。

为了让事情变得有点诡计, Accordion 存在于一个基于百分比的 div 中,该 div 被设置为 overflow:auto;

有谁知道在 Safari、Firefox 等中复制 Chrome 行为的方法吗?

$('.tog').click(function() {
  $(this).closest('li').siblings().find('.tog').removeClass('active').next('div').hide();
  $(this).toggleClass("active").next('div').slideToggle(250);
});
body {
  background: gray;
  padding: 0;
  margin: 0
}

.structure {
  position: absolute;
  overflow: auto;
  width: 100%;
  height: 70%;
  margin-top: 10%;
  background: yellow
}

ul {
  padding: 0;
  list-style: none;
}

ul li {
  margin-bottom: 0;
  padding: 0;
}

a {
  text-decoration: none;
}

button {
  position: relative;
  cursor: pointer;
  display: block;
  width: 100%;
  padding-bottom: 0;
  margin-bottom: 0;
  border: none;
  outline: none;
  text-align: left;
  background: none;
  font-size: 2rem;
}

.projCont {
  float: left;
  width: 100%;
  height: 1000px;
  display: none;
  background: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="structure">
  <ul>
    <li class="shower" id="one">
      <a class="tog" href="#one" onclick="return false;">
        <button>title of project 1</button>
      </a>
      <div class="projCont">
      </div>
    </li>
    <li class="shower" id="two">
      <a class="tog" href="#two" onclick="return false;">
        <button>title of project 2</button>
      </a>
      <div class="projCont">
      </div>
    </li>
    <li class="shower" id="three">
      <a class="tog" href="#three" onclick="return false;">
        <button>title of project 3</button>
      </a>
      <div class="projCont">
      </div>
    </li>
    <li class="shower" id="four">
      <a class="tog" href="#four" onclick="return false;">
        <button>title of project 4</button>
      </a>
      <div class="projCont">
      </div>
    </li>
    <li class="shower" id="five">
      <a class="tog" href="#five" onclick="return false;">
        <button>title of project 5</button>
      </a>
      <div class="projCont">
      </div>
    </li>
    <li class="shower" id="six">
      <a class="tog" href="#six" onclick="return false;">
        <button>title of project 6</button>
      </a>
      <div class="projCont">
      </div>
    </li>
    <li class="shower" id="seven">
      <a class="tog" href="#seven" onclick="return false;">
        <button>title of project 7</button>
      </a>
      <div class="projCont">
      </div>
    </li>
    <li class="shower" id="eight">
      <a class="tog" href="#eight" onclick="return false;">
        <button>title of project 8</button>
      </a>
      <div class="projCont">
      </div>
    </li>
  </ul>
</div>

最佳答案

您正在隐藏当前事件面板 (.hide()) 而没有任何过渡,并在 250 毫秒延迟 (slideToggle(250)) 中打开新面板。

这会导致滚动问题。

要解决此问题,您可以在同一时间范围内过渡到两个面板或从两个面板中删除过渡。

移除过渡

$(this).closest('li').siblings().find('.tog').removeClass('active').next('div').hide();
$(this).toggleClass("active").next('div').show();

有过渡

$(this).closest('li').siblings().find('.tog').removeClass('active').next('div').slideUp(250);
$(this).toggleClass("active").next('div').slideDown(250);

可以这样写,更简洁易懂

$('.tog').click(function(e) {
  e.preventDefault();

  var isCurrentPanelActive = $(this).next('.projCont').hasClass('active');

  if (isCurrentPanelActive) {
    return;
  }

  $('.structure .active').slideUp();
  $(this).next('.projCont').slideDown().addClass('active');
});

此外,您不需要 anchor 标记内的按钮。

<ul>
    <li class="shower" id="one">
      <a class="tog">
                    title of project 1
             </a>
      <div class="projCont">
      </div>
    </li>
</ul>

关于javascript - 简单 Accordion 在先前打开的 div 关闭后滚动到顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49643436/

相关文章:

javascript - 如何将异步获取的 CSS 应用到 View 中

javascript - 为什么要使用 HTML 5 Canvas 标签?

javascript - React - 我的待办事项应用程序中没有调用 mapStateToProps 函数

javascript - 类不是 id 的倒数计时器

javascript - Datatables 不会重新加载 json 数据

javascript - 图像在浏览器中调整大小后如何运行函数? (JS/JQuery)

html - 当你有一个容器时如何使全宽

javascript - Bootstrap 旋转木马不居中

javascript - 在 DIV 元素中加载 javascript 效果

javascript - 使用 gulp-modernizr 如何指定功能选项