Я хочу изменить раздел заголовка при прокрутке горизонтальной боковой панели в angular. Я реализовал это с помощью hostlister, но он работает не так, как задумано.
код в файле example.ts
import {Component,HostListener} from '@angular/core';
/** @title Implicit main content with two sidenavs */
@Component({
selector: 'sidenav-position-example',
templateUrl: 'sidenav-position-example.html',
styleUrls: ['sidenav-position-example.css'],
})
@HostListener('window:scroll', [])
export class SidenavPositionExample {
scrolled : boolean = true;
onWindowScroll() {
this.scrolled = window.pageYOffset >48;
}
}
HTML-код
<div style = "min-height: 150vh;"> <!-- Set minimum height to force a scrollbar -->
<mat-toolbar color = "primary">
<mat-toolbar-row>
<span>Header 1</span>
</mat-toolbar-row>
</mat-toolbar>
<mat-toolbar color = "secondary" style = "position: fixed; top: 0;" *ngIf = "scrolled">
<mat-toolbar-row>
<span>Header 2</span>
</mat-toolbar-row>
</mat-toolbar>
</div>






HostListener не следует помещать в класс компонента, он должен быть внутри методов класса
Эта часть неверна
@HostListener('window:scroll', [])
export class SidenavPositionExample {
Ваш класс компонента должен быть таким
import { Component, HostListener } from '@angular/core';
/** @title Implicit main content with two sidenavs */
@Component({
selector: 'sidenav-position-example',
templateUrl: 'sidenav-position-example.html',
styleUrls: ['sidenav-position-example.css'],
})
export class SidenavPositionExample {
scrolled: boolean = false;
// for initialization
constructor() {
this.scrolled = window.pageYOffset > 48;
}
@HostListener('window:scroll', [])
onWindowScroll() {
this.scrolled = window.pageYOffset > 48;
}
}
Я думаю, это немного не по теме, но не зависит ли от платформы (лучше всего) использовать такое окно в вашем коде? Может быть, есть другой способ избежать этого? Спасибо.
@ DawidZbiński, вы можете вместо этого слушать Element.scrollTop, если прокрутка происходит внутри определенного элемента.
@fridoo У меня небольшой запрос, когда мы извлекаем данные при нажатии кнопки загрузки для загрузки и до тех пор, пока данные не поступают на веб-страницу, которая будет отключена для этого кода, есть ли плохой отзыв, пожалуйста, помогите мне Stack: blitz Ссылка: после нажатия кнопки overlay-loader css класс, который будет загружен, и как только данные будут извлечены, css overlay-loader будет удален ссылка на переполнение стека: stackoverflow.com/questions/54439571/…
Ваше решение отображает только header-2, когда пользователь прокручивает вниз дальше, чем заданное значение, но не будет снова показывать header-1, как только пользователь прокручивает вверх, как на опубликованной вами демонстрационной странице. Заголовок 1 появляется снова, только если пользователь прокручивает обратно вверх.
Чтобы вставить header-1 обратно, как только пользователь прокручивает вверх, вы должны определить текущее направление прокрутки всякий раз, когда запускается событие прокрутки. Для этого вы можете создать наблюдаемый поток позиций прокрутки, сопоставить их направлениям ВВЕРХ / ВНИЗ и соответствующим образом установить состояние заголовка. Затем используйте анимацию для вставки и вывода заголовков в зависимости от наблюдаемого состояния заголовка.
https://stackblitz.com/edit/angular-pj5rjj-8asowc
import { Component, HostListener, AfterViewInit, OnDestroy } from '@angular/core';
import { fromEvent, Subject } from 'rxjs';
import { distinctUntilChanged, map, pairwise, takeUntil, throttleTime } from 'rxjs/operators';
import { animate, state, style, transition, trigger } from '@angular/animations';
export enum VisibilityState { Visible = 'visible', Hidden = 'hidden' }
export enum Direction { None = 'None', Up = 'Up', Down = 'Down' }
@Component({
selector: 'sidenav-position-example',
templateUrl: 'sidenav-position-example.html',
styleUrls: ['sidenav-position-example.css'],
animations: [
trigger('scrollAnimation', [
state(VisibilityState.Visible, style({ transform: 'translateY(0)' })),
state(VisibilityState.Hidden, style({ transform: 'translateY(-64px)' })), // adjust this to the height of your header
transition(`${VisibilityState.Visible} => ${VisibilityState.Hidden}`, animate('250ms')),
transition(`${VisibilityState.Hidden} => ${VisibilityState.Visible}`, animate('250ms'))
])
]
})
export class SidenavPositionExample implements AfterViewInit, OnDestroy {
private destroy$: Subject<boolean> = new Subject<boolean>();
isHeader1Visible = VisibilityState.Visible;
isHeader2Visible = VisibilityState.Hidden;
slideHeader2InAtPosition = 30;
ngAfterViewInit() {
// create an observable stream of scroll positions and map them to UP / DOWN directions
const content = document.querySelector('.scrollWrapper');
// if the scroll events happen on your window you could use 'window' instead of
// 'content' here
const scroll$ = fromEvent(content, 'scroll').pipe(
throttleTime(10),
// if you used 'window' above replace 'content.scrollTop' with 'window.pageYOffset'
map(() => content.scrollTop),
pairwise(),
map(([y1, y2]): Direction => (y2 < y1 ? Direction.Up : (y2 > this.slideHeader2InAtPosition ? Direction.Down : Direction.None))),
distinctUntilChanged(),
takeUntil(this.destroy$)
);
// subscribe to the UP / DOWN scroll direction stream and set the header state accordingly
scroll$.subscribe(dir => {
if (dir === Direction.Down) { // scrolling down
this.isHeader1Visible = VisibilityState.Hidden;
this.isHeader2Visible = VisibilityState.Visible;
} else { // scrolling up
this.isHeader1Visible = VisibilityState.Visible;
this.isHeader2Visible = VisibilityState.Hidden;
}
});
}
ngOnDestroy() {
this.destroy$.next(true);
this.destroy$.unsubscribe();
}
}
Я немного изменил HTML, но вы также можете использовать другую настройку, а затем установить элемент, который будет соответственно прокручиваться в приведенном выше коде, или просто прослушивать события прокрутки на window.
<div class = "headerWrapper">
<mat-toolbar class = "header" color = "primary" [@scrollAnimation] = "isHeader1Visible">
<mat-toolbar-row>
<span>Header 1</span>
</mat-toolbar-row>
</mat-toolbar>
<mat-toolbar class = "header" color = "secondary" [@scrollAnimation] = "isHeader2Visible">
<mat-toolbar-row>
<span>Header 2</span>
</mat-toolbar-row>
</mat-toolbar>
</div>
<div class = "scrollWrapper">
<div class = "scrollContent">
...
</div>
</div>
Я не уверен, что ты имеешь в виду. За событиями прокрутки какого элемента вы хотите наблюдать?
для родительского заголовка, когда мы прокручиваем заголовок, чтобы изменить здесь ссылку stackblitz.com/edit/angular-pj5rjj-wwhv1t?embed=1&file=app/…
@poojariraj что делать под "родительским заголовком"? Размещенный вами stackblitz работает должным образом. Пожалуйста, опубликуйте stackblitz с точной настройкой html вашего приложения, чтобы я мог вам помочь. Как я писал в своем ответе, вы всегда можете прослушивать события прокрутки на window, если вам это нужно.
@friddo Здесь я делюсь ссылкой на stackblitz: stackblitz.com/edit/angular-pj5rjj-zk73b1?embed=1&file=app/… в этом примере у нас есть две полосы прокрутки, когда мы прокручиваем родительскую прокрутку и дочернюю прокрутку, мне нужно, чтобы отображалась одна полоса прокрутки, и когда мы прокручиваем заголовок, чтобы изменить, он должен прокручиваться до последнего content.thanks заранее
@poojariraj Опубликованный вами stackblitz по-прежнему не дает понять, чего вы хотите! Где ваш боковой навигационный контент? Пусто! Удалите мой код и оставьте только свой собственный, сделайте разделы html, которые должны быть прокручиваемыми, прокручиваемыми и четко пометьте их. Например. Вы пометили таблицу в своем коде как прокручиваемую, но не прокручиваемую. Сделайте его прокручиваемым! Также правильно сделайте отступ в коде. Вы также можете добавить к своему вопросу скриншоты своего приложения и отметить там прокручиваемые разделы!
Вы пробовали слушать значение window.pageYOffset, как я написал в своем ответе? Это то, что вы ищете: stackblitz.com/edit/angular-pj5rjj-sgtibu
Да, пятница, большое спасибо .. Как я могу связаться с вами. есть ли linkedin
@poojariraj Я не в linkedin, но вы могли бы проголосовать за мой ответ, если бы я вам помог. Если у вас возникнут дополнительные проблемы, вы можете задать другой вопрос о stackoverflow.
@firdoo как уменьшить высоту строки stackblitz.com/angular/…. вот ссылка thnaks заранее, я пробовал, но не уменьшает
Привет @poojariraj, это отдельный вопрос, не связанный с изменением заголовка при прокрутке. Задайте новый вопрос о stackoverflow. Также считайте принимая ответом, который решил вашу проблему, щелкнув галочку. Это показывает широкому сообществу, что вы нашли решение, и дает некоторую репутацию как автору, так и вам. Это не обязательно.
Пожалуйста, разместите код в строке.