Adding handling for scroll events
How to add onScroll event
Prerequisites
Polymer, CSS class.
Problem
We want to add some event like adding a shadow shield and some other visual effects when scrolling a container.
Solution
One way is to create a class for all the css features you want to display when scrolling, and add the class into the classList with on-scroll event.
Key Steps:
- Create your CSS classes:
.scrolling-shield {
background: linear-gradient(to bottom,
rgba(var(--cros-bg-color-rgb),0), rgba(var(--cros-bg-color-rgb),1))
}
.scrolling-elevation {
background-color: var(--cros-bg-color-elevation-1);
box-shadow: var(--cros-elevation-2-shadow);
}
- Customize scrolling event
In html file:
<div id="scrollContainer" on-scroll="onContainerScroll_">
...
</div>
In TS file, for the classes and on-scroll function you just created: use or to enable the effects.
If we want to keep the effect after scrolling finished, use classList.add() to
add it to the element. otherwise, use classList.toggle().
We can also remove a class with classList.remove().
/** @protected */
onContainerScroll_() {
// Scrolling effect depends on the scrolling of '#scrollingContainer'.
const container = this.getElement_('#scrollContainer');
const shadowShield = this.getElement_('#shadowShield');
const shadowElevation = this.getElement_('#shadowElevation');
shadowElevation.classList.toggle(
'scrolling-elevation', container.scrollTop > 0);
shadowShield.classList.toggle(
'scrolling-shield',
container.scrollTop + container.clientHeight < container.scrollHeight);
}
In the code above, the scrolling position is represented with
scrollHeight,
clientHeight
and
offsetHeight.
For the relationship between these variables we can have an insight
here.
Example CL
- https://crrev.com/c/4020861
References
- https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement