如何检测离子4中的滚动方向

How to detect scroll direction in ionic 4

我想在滚动时隐藏和显示我的标签栏。想要在用户向下滚动时隐藏它并在他们向上滚动时显示它。 onScroll方法中如何判断方向?

下面是我的 onScroll 函数:

onScroll($event: CustomEvent<ScrollDetail>) {
    if ($event && $event.detail && $event.detail.scrollTop) {
        let scrollTop = $event.detail.scrollTop;
        console.log($event, scrollTop);
        document.querySelector('ion-tab-bar').style.display = 'none';
    }
}

我认为你只需要在 ion-content 元素上启用滚动事件(Ionic 4 需要它)并将 ionScroll 事件绑定到你的方法+将你的选项卡可见性绑定到一个变量(我在这个例子中使用了页脚) :

<ion-content padding [scrollEvents]="true" (ionScroll)="onScroll($event)">
  <ion-list>
    <ion-item *ngFor="let item of [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]">
      I am item # {{ item }}
    </ion-item>
  </ion-list>
</ion-content>

<ion-footer [hidden]="footerHidden">
  <ion-toolbar>Hi, I am footer, I hide on scroll down, I am revealed on scroll up</ion-toolbar>
</ion-footer>

现在你的 ts 文件可以是这样的:

  ///
  footerHidden: boolean;

  constructor(
  ) {}

  onScroll(event) {
    // used a couple of "guards" to prevent unnecessary assignments if scrolling in a direction and the var is set already:
    if (event.detail.deltaY > 0 && this.footerHidden) return;
    if (event.detail.deltaY < 0 && !this.footerHidden) return;
    if (event.detail.deltaY > 0) {
      console.log("scrolling down, hiding footer...");
      this.footerHidden = true;
    } else {
      console.log("scrolling up, revealing footer...");
      this.footerHidden = false;
    };
  };
  ///

在此处查看演示:

https://stackblitz.com/edit/ionic-v4-euwnrg

标签更新:

使用 ionic 创建新标签应用(ionic 启动 myTabsApp,然后选择标签启动器)

然后创建共享服务(ionic g,然后生成服务)以便您的选项卡隐藏标志布尔值可以根据需要跨多个页面使用:

import { Injectable } from '@angular/core';

@Injectable({   providedIn: 'root' }) export class FoundationService {

  public hiddenTabs: boolean;

  constructor() { } 
}

然后将基础服务导入您的 tab1 并对您的模板进行更改:

<ion-header>
  <ion-toolbar>
    <ion-title>
      Tab One
    </ion-title>
  </ion-toolbar>
</ion-header>

<ion-content padding [scrollEvents]="true" (ionScroll)="onScroll($event)">
    <ion-list>
      <ion-item *ngFor="let item of [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]">
        I am item # {{ item }}
      </ion-item>
    </ion-list>
</ion-content>

然后更新你的 tab1 ts:

import { Component } from '@angular/core'; import { FoundationService } from '../services/foundation.service';

@Component({   selector: 'app-tab1',   templateUrl: 'tab1.page.html',   styleUrls: ['tab1.page.scss'] }) export class Tab1Page {

  constructor(private foundation: FoundationService) {}

  onScroll(event) {
    // used a couple of "guards" to prevent unnecessary assignments if scrolling in a direction and the var is set already:
    if (event.detail.deltaY > 0 && this.foundation.hiddenTabs) return;
    if (event.detail.deltaY < 0 && !this.foundation.hiddenTabs) return;
    if (event.detail.deltaY > 0) {
      console.log("scrolling down, hiding footer...");
      this.foundation.hiddenTabs = true;
    } else {
      console.log("scrolling up, revealing footer...");
      this.foundation.hiddenTabs = false;
    };   };

}

现在更新tabs.ts导入基础服务:

import { Component } from '@angular/core';
import { FoundationService } from '../services/foundation.service';

@Component({
  selector: 'app-tabs',
  templateUrl: 'tabs.page.html',
  styleUrls: ['tabs.page.scss']
})
export class TabsPage {

  constructor(private foundation: FoundationService) {

  }

}

同时更新选项卡页面的模板以绑定布尔值:

<ion-tabs>

  <ion-tab-bar slot="bottom" [hidden]="foundation.hiddenTabs">
    <ion-tab-button tab="tab1">
      <ion-icon name="flash"></ion-icon>
      <ion-label>Tab One</ion-label>
    </ion-tab-button>

    <ion-tab-button tab="tab2">
      <ion-icon name="apps"></ion-icon>
      <ion-label>Tab Two</ion-label>
    </ion-tab-button>

    <ion-tab-button tab="tab3">
      <ion-icon name="send"></ion-icon>
      <ion-label>Tab Three</ion-label>
    </ion-tab-button>
  </ion-tab-bar>

</ion-tabs>

然后 运行 ionic 发球并尝试一下。 我写的方法相当原始和天真,所以你想更新/调整滚动事件中的哪些变化的逻辑应该要求布尔值是假/真;

使用 deltaY 确实有问题,这里的方法略有不同,但更可靠。

定义变量并存储 lastScrollTop 值,然后将 currentScrollToplastScrollTop

进行比较

在这种情况下 currentScrollTop = event.detail.scrollTop

HTML

<ion-content [scrollEvents]="true" (ionScroll)="handleScroll($event)">
  <!-- Your Structure here -->
</ion-content>

Javascript (v1)

public lastScrollTop = 0;
public isHidden = false;

public handleScroll(event): void {
    this.isHidden = this.lastScrollTop < event.detail.scrollTop;
    this.lastScrollTop = event.detail.scrollTop;
}

Javascript (v2)

public lastScrollTop = 0;


public handleScroll(event): void {

    if(this.lastScrollTop < event.detail.scrollTop) {
        console.log("scrolling down")
    } else {
        console.log("scrolling up")
    }

    this.lastScrollTop = event.detail.scrollTop;
}