Bootstrap 5 offcanvas 在关闭时滚动回到顶部

Bootstrap 5 offcanvas scrolls back to top on close

我有一个简单的 bootstrap 5 offcanvas 元素。这包含一个简单的 link 到 html 页面的 body 中的锚点。

我将 offcanvas 配置为没有背景并启用 body 滚动。

现在,当我打开 offcanvas 并单击 link。 body 滚动到页面的该部分。但是当我关闭画布时。 body 滚动回到顶部。我怎样才能让 body 保持原样?

似乎用于打开画布的按钮重新获得了焦点。我试过这样的东西。

var myOffcanvas = document.getElementById('offcanvasExample');
    //var bsOffcanvas = new bootstrap.Offcanvas(myOffcanvas)
    myOffcanvas.addEventListener('hidden.bs.offcanvas', function (event) {
        //event.stopPropagation();
        //event.preventDefault();
        // Give the document focus
        // Remove focus from any focused element
        if (document.activeElement) {
            document.activeElement.blur();
        }
        window.focus();

    });

但是页面一直滚动回到按钮。

亲切的问候

已解决。该按钮不应使用 data-bs-toggle="offcanvas"。 如果您为使用 bootstrap 的 javascript 函数切换 offcanvas 的按钮创建点击处理程序,则一切正常。

这是我的代码

document.addEventListener("DOMContentLoaded", function(){
  var myOffcanvas = document.getElementById('offcanvasExample');
  var bsOffcanvas = new bootstrap.Offcanvas(myOffcanvas);
  document.getElementById("OpenMenu").addEventListener('click',function (e){
    e.preventDefault();
    e.stopPropagation();
    bsOffcanvas.toggle();
  });
});
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-eOJMYsd53ii+scO/bJGFsiCZc+5NDVN2yr8+0RDqr0Ql0h+rP48ckxlpbzKgwra6" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.bundle.min.js" integrity="sha384-JEW9xMcG8R+pH31jmWH6WWP0WintQrMb4s7ZOdauHnUtxwoG2vI5DkLtS3qm9Ekf" crossorigin="anonymous"></script>
<!-- the Offcanvas button //-->
<button class="nav-link btn btn-outline-primary" id="OpenMenu">open</button>


<!-- the Offcanvas element //-->
<div class="offcanvas offcanvas-start" data-bs-scroll="true" data-bs-backdrop="false" tabindex="-1" id="offcanvasExample" aria-labelledby="offcanvasExampleLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title text-primary" id="offcanvasExampleLabel">Test</h5>
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<a href="#test">test</a>
</div>
</div>
<div class="my-5 py-5">
Test content
</div>
<div class="my-5 py-5">Test content</div>
<div class="my-5 py-5">Test content</div>
<div class="my-5 py-5">Test content</div>
<div class="my-5 py-5">Test content</div>
<div class="my-5 py-5">Test content</div>
<div class="my-5 py-5">Test content</div>
<div class="my-5 py-5">Test content</div>
<div class="my-5 py-5"><a name="test" id="test">Scroll here</a></div>
<div class="my-5 py-5">Test content</div>
<div class="my-5 py-5">Test content</div>
<div class="my-5 py-5">Test content</div>
<div class="my-5 py-5">Test content</div>
<div class="my-5 py-5">Test content</div>

虽然我不使用 Javascript 操作 offcanvas,但我遇到了类似的问题。在关闭的画布上滚动回到顶部。 这里的原因是不同的(我仍然不明白到底发生了什么)。但是,我通过更改打开画布的按钮解决了这个问题,我将 <button type="button"> 标签更改为 <a type="button">.

我写在这里修复它,以防有人有类似的问题。

我遵循了 Roel Van der Plankens 的解决方案并使他的 JS 部分与 ANGULAR 12.

一起工作

如果你的Offcanvas在Header Component中,写这样的:

import { Component, OnInit } from "@angular/core";
import * as bootstrap from "bootstrap";

@Component({
  selector: "app-header",
  templateUrl: "./header.component.html",
  styleUrls: ["./header.component.scss"]
})
export class HeaderComponent implements OnInit {

  ngOnInit(): void {

    const offcanvasNavbar = document.getElementById('offcanvasExample');
    const openOffcanvas = document.getElementById('OpenMenu');

    if (offcanvasNavbar && openOffcanvas != null) {
      const bsOffcanvasNavbar = new bootstrap.Offcanvas(offcanvasNavbar);

      openOffcanvas.addEventListener('click', function () {
        //e.preventDefault();
        //e.stopPropagation();
        bsOffcanvasNavbar.toggle();
      });
    };
  };
};

要完成这项工作,您必须在终端中使用以下命令安装@types/bootstrap:

npm i --save-dev @types/bootstrap

否则无法使用new bootstrap...

与 Roel Van der Plankens 不同,我不需要

e.preventDefault();
e.stopPropagation();

不确定这是因为我的 Bootstrap 版本是 5.1 还是 Angular 12。我把它注释掉了,也许其他人可能需要那部分代码。