Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

216
Views
Unable to remove active box shadow after clicking outside of Angular component

I'm working on this blog which has a page which lists all the posts. So I added custom hover and active styles to each of the posts so when hovered it will show a different color and box-shadow intensity based on each post post.

Suppose Post1 has a red color associated with it so its default box-shadow color will be red and its blur will be 10px. But when hovered or clicked, it's box-shadow will also be red but blur will be 30px to focus that it is being hovered/clicked.

Now for Post2 if the associated color is blue, then it will have default and hover/active box-shadow color to be blue and blur will be 10px and 30px respectively.

When clicked outside a post or on another post the active box-shadow on the current post will go back to default (10px). And this is what I am unable to achieve right now. The active shadow on the current post doesn't go away.

This is the component:

@Component({
  selector: 'post',
  templateUrl: './post.component.html', 
  styleUrls: ['./post.component.scss']
})
class Post {
  hoverPostId: number;
  clickedPostId: number;

  constructor() {}

  defaultStyle( color ) {
    const boxShadow = `1px 10px 1px ${color}`;    

    return {
      'box-shadow': boxShadow
    };
  }

  hoverActiveStyle( color ) {
    const boxShadow = `1px 30px 1px ${color}`;    

    return {
      'box-shadow': boxShadow
    };
  }

  postActive( postId: number ) {

    if ( this.post.id === postId ) {
      this.clickedPostId = postId;
    } else {
      this.clickedPostId = null;
    }

  }

  mouseEnter( postId: number ) {
    this.hoverPostId = postId;
  }

  mouseLeave() {
    this.hoverPostId = null;
  }

}

export default Post;

This is the template:

<div 
  class="post" 
  [ngStyle]="hoverPostId === post.id || clickedPostId === post.id ? hoverActiveStyle(post.color) : defaultStyle(post.color)"
  (mouseenter)="mouseEnter(post.id)"
  (mouseleave)="mouseLeave()"
  (click)="postActive(post.id)"
>

   // post content
  
</div>

Please note that I can't hardcode the styles in scss file for hover and active class because each of the posts color will be unique. So please don't suggest that.

=======UPDATE========

It is also worth mentioning that in my Post component I have access to the post that is selected. Something like this.posts.selected which returns an array of only one post which has been selected. It returns empty if unselected.

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Try to put a tabindex atribute to the div

<div 
  tabindex="0"
  class="post" 
  [ngStyle]="hoverPostId === post.id || clickedPostId === post.id ? hoverActiveStyle(post.color) : defaultStyle(post.color)"
  (mouseenter)="mouseEnter(post.id)"
  (mouseleave)="mouseLeave()"
  (click)="postActive(post.id)"
  (blur)="onBlur()"
>

   // post content
  
</div>

If you have this inside an *ngFor you could use the index of the iteration

  [tabindex]="i"

The (blur) event fires when the element lose focus. With the tabindex the focus is setted.

  onBlur() {
    this.clickedPostId = null;
    // Or do your thing here
  }
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!