Angular onscroll event creating a parallax effect

I attempted to create a parallax effect using Angular and the OnScroll event, however, while scrolling, the text seems to be flickering. Is there a way to make the smooth rendering onscroll? Maybe through CSS alone?

Here is the script I used: https://stackblitz.com/edit/angular-b5cmf7?file=src%2Fapp%2Fapp.component.html

The key function responsible for the effect is this:

@HostListener('window:scroll', ['$event'])
isScrolledIntoView(){
  const offsetHeight = this.testDiv.nativeElement.children[0].offsetHeight; 
  const rect = this.testDiv.nativeElement.getBoundingClientRect();
  if( rect.bottom <= window.innerHeight){ // when the div is visible in viewport change the height (not more than the height of the content)
    let height = (window.innerHeight - rect.bottom);
    if(height<offsetHeight){
      this.height = height;
    }else{
      this.height = offsetHeight
    }
  }
}

Answer №1

Upon reviewing your blitz, I noticed a recurring issue that I have encountered multiple times. The problem lies in how you are calculating values on a per-frame basis. In simpler terms:

Avoid basing your calculations on values that will be altered by the outcome.

More specifically, in your scenario, the challenge arises from the correlation between rect.bot and this.height. With each invocation of your onscroll function, the height of your section is adjusted. However, this modification impacts the value of rect.bot as well. Consequently, during the next scroll event, the height gets altered from a different starting point, leading to the oscillation you observed.

To tackle this issue, ensure that all your calculations rely on values unaffected by the result. In this case, I suggest utilizing rect.top, which remains constant regardless of the section's height.

Additionally, incorporating interpolation grants you more flexibility. The key is to determine:

  • When should the reveal process begin relative to the window height (essentially, this.height = 0)
  • At what point should the section be entirely revealed in relation to the window height (this.height = offsetHeight)
  • What method should be employed for interpolation? (linear interpolation is the simplest)

In my revised version of your blitz, I have included the clamp and invlerp functions sourced from this link:

You can explore these interpolation functions and their applications through the provided resource.

I have introduced two variables named "startPercentage" and "endPercentage", reflecting the value of rect.top as a percentage of the window's innerHeight. Experiment with these parameters to achieve various speeds or qualities of parallax, tailoring the effect to your preferences.

Here is the modified version:

https://stackblitz.com/edit/angular-lcyc4q?file=src%2Fapp%2Fapp.component.ts

If inclined, delve into alternate interpolation functions to explore ease-in and ease-out dynamics for diverse effects.

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Removing Delivery Address and Method From Checkout Page in OpenCart 2

Is there a way to remove "Step 2, Step 3: Billing Details" from the Checkout Page in OpenCart 2.0? I have searched for solutions online but haven't found one specifically for OpenCart 2.0. This is what I tried: <div class="panel panel-default" s ...

Struggling to access component variables within the setTimeout function

