Angular 6 track scroll position of div within div
I am trying to create a directive that tracks the Y position of the element it is placed on - when this element reaches the top of the parent div, I will add sticky styling to make the header stick to the top until the whole element has been scrolled.
I have tried to track the scrolling, but can't get any output apart from the initial ngoninit log:
import { Directive, OnInit, ElementRef, HostBinding, HostListener } from '@angular/core';
@Directive({
/* tslint:disable-next-line:directive-selector */
selector: '[stickyHeaderDirective]'
})
export class StickyHeaderDirective implements OnInit {
ngOnInit() {
console.log('lets track ths scroll');
}
constructor() {}
@HostListener('scroll', ['$event']) private onScroll($event: Event): void {
console.log($event.srcElement.scrollLeft, $event.srcElement.scrollTop);
}
}
What am i missing?
angular scroll angular2-directives
add a comment |
I am trying to create a directive that tracks the Y position of the element it is placed on - when this element reaches the top of the parent div, I will add sticky styling to make the header stick to the top until the whole element has been scrolled.
I have tried to track the scrolling, but can't get any output apart from the initial ngoninit log:
import { Directive, OnInit, ElementRef, HostBinding, HostListener } from '@angular/core';
@Directive({
/* tslint:disable-next-line:directive-selector */
selector: '[stickyHeaderDirective]'
})
export class StickyHeaderDirective implements OnInit {
ngOnInit() {
console.log('lets track ths scroll');
}
constructor() {}
@HostListener('scroll', ['$event']) private onScroll($event: Event): void {
console.log($event.srcElement.scrollLeft, $event.srcElement.scrollTop);
}
}
What am i missing?
angular scroll angular2-directives
add a comment |
I am trying to create a directive that tracks the Y position of the element it is placed on - when this element reaches the top of the parent div, I will add sticky styling to make the header stick to the top until the whole element has been scrolled.
I have tried to track the scrolling, but can't get any output apart from the initial ngoninit log:
import { Directive, OnInit, ElementRef, HostBinding, HostListener } from '@angular/core';
@Directive({
/* tslint:disable-next-line:directive-selector */
selector: '[stickyHeaderDirective]'
})
export class StickyHeaderDirective implements OnInit {
ngOnInit() {
console.log('lets track ths scroll');
}
constructor() {}
@HostListener('scroll', ['$event']) private onScroll($event: Event): void {
console.log($event.srcElement.scrollLeft, $event.srcElement.scrollTop);
}
}
What am i missing?
angular scroll angular2-directives
I am trying to create a directive that tracks the Y position of the element it is placed on - when this element reaches the top of the parent div, I will add sticky styling to make the header stick to the top until the whole element has been scrolled.
I have tried to track the scrolling, but can't get any output apart from the initial ngoninit log:
import { Directive, OnInit, ElementRef, HostBinding, HostListener } from '@angular/core';
@Directive({
/* tslint:disable-next-line:directive-selector */
selector: '[stickyHeaderDirective]'
})
export class StickyHeaderDirective implements OnInit {
ngOnInit() {
console.log('lets track ths scroll');
}
constructor() {}
@HostListener('scroll', ['$event']) private onScroll($event: Event): void {
console.log($event.srcElement.scrollLeft, $event.srcElement.scrollTop);
}
}
What am i missing?
angular scroll angular2-directives
angular scroll angular2-directives
asked Nov 15 '18 at 14:12
user3024827user3024827
309420
309420
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
HostListener
only listens for scroll
events which occur on the [stickyHeaderDirective]
element. That element must be the one firing the scroll
events.
Make sure the [stickyHeaderDirective]
element has the correct CSS styling to allow it to scroll. Here's a demo showing the difference with and without CSS styles.
for (let element of document.getElementsByClassName('track-scrolling')) {
element.addEventListener('scroll', e => {
console.log(e.srcElement.scrollLeft, e.srcElement.scrollTop);
});
}
.container {
height: 200px;
width: 200px;
overflow: auto;
margin: 10px;
border: 1px solid;
}
.big-content {
height: 1000px;
width: 1000px;
}
.track-scrolling.wrong {
/*
No overflow property
No height/width or max-height/width
*/
color: red;
}
.track-scrolling.right {
overflow: auto;
max-height: 100%;
color: green;
}
<div class="container">
<div class="track-scrolling wrong">
I won't fire scroll events
<div class="big-content"></div>
</div>
</div>
<div class="container">
<div class="track-scrolling right">
I will fire scroll events
<div class="big-content"></div>
</div>
</div>
And here's a demo showing the same behavior with your directive: https://stackblitz.com/edit/angular-kqvraz
Fantastic - thank you for such a detailed answer! much help
– user3024827
Nov 15 '18 at 18:20
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53321355%2fangular-6-track-scroll-position-of-div-within-div%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
HostListener
only listens for scroll
events which occur on the [stickyHeaderDirective]
element. That element must be the one firing the scroll
events.
Make sure the [stickyHeaderDirective]
element has the correct CSS styling to allow it to scroll. Here's a demo showing the difference with and without CSS styles.
for (let element of document.getElementsByClassName('track-scrolling')) {
element.addEventListener('scroll', e => {
console.log(e.srcElement.scrollLeft, e.srcElement.scrollTop);
});
}
.container {
height: 200px;
width: 200px;
overflow: auto;
margin: 10px;
border: 1px solid;
}
.big-content {
height: 1000px;
width: 1000px;
}
.track-scrolling.wrong {
/*
No overflow property
No height/width or max-height/width
*/
color: red;
}
.track-scrolling.right {
overflow: auto;
max-height: 100%;
color: green;
}
<div class="container">
<div class="track-scrolling wrong">
I won't fire scroll events
<div class="big-content"></div>
</div>
</div>
<div class="container">
<div class="track-scrolling right">
I will fire scroll events
<div class="big-content"></div>
</div>
</div>
And here's a demo showing the same behavior with your directive: https://stackblitz.com/edit/angular-kqvraz
Fantastic - thank you for such a detailed answer! much help
– user3024827
Nov 15 '18 at 18:20
add a comment |
HostListener
only listens for scroll
events which occur on the [stickyHeaderDirective]
element. That element must be the one firing the scroll
events.
Make sure the [stickyHeaderDirective]
element has the correct CSS styling to allow it to scroll. Here's a demo showing the difference with and without CSS styles.
for (let element of document.getElementsByClassName('track-scrolling')) {
element.addEventListener('scroll', e => {
console.log(e.srcElement.scrollLeft, e.srcElement.scrollTop);
});
}
.container {
height: 200px;
width: 200px;
overflow: auto;
margin: 10px;
border: 1px solid;
}
.big-content {
height: 1000px;
width: 1000px;
}
.track-scrolling.wrong {
/*
No overflow property
No height/width or max-height/width
*/
color: red;
}
.track-scrolling.right {
overflow: auto;
max-height: 100%;
color: green;
}
<div class="container">
<div class="track-scrolling wrong">
I won't fire scroll events
<div class="big-content"></div>
</div>
</div>
<div class="container">
<div class="track-scrolling right">
I will fire scroll events
<div class="big-content"></div>
</div>
</div>
And here's a demo showing the same behavior with your directive: https://stackblitz.com/edit/angular-kqvraz
Fantastic - thank you for such a detailed answer! much help
– user3024827
Nov 15 '18 at 18:20
add a comment |
HostListener
only listens for scroll
events which occur on the [stickyHeaderDirective]
element. That element must be the one firing the scroll
events.
Make sure the [stickyHeaderDirective]
element has the correct CSS styling to allow it to scroll. Here's a demo showing the difference with and without CSS styles.
for (let element of document.getElementsByClassName('track-scrolling')) {
element.addEventListener('scroll', e => {
console.log(e.srcElement.scrollLeft, e.srcElement.scrollTop);
});
}
.container {
height: 200px;
width: 200px;
overflow: auto;
margin: 10px;
border: 1px solid;
}
.big-content {
height: 1000px;
width: 1000px;
}
.track-scrolling.wrong {
/*
No overflow property
No height/width or max-height/width
*/
color: red;
}
.track-scrolling.right {
overflow: auto;
max-height: 100%;
color: green;
}
<div class="container">
<div class="track-scrolling wrong">
I won't fire scroll events
<div class="big-content"></div>
</div>
</div>
<div class="container">
<div class="track-scrolling right">
I will fire scroll events
<div class="big-content"></div>
</div>
</div>
And here's a demo showing the same behavior with your directive: https://stackblitz.com/edit/angular-kqvraz
HostListener
only listens for scroll
events which occur on the [stickyHeaderDirective]
element. That element must be the one firing the scroll
events.
Make sure the [stickyHeaderDirective]
element has the correct CSS styling to allow it to scroll. Here's a demo showing the difference with and without CSS styles.
for (let element of document.getElementsByClassName('track-scrolling')) {
element.addEventListener('scroll', e => {
console.log(e.srcElement.scrollLeft, e.srcElement.scrollTop);
});
}
.container {
height: 200px;
width: 200px;
overflow: auto;
margin: 10px;
border: 1px solid;
}
.big-content {
height: 1000px;
width: 1000px;
}
.track-scrolling.wrong {
/*
No overflow property
No height/width or max-height/width
*/
color: red;
}
.track-scrolling.right {
overflow: auto;
max-height: 100%;
color: green;
}
<div class="container">
<div class="track-scrolling wrong">
I won't fire scroll events
<div class="big-content"></div>
</div>
</div>
<div class="container">
<div class="track-scrolling right">
I will fire scroll events
<div class="big-content"></div>
</div>
</div>
And here's a demo showing the same behavior with your directive: https://stackblitz.com/edit/angular-kqvraz
for (let element of document.getElementsByClassName('track-scrolling')) {
element.addEventListener('scroll', e => {
console.log(e.srcElement.scrollLeft, e.srcElement.scrollTop);
});
}
.container {
height: 200px;
width: 200px;
overflow: auto;
margin: 10px;
border: 1px solid;
}
.big-content {
height: 1000px;
width: 1000px;
}
.track-scrolling.wrong {
/*
No overflow property
No height/width or max-height/width
*/
color: red;
}
.track-scrolling.right {
overflow: auto;
max-height: 100%;
color: green;
}
<div class="container">
<div class="track-scrolling wrong">
I won't fire scroll events
<div class="big-content"></div>
</div>
</div>
<div class="container">
<div class="track-scrolling right">
I will fire scroll events
<div class="big-content"></div>
</div>
</div>
for (let element of document.getElementsByClassName('track-scrolling')) {
element.addEventListener('scroll', e => {
console.log(e.srcElement.scrollLeft, e.srcElement.scrollTop);
});
}
.container {
height: 200px;
width: 200px;
overflow: auto;
margin: 10px;
border: 1px solid;
}
.big-content {
height: 1000px;
width: 1000px;
}
.track-scrolling.wrong {
/*
No overflow property
No height/width or max-height/width
*/
color: red;
}
.track-scrolling.right {
overflow: auto;
max-height: 100%;
color: green;
}
<div class="container">
<div class="track-scrolling wrong">
I won't fire scroll events
<div class="big-content"></div>
</div>
</div>
<div class="container">
<div class="track-scrolling right">
I will fire scroll events
<div class="big-content"></div>
</div>
</div>
edited Nov 15 '18 at 15:15
answered Nov 15 '18 at 15:06
Alex KAlex K
1,195610
1,195610
Fantastic - thank you for such a detailed answer! much help
– user3024827
Nov 15 '18 at 18:20
add a comment |
Fantastic - thank you for such a detailed answer! much help
– user3024827
Nov 15 '18 at 18:20
Fantastic - thank you for such a detailed answer! much help
– user3024827
Nov 15 '18 at 18:20
Fantastic - thank you for such a detailed answer! much help
– user3024827
Nov 15 '18 at 18:20
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53321355%2fangular-6-track-scroll-position-of-div-within-div%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown