#javascript #html #css #angular #rxjs
Вопрос:
У меня есть список элементов , которые отображаются в представлении с использованием *ngFor
, количество элементов в списке в большинстве случаев будет превышать высоту элемента контейнера списка, поэтому overflow: auto
используется для прокрутки контейнера.
Каждый элемент в списке представляет собой событие, произошедшее в определенное время в прошлом, время наступления события, сохраненное в формате метки времени UNIX.
На базовом уровне есть BehaviorSubject
функция, которая начинается с первой метки времени события и выдает следующее значение каждые 100 миллисекунд.
Возвращаясь к уровню представления, есть подписка на SubjectBehavroure, упомянутая выше, которая выполняет следующее для каждого полученного нового значения:
- Найдите в списке событие, соответствующее вновь полученному значению
- Если событие найдено, оно должно быть активировано
<div class="container" id="scroll"> <div class="list-item" id="{{ event.timestamp }}" [ngClass]="{ active: event.active }" *ngFor="let event of timelineEvents" > <div class="event-details text">{{ event.timestamp }}</div> </div> </div> @Component({ selector: 'events', templateUrl: './events.component.html', styleUrls: ['./events.component.scss'], }) export class EventsComponent implements OnInit { timelineEvents: Array<FsTimeLineEvent> = []; currentTimeSubscription$: Subscription; startTimestamp: number; constructor(private eventFacade: eventFacade) {} ngOnInit(): void { this.currentTimeSubscription$ = this.eventFacade.currentTime$.subscribe( (currentTime) => { // get current timestamp value let currentTimestamp = currentTime this.startTimestamp; // look for an event let currentEventIndex = this.timelineEvents.findIndex( (x) => x.timestamp >= currentTimestamp ); // set the event to active this.setActiveEvent(currentEventIndex); } ); } setActiveEvent(index) { this.timelineEvents.forEach((eve) => { eve.active = false; }); let currentEvent = this.timelineEvents[index]; currentEvent.active = true; let itemToScrollToView = document.getElementById( `${currentEvent.timestamp}` ); if (itemToScrollToView) itemToScrollToView.scrollIntoView({ behavior: 'smooth', block: 'center', }); } }
Как активируется событие?
- Добавление к нему специального CSS, простая граница.
- Прокрутите HTML-элемент события в центр HTML-элемента контейнера списка
Логика работает так, как ожидалось, но только с настройкой поведения прокрутки на «авто».
let activeElement: HTMLElement = docment.getElementById(`${id}`)
activeElement.scrollIntoView({ behavior: 'auto', block: 'center' })
Чего бы я хотел добиться, так это плавной легкой прокрутки, я пытался изменить поведение прокрутки на «плавное», но это вообще отключает прокрутку. Что для меня вообще не имеет смысла, например, почему это происходит?
Я провел массу исследований, я пытался реализовать свою собственную функцию scrollIntoView, но у меня ничего нет! Я был бы признателен вам за помощь! Заранее спасибо!
Комментарии:
1. Какой браузер / систему вы используете для тестирования? Safari не поддерживает
smooth.
, И вы можете опубликовать фрагмент функционального кода, который показывает, что элемент не может выполнить плавную прокрутку в поле зрения?2. @RichDeBourke Я использую chrome. Я добавил фрагмент кода к вопросам, дайте мне знать, если вам нужна дополнительная информация. Спасибо!
3. К сожалению, ваш фрагмент кода, похоже, находится в Angular, который я не использую (и ваш код не будет выполняться в инструменте фрагмента Stackoverflow). Если бы вы могли открыть свою страницу в браузере, просмотреть и скопировать достаточное количество исходного кода, CSS и JavaScript в инструмент фрагментов (кнопка [ < > ]), чтобы увидеть проблему, было бы легче увидеть вашу проблему.
4. Определите свой «itemToScrollIntoView» как HTML-элемент, а затем посмотрите, работает ли он. Что-то вроде: ‘itemToScrollIntoView: HTMLElement = document.getElementById()’.
5. @RichDeBourke Я сделал рабочий код на stackblitz, и то, что он подключен, плавно прокручивается, и функции там работают! Почему не работает над моим кодом? основываясь на вашем опыте, что может помешать плавной прокрутке? Вот ссылка на запущенный код: stackblitz.com/edit/angular-ivy-ruoqxd?file=src/app/…