对不起,我的英语不好。英语不是我的母语,我有阅读障碍。
解释我的问题
我一直在尝试创建一个自动从锚点滚动到锚点的菜单。 这是一个简短的 gif,显示了应用程序的工作原理。 但是应用程序必须对用户滚动做出反应,而不是按下那些导航按钮。
此菜单由 ngFor 生成,并且可以计算每个锚点的位置。每次按下按钮时,这些按钮都会通过一个名为“平滑滚动 polyfill”的 API 工作,它们会从我用来确定应用程序位置的 Pos 变量中删除或添加,它使用 API 中的 window.scroll 函数,并且效果很好。
但是当我尝试让它与滚动事件一起工作时,会出现一些挑战。
首先,滚动动画会触发滚动事件,滚动后,应用程序就会变得疯狂。
当您滚动时,您不只是滚动一步。每一步都算作一个姿势。我不知道如何让它工作,所以如果我向下滚动它会先完成滚动动画,然后它会再次监听新的滚动事件。
我的代码
按钮代码
Pos = 1; //Is position of application
ScrollOnButtonPress(UpOrDown:boolean) {
if(UpOrDown) {
if (this.Pos != 0) {
this.Pos--;
window.scroll({ top: this.positionfromTop(this.Pos, false), left: 0, behavior: 'smooth' });
//this.positionfromTop(pos, mode) is here used to calculate the location that we have to go to.
}
} else {
if (this.Pos != this.Alphabet.length-2 && document.body.scrollHeight >= window.scrollY) {
this.Pos++;
window.scroll({ top: this.positionfromTop(this.Pos, false), left: 0, behavior: 'smooth' });
}
}
}
这是我用来使应用程序处理滚动事件的以下代码。我不知道放在这里以使应用程序正常工作。
scrollY_OLD:number;
scrollUpOrDown(event) {
console.log("ScrollEvent triggered");
if(window.scrollY > this.scrollY_OLD) { //ScrollDown
this.ScrollOnButtonPress(true);
} else if (window.scrollY < this.scrollY_OLD) { //ScrollUp
this.ScrollOnButtonPress(false);
} else {
this.scrollY_OLD = window.scrollY;
}
}
最后是 HTML。在 section 标签末尾的第二行是放置的滚动检查部分 (window:scroll)="...
<div class="">
<section *ngFor="let Name of this.NameList ; let i = index;" class="docScroller Everything" (window:scroll)="positionfromTopEventHandler(); scrollUpOrDown(event)">
<div class="ButtonDown"></div>
<ng-container *ngIf="Name.length != 1">
<div class="DisplayName">
<div class="innerContent">
<img class="imgStyle" height="180px" src="https://bytesizemoments.com/wp-content/uploads/2014/04/placeholder.png">
<br><div class="titleInnerContent">{{Name}}</div>
<p>Some description with some text that would be interesting and usefull to know...</p>
</div>
</div>
</ng-container>
<ng-container *ngIf="Name.length == 1" >
<div class="Divider" id="{{Name}}" [style.top.px]="positionfromTop(i, true)" (click)="scrollToNextOne()">
{{Name}}
</div>
<div class="Space"></div>
</ng-container>
</section>
<div (click)="ScrollOnButtonPress(false)"><img class="ArrowDown" src="ArrowDown.png" height="75" width="75" /></div>
<div (click)="ScrollOnButtonPress(true)"><img class="ArrowUp" src="ArrowUp.png" height="75" width="75"/></div>
<div class="PosShower"><a href="#" (click)="Pos=0"><h1>Pos={{Pos}}</h1></a></div>
</div>
我希望我提供了足够的信息。提前致谢。;)
编辑:
我已经使它与 RXJS observable 一起工作。准确地说是一个 fromEvent Observable。这适用于 google chrome、edge 和 Opera。但是,Internet Explorer 和 Firefox 不想工作。然后在所有浏览器中弹出以下内容。
火狐:
The resource from “http://localhost:4200/polyfill.js” was blocked due to MIME type mismatch (X-Content-Type-Options: nosniff).[Learn More] localhost:4200
The resource from “http://localhost:4200/scrollsnap-polyfill.js” was blocked due to MIME type mismatch (X-Content-Type-Options: nosniff).[Learn More] localhost:4200
The resource from “http://localhost:4200/scrollsnap-polyfill.js” was blocked due to MIME type mismatch (X-Content-Type-Options: nosniff).[Learn More]
和谷歌浏览器(编辑仍然有效):
localhost/:14 GET http://localhost:4200/polyfill.js
localhost/:15 GET http://localhost:4200/scrollsnap-polyfill.js
我认为是 polyfill.js 和 scrollsnap-polyfill.js 没有从 ts 编译为 js,但我可能错了。
先谢谢了。