As a newcomer to Angular(6), I am facing an issue where I am unable to access component variables within a setTimeout function. Below is the code snippet illustrating my problem. export class ConSellerDraftsolSecOneComponent implements OnInit { ...

Tips for adding jQuery UI styling to elements generated dynamically

I have a challenge with generating text fields using jquery while applying jquery ui styling to the form. The issue is that the dynamically created elements do not inherit the css styles from jquery ui: let index = 0; $('#btn_generate').on(& ...

Stop the pinch zoom functionality in Angular NativeScript WebView to prevent unwanted zooming

Currently, I am working on a Nativescript App that utilizes Angular (NG 5.1.1 / Angular 7.x). Within the app, there is a view containing a webview. @ViewChild("myWebView") webViewRef: ElementRef; <WebView class="webview" #myWebView [src]="myU ...

Finding the perfect pairing: How to align counters with objects?

public counter = 0; x0: any; x1: any; x2: any; x3: any; x4: any; next(){ this.counter += 1; this.storage.set("Count", this.counter); console.log(this.counter); this.logic(); } logic(){ //automatic counter here var xNum = JSON.parse(JSON.stri ...

Animating a div in CSS3 to expand horizontally from left to right without affecting its original position

I am currently in the process of developing a calendar using HTML, CSS, and JavaScript. The main purpose of this calendar is to showcase upcoming and past events. However, I am facing difficulties in ensuring that my event blocks occupy the remaining space ...

Issues with binding Angular reactive forms

Exploring the construction of nested reactive forms: https://stackblitz.com/edit/angular-mgrfbj The project structure is as follows: ---create company form (hello.component.ts) --- company details form (company-details.component.ts) --- [ ...

Display a dynamic array within an Angular2 view

I have a dynamic array that I need to display in the view of a component whenever items are added or removed from it. The array is displayed using the ngOnInit() method in my App Component (ts): import { Component, OnInit } from '@angular/core' ...

I am encountering an issue where my application is not recognizing the angular material/dialog module. What steps can I take to resolve this issue and ensure that it functions properly?

For my Angular application, I am trying to incorporate two Material UI components - MatDialog and MatDialogConfig. However, it seems like there might be an issue with the placement of these modules as all other modules are functioning correctly except fo ...

Adjust the color of the sidebar's list items when scrolling

How can I change the background color of left sticky sidebars li on scrolling? When scrolling through BMW, BMW's background color in the sidebar should turn green. Please refer to the code snippet provided below. The background color of the li ...

Ensuring Bootstrap 3 Table Header Widths Remain Fixed

How can I ensure the header columns in my Bootstrap 3 table maintain a fixed width, regardless of the content in the regular rows? I want to avoid the messy look of content splitting onto multiple lines. Here's an example: I'd prefer not to adju ...

Tips for adjusting the size of an image in both the vertical and horizontal axes using CSS

As a beginner in HTML, I am currently facing an issue while trying to display a set of pictures. My goal is to resize the pictures based on the current window size while maintaining the aspect ratio. Despite experimenting with various methods like using wi ...

Working with CSS3 transitions in PHPStorm is a breeze

For some reason, my phpstorm does not provide code completion for CSS properties like -webkit-translate, translate, or animation. Has anyone encountered this issue before? Any suggestions on how to fix it? ...

Tips for ensuring that all children within a flex-container have equal heights

I seem to be facing an issue with this problem. My goal is to ensure that all the child divs within a flex container have the same height as the tallest child div, which in this case is 100px. Additionally, I want them to be aligned at the center. I&apos ...

The Exporting menu in AmCharts4 does not include the ability to export in CSV, XLSX, or JSON formats

Right now, I am working with AmCharts4 and my objective is to export chart data in various formats such as CSV, XLSX, and JSON. To implement this, I have included the following scripts in index.html: <script src="https://www.amcharts.com/lib/4/core.js" ...

Issue with *ngIf on Nativescript not functioning properly on iOS

I am encountering a major issue in my project. The *ngIf directive I am using is functioning only on the Android platform and not on iOS. Here is the HTML code snippet: <GridLayout columns ="auto, auto" rows="*" (tap)="open()"> <StackLayout co ...

Inject a DOM event into a personalized form validator within an Angular application

I'm currently working on validating a form using the reactive approach. I've implemented a file input to allow users to upload files, with custom validation conditions in place. However, I'm encountering an issue where the validator only rec ...

Ensuring Angular Reactive Forms: Validation for Non-Empty Nested FormArray with Display of mat-error

I'm currently working on a project using Angular's reactive forms and facing a challenge with a nested structure. I need to validate that a FormArray of files within another FormArray is not empty. Each groupFiles can have multiple groups, and ea ...

Angular Fails to Identify Chart.js Plugin as an Options Attribute

Encountering issues with using the 'dragData' plugin in Chart.js 2.9.3 within an Angular environment: https://github.com/chrispahm/chartjs-plugin-dragdata After importing the plugin: chartjs-plugin-dragdata, I added dragdata to the options as sh ...

Is the z-index functioning properly for the header call-to-action text on mobile devices, but not on desktop?

The desktop header cta is functioning properly, but when I switch to mobile nothing happens. I attempted to increase the z-index number within the html instead of in the style sheet. This is where my CTA is located in the html: CALL TO ACTION surrounded ...