【问题标题】:Bootstrap Hamburger not opening引导汉堡不打开
【发布时间】:2020-02-05 19:10:01
【问题描述】:

我已经按照导航栏中的汉堡包的逐步实施过程进行了操作。然而,在调整窗口大小时,导航栏会折叠,但点击它时不会打开。

请参考以下示例代码。我正在使用 bootstrap4 和 angular 6 版本。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>


<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>

<nav class="navbarc navbar-expand-lg navbar-dark shadow-sm p-3 mb-5 rounded navbar-fixed-top" style="padding: 0.5rem !important;
margin-bottom: .5rem !important; border-radius: 4px;
 padding: 05px;">

    <button class="navbar-toggler collapsed" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
      <span class="icon-bar"></span> 
    </button>
    <div class="collapse navbar-collapse" id="navbarNavDropdown">
        <ul class="navbar-nav mr-auto">
            <li class="nav-item">
                <a class="nav-links" style="font-size: 16px;" routerLink="">Special Discount <span class="sr-only">(current)</span></a>
            </li>
            <li class="nav-item">
                <a class="nav-links" style="font-size: 16px;" routerLink="Products">Products on Discount</a>
            </li>

        </ul>
    </div>
</nav>

angular.json
{
    "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
    "version": 1,
    "newProjectRoot": "projects",
    "projects": {
        "myapp": {
            "root": "",
            "sourceRoot": "src",
            "projectType": "application",
            "prefix": "app",
            "schematics": {},
            "architect": {
                "build": {
                    "builder": "@angular-devkit/build-angular:browser",
                    "options": {
                        "outputPath": "dist/myapp",
                        "index": "src/index.html",
                        "main": "src/main.ts",
                        "polyfills": "src/polyfills.ts",
                        "tsConfig": "src/tsconfig.app.json",
                        "assets": [
                            "src/favicon.ico",
                            "src/assets"
                        ],
                        "styles": [
                            "node_modules/bootstrap/dist/css/bootstrap.min.css",
                            "src/styles.css"
                        ],
                        "scripts": [
                            "node_modules/jquery/dist/jquery.min.js",
                            "node_modules/popper.js/dist/popper.min.js",
                            "node_modules/popper.js/dist/umd/popper.min.js",
                            "node_modules/bootstrap/dist/js/bootstrap.min.js"
                        ],
                        "es5BrowserSupport": true
                    },
                    "configurations": {
                        "production": {
                            "fileReplacements": [{
                                "replace": "src/environments/environment.ts",
                                "with": "src/environments/environment.prod.ts"
                            }],
                            "optimization": true,
                            "outputHashing": "all",
                            "sourceMap": false,
                            "extractCss": true,
                            "namedChunks": false,
                            "aot": true,
                            "extractLicenses": true,
                            "vendorChunk": false,
                            "buildOptimizer": true,
                            "budgets": [{
                                "type": "initial",
                                "maximumWarning": "2mb",
                                "maximumError": "5mb"
                            }]
                        }
                    }
                },

package.json -
{
    "name": "myapp",
    "version": "0.0.0",
    "scripts": {
        "ng": "ng",
        "start": "ng serve",
        "build": "ng build",
        "test": "ng test",
        "lint": "ng lint",
        "e2e": "ng e2e"
    },
    "private": true,
    "dependencies": {
        "@angular/animations": "^7.2.15",
        "@angular/cdk": "^6.1.0",
        "@angular/cli": "^6.1.3",
        "@angular/common": "~7.2.0",
        "@angular/compiler": "~7.2.0",
        "@angular/core": "^7.2.15",
        "@angular/forms": "~7.2.0",
        "@angular/material": "^6.1.0",
        "@angular/platform-browser": "~7.2.0",
        "@angular/platform-browser-dynamic": "~7.2.0",
        "@angular/router": "~7.2.0",
        "angular-user-idle": "^2.1.4",
        "bootstrap": "^4.3.1",
        "chart.js": "^2.5.0",
        "core-js": "^2.5.4",
        "forms": "^1.3.1",
        "hammerjs": "^2.0.8",
        "jquery": "^3.3.1",
        "ng-recaptcha": "^5.0.0",
        "ngx-logger": "^4.0.3",
        "npm": "^6.11.3",
        "popper.js": "^1.14.7",
        "rxjs": "~6.3.3",
        "tslib": "^1.9.0",
        "zone.js": "~0.8.26"
    },
    "devDependencies": {
        "@angular-devkit/build-angular": "~0.13.0",
        "@angular/compiler-cli": "~7.2.0",
        "@angular/language-service": "~7.2.0",
        "@types/jasmine": "~2.8.8",
        "@types/jasminewd2": "~2.0.3",
        "@types/node": "~8.9.4",
        "codelyzer": "~4.5.0",
        "jasmine-core": "~2.99.1",
        "jasmine-spec-reporter": "~4.2.1",
        "karma": "~4.0.0",
        "karma-chrome-launcher": "~2.2.0",
        "karma-coverage-istanbul-reporter": "~2.0.1",
        "karma-jasmine": "~1.1.2",
        "karma-jasmine-html-reporter": "^0.2.2",
        "protractor": "~5.4.0",
        "ts-node": "~7.0.0",
        "tslint": "~5.11.0",
        "typescript": "~3.2.2"
    }
}

我希望汉堡在点击事件时显示导航栏内容。 请帮助我了解我哪里出错了。 这方面的任何线索都会有所帮助..

【问题讨论】:

  • 你在哪里添加那些script 元素? Angular 从模板中剥离了这些元素。您应该在脚本数组中的angular.json 文件中添加这两个 URL。
  • 你能重现这个问题吗,这对我来说很好:codesandbox.io/s/youthful-dew-jy62k
  • @David ,引用已经存在于 angular.json 的脚本数组中。请参考以下snipet.-----"scripts": [ "./node_modules/jquery/dist/jquery.min.js", "./node_modules/popper.js/dist/popper.min.js ", "./node_modules/popper.js/dist/umd/popper.min.js", "./node_modules/bootstrap/dist/js/bootstrap.min.js" ], "es5BrowserSupport": true
  • @Cereal,我不明白,为什么汉堡包在“codesandbox”中运行良好而不在我的项目中运行良好??
  • @user3794867 它工作正常,因为他直接在 HTML 文件中导入了依赖项。如果您最终也这样做,它可能也会起作用,但是可能有一些警告,因为它不是在您的 Angular 应用程序中包含文件的推荐方式。

标签: html angular bootstrap-4 angular-ui-bootstrap


【解决方案1】:

您可能缺少参考资料:

 <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" ></script>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
 <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" ></script>

【讨论】:

  • 感谢@SemBauke 的即时响应。正如您所建议的,我已将引用包含在 html 中并在 package.json 中更正了它们的版本。但是汉堡没有打开。如果我在这里遗漏了什么,请你建议一下
【解决方案2】:

Bootstrap 4.3.1 目前依赖于 JQuery 3.3.1,而不是 3.4,还包括 popper。

如 Bootstrap 文档中所写

<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" ></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>

好像有什么变化...尝试使用输入属性..让我们看看

`
"styles": [{
                "input": "src/theme/variables.scss"
              },
              {
                "input": "src/global.scss"
              },
              {
                "input": "node_modules/bootstrap/dist/css/bootstrap.min.css"
              }
            ],
            "scripts": [{
                "input": "node_modules/jquery/dist/jquery.min.js"
              },
              {
                "input": "node_modules/popper.js/dist/esm/popper.min.js"
              },
              {
                "input": "node_modules/bootstrap/dist/js/bootstrap.min.js"
              }
~

【讨论】:

  • 正如你所建议的,我在我的 html 以及 package.json 中更正了 jquery 和 popper 版本。但问题仍然存在。还有什么我可能在这里遗漏的东西吗..
  • 应该在 angular.json 文件而不是 package.json 中
  • angular.json 文件包含脚本数组,其中包括以下内容——“脚本”:[“./node_modules/jquery/dist/jquery.min.js”、“./node_modules/popper.js/ dist/popper.min.js”、“./node_modules/popper.js/dist/umd/popper.min.js”、“./node_modules/bootstrap/dist/js/bootstrap.min.js”]、跨度>
  • 为什么要在 node_modules 之前添加 (./)。它应该是这样 ` "styles": [ "node_modules/bootstrap/dist/css/bootstrap.min.css", "src/styles.scss" ], "scripts": [ "node_modules/jquery/dist/jquery. min.js", "node_modules/bootstrap/dist/js/bootstrap.min.js" ] `
  • 也许您应该在 index.html 文件中添加 CDN。保持冷静!
【解决方案3】:

此链接将为您提供带有 Angular 7 https://embed.plnkr.co/plunk/xH6VJo 的 Bootstrap 4 NavBar 的示例实现。另一个有价值的资源是 Bootstrap 4.1.1 Navbar not working with Angular 6 .. 两者都可以帮助您弄清楚您在实施中缺少什么。

如果您仍然无法使其工作,请发送一个 git 存储库,以便我可以运行您的项目并进行调试。

【讨论】:

  • 我浏览了给定的链接。还是不行。
  • 你能分享你的回购吗?
【解决方案4】:

我编辑了您的导航栏,它应该可以正常工作。如果您有任何其他问题,请随时提出。

<nav class="navbar navbar-expand-lg navbar-light bg-light">
    <a class="navbar-brand" href="#">Your site name</a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="navbarNavDropdown">
        <ul class="navbar-nav">
            <li class="nav-item active">
                <a class="nav-link" href="#">Special Discounts </a>
            </li>
            <li class="nav-item active">
                <a class="nav-link" href="#">Products on Discount</a>
            </li>
        </ul>
    </div>
</nav>

请注意,您的参考资料必须包含在内。

【讨论】:

  • 非常感谢您编辑代码以解决问题,但仍然无法正常工作。我按照您的建议执行了步骤 1) 是否为 popper 和 jquery 建议的版本安装了 npm。 2)我的角度.json中的脚本数组包含----“./node_modules/jquery/dist/jquery.min.js”,“./node_modules/popper.js/dist/popper.min.js”,“。 /node_modules/popper.js/dist/umd/popper.min.js", "./node_modules/bootstrap/dist/js/bootstrap.min.js" ] & header.html 包含您在 中建议的参考
【解决方案5】:

在带有 Angular 的 bootstrap 4 中存在一些已知问题,包括导航栏组件,所以如果你想使用带有 Angular 的 Bootstrap,我建议使用 @ng-bootstrap/ng-bootstrap 或 ngx-bootstrap 包,因为它们是最流行的可能存在的软件包。

如果您想使用自己的实现,可以按照以下步骤进行修复:

  1. 为模板文件中的按钮元素添加点击事件监听器。
<button (click)="toggleNavbarCollapse()">Your icon here</button>
  1. 向组件添加一个属性以跟踪导航栏的状态以及一个切换其值的方法。
navbarCollapsed = true;

toggleNavbarCollapse() {
  this.navbarCollapsed = !this.navbarCollapsed;
}
  1. 从具有类navbar-collapse 的div 中删除collapse 类。
  2. 根据navbarCollapsed 属性动态添加collapse 类。
<div [ngClass]="{ collapse: navbarCollapsed }">...</div>

您可以查看此demo 的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 2022-08-15
    • 2020-10-31
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多