Как изменить раздел заголовка при прокрутке в Angular?

Я хочу изменить раздел заголовка при прокрутке горизонтальной боковой панели в 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>

Стекблиц того, что я пробовал

Демо того, что я хочу

Пожалуйста, разместите код в строке.

mrkernelpanic 07.01.2019 11:17
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
1
4 237
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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;
  }
}

Я думаю, это немного не по теме, но не зависит ли от платформы (лучше всего) использовать такое окно в вашем коде? Может быть, есть другой способ избежать этого? Спасибо.

Dawid Zbiński 07.01.2019 13:53

@ DawidZbiński, вы можете вместо этого слушать Element.scrollTop, если прокрутка происходит внутри определенного элемента.

frido 07.01.2019 14:22

@fridoo У меня небольшой запрос, когда мы извлекаем данные при нажатии кнопки загрузки для загрузки и до тех пор, пока данные не поступают на веб-страницу, которая будет отключена для этого кода, есть ли плохой отзыв, пожалуйста, помогите мне Stack: blitz Ссылка: после нажатия кнопки overlay-loader css класс, который будет загружен, и как только данные будут извлечены, css overlay-loader будет удален ссылка на переполнение стека: stackoverflow.com/questions/54439571/…

poojari raj 30.01.2019 12:57
Ответ принят как подходящий

Ваше решение отображает только 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/… для приведенного выше, если нам нужно сохранить тот же эффект заголовка для родительской прокрутки, как мы можем достичь. Вместо создания содержимого
poojari raj 08.01.2019 12:56

Я не уверен, что ты имеешь в виду. За событиями прокрутки какого элемента вы хотите наблюдать?

frido 08.01.2019 13:07

для родительского заголовка, когда мы прокручиваем заголовок, чтобы изменить здесь ссылку stackblitz.com/edit/angular-pj5rjj-wwhv1t?embed=1&file=app/…

poojari raj 09.01.2019 07:57

@poojariraj что делать под "родительским заголовком"? Размещенный вами stackblitz работает должным образом. Пожалуйста, опубликуйте stackblitz с точной настройкой html вашего приложения, чтобы я мог вам помочь. Как я писал в своем ответе, вы всегда можете прослушивать события прокрутки на window, если вам это нужно.

frido 09.01.2019 21:29

@friddo Здесь я делюсь ссылкой на stackblitz: stackblitz.com/edit/angular-pj5rjj-zk73b1?embed=1&file=app/… в этом примере у нас есть две полосы прокрутки, когда мы прокручиваем родительскую прокрутку и дочернюю прокрутку, мне нужно, чтобы отображалась одна полоса прокрутки, и когда мы прокручиваем заголовок, чтобы изменить, он должен прокручиваться до последнего content.thanks заранее

poojari raj 10.01.2019 07:12

@poojariraj Опубликованный вами stackblitz по-прежнему не дает понять, чего вы хотите! Где ваш боковой навигационный контент? Пусто! Удалите мой код и оставьте только свой собственный, сделайте разделы html, которые должны быть прокручиваемыми, прокручиваемыми и четко пометьте их. Например. Вы пометили таблицу в своем коде как прокручиваемую, но не прокручиваемую. Сделайте его прокручиваемым! Также правильно сделайте отступ в коде. Вы также можете добавить к своему вопросу скриншоты своего приложения и отметить там прокручиваемые разделы!

frido 10.01.2019 12:42
r7mv94.axshare.com/… это ссылка на экран ux, как это мне нужно реализовать
poojari raj 10.01.2019 16:21

Вы пробовали слушать значение window.pageYOffset, как я написал в своем ответе? Это то, что вы ищете: stackblitz.com/edit/angular-pj5rjj-sgtibu

frido 10.01.2019 17:37

Да, пятница, большое спасибо .. Как я могу связаться с вами. есть ли linkedin

poojari raj 11.01.2019 06:27

@poojariraj Я не в linkedin, но вы могли бы проголосовать за мой ответ, если бы я вам помог. Если у вас возникнут дополнительные проблемы, вы можете задать другой вопрос о stackoverflow.

frido 11.01.2019 10:39

@firdoo как уменьшить высоту строки stackblitz.com/angular/…. вот ссылка thnaks заранее, я пробовал, но не уменьшает

poojari raj 16.01.2019 13:48

Привет @poojariraj, это отдельный вопрос, не связанный с изменением заголовка при прокрутке. Задайте новый вопрос о stackoverflow. Также считайте принимая ответом, который решил вашу проблему, щелкнув галочку. Это показывает широкому сообществу, что вы нашли решение, и дает некоторую репутацию как автору, так и вам. Это не обязательно.

frido 16.01.2019 14:31

Другие вопросы по теме