在 Angular 中使用 Parallax.js 会引发错误 "Cannot read property 'getAttribute' of null"

Using Parallax.js in Angular throws error "Cannot read property 'getAttribute' of null"

我正在使用 parallax.js (https://github.com/wagerfield/parallax) 来实现鼠标悬停视差效果。我通过 cdn 和脚本标签将脚本添加到我的 angular 应用程序。 在控制台中显示此错误:

 Uncaught TypeError: Cannot read property 'getAttribute' of null
    at Object.data (parallax.js:23)
    at new t (parallax.js:161)
    at (index):36

我尝试通过 npm 安装库并将其导入 ts 文件,但没有成功。

这是我的 index.html:

<body>
  <app-root></app-root>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/parallax/3.1.0/parallax.min.js"></script>
  <script type="text/javascript">
  var parallaxInstance = new Parallax(document.getElementById('scene'));
  </script>
</body> 

我使用它的组件:

 <ul class="background-video" id="scene">

  <li class="layer" data-depth="0.7"><img src="/assets/parallax/ebene1.png" alt="" srcset=""></li>
  <li class="layer" data-depth="0.5"><img src="/assets/parallax/ebene2.png" alt="" srcset=""></li>
  <li class="layer" data-depth="0.3"><img src="/assets/parallax/ebene3.png" alt="" srcset=""></li>

 </ul>

可能由于 JS 的异步性质,某些事情以错误的顺序发生,因为我能够在这个 运行 中得到它 example(由于依赖性问题,它在 stackblitz 上不起作用但是运行 它在您的本地电脑上有效。

首先从您的 html 示例中删除除根节点之外的节点,然后像这样在其中添加视差组件:

index.html:

 <body>
      <app-root></app-root>
 </body>

app.html:

<parallax></parallax>

既然你在一个组件中使用它,在你的 ng-app 你应该通过将它注入应用程序包来初始化实际组件中的库,就像在你的 angular.json:

"options": {
    "scripts": [
                  "./node_modules/parallax-js/dist/parallax.min.js"
               ]
}

和 importing/initing 它在您的 .ts 文件中,如下所示:

import Parallax from 'parallax-js'
import { Component,AfterContentInit } from '@angular/core';

export class ParallaxComponent implements AfterContentInit {

  constructor() { }

  ngAfterContentInit() {

    const scene = document.getElementById('scene');
    const parallaxInstance = new Parallax(scene, {
      relativeInput: true
    });

  }

}