Customize bar in Angular Range Slider component

26 Feb 202610 minutes to read

Customize the Range Slider bar appearance by overriding CSS classes. By default, the slider bar uses the e-slider-track class. Override this class to apply custom colors, gradients, or themes to the slider bar. The following code snippet demonstrates how to apply a gradient color to the slider bar.

.e-control.e-slider .e-slider-track .e-range {
           background: linear-gradient(left, #e1451d 0, #fdff47 17%, #86f9fe 50%, #2900f8 65%, #6e00f8 74%, #e33df9 83%, #e14423 100%);
}

You can also apply background color for a certain range depending upon slider values, using change event.

change(args: SliderChangeEventArgs) => {
    .....
    if (sliderTrack && sliderHandle) {
    let color = 'green';
    if (args.value > 25 && args.value <= 50) {
        color = 'royalblue';
    } else if (args.value > 50 && args.value <= 75) {
        color = 'darkorange';
    } else if (args.value > 75 && args.value <= 100) {
        color = 'red';
    }
    sliderHandle.style.backgroundColor = color;
    sliderTrack.style.backgroundColor = color;
    }
}
import { Component, ViewEncapsulation, ViewChild } from '@angular/core';
import { SliderModule, SliderComponent, SliderChangeEventArgs } from '@syncfusion/ej2-angular-inputs';

@Component({
  imports: [SliderModule],
  standalone: true,
  selector: 'my-app',
  template: `
    <div class="slider_container">
      <div class="slider-labeltext slider_userselect">Height</div>
      <ejs-slider id='height_slider' [value]='value' [min]='min' [max]='max'></ejs-slider>
    </div>
    <div class="slider_container">
      <div class="slider-labeltext slider_userselect">Gradient color</div>
      <ejs-slider id='gradient_slider' [value]='gradient_value' [min]='min' [max]='max' [type]='range'></ejs-slider>
    </div>
    <div class="slider_container">
      <div class="slider-labeltext slider_userselect">Dynamic thumb and selection bar color</div>
      <ejs-slider #dynamicSlider id='dynamic_color_slider' [value]='dynamic_value' [min]='min' [max]='max' [type]='range' (created)='created()' (change)='change($event)'></ejs-slider>
    </div>
  `,
  encapsulation: ViewEncapsulation.None
})
export class AppComponent {
  @ViewChild('dynamicSlider', { static: false }) dynamicSlider!: SliderComponent;

  public value: number = 30;
  public min: number = 0;
  public max: number = 100;
  public gradient_value: number = 30;
  public range: string = 'MinRange';
  public dynamic_value: number = 30;

  // Handler used for slider created event
  created() {
    setTimeout(() => {
      if (this.dynamicSlider) {
        const sliderTrack = this.dynamicSlider.element.querySelector('.e-range') as HTMLElement;
        const sliderHandle = this.dynamicSlider.element.querySelector('.e-handle') as HTMLElement;
        if (sliderTrack && sliderHandle) {
          sliderHandle.style.backgroundColor = 'green';
          sliderTrack.style.backgroundColor = 'green';
        }
      }
    });
  }

  // Handler used for slider change event
  change(args: SliderChangeEventArgs | any) {
    if (this.dynamicSlider) {
      const sliderTrack = this.dynamicSlider.element.querySelector('.e-range') as HTMLElement;
      const sliderHandle = this.dynamicSlider.element.querySelector('.e-handle') as HTMLElement;
      if (sliderTrack && sliderHandle) {
        let color = 'green';
        if (args.value > 25 && args.value <= 50) {
          color = 'royalblue';
        } else if (args.value > 50 && args.value <= 75) {
          color = 'darkorange';
        } else if (args.value > 75 && args.value <= 100) {
          color = 'red';
        }
        sliderHandle.style.backgroundColor = color;
        sliderTrack.style.backgroundColor = color;
      }
    }
  }
}
@import 'node_modules/@syncfusion/ej2-base/styles/material3.css';
@import 'node_modules/@syncfusion/ej2-buttons/styles/material3.css';
@import 'node_modules/@syncfusion/ej2-popups/styles/material3.css';
@import 'node_modules/@syncfusion/ej2-angular-inputs/styles/material3.css';

.slider-labeltext {
    text-align: left;
    font-weight: 500;
    font-size: 13px;
    padding-bottom: 10px;
  }
  
  #height_slider .e-handle,
  #gradient_slider .e-handle {
    height: 20px;
    width: 20px;
    margin-left: -10px;
    top: calc(50% - 10px);
  }
  
  .slider_container {
    margin-top: 40px;
    margin: 0 auto;
    max-width: 380px;
  }
  
  #height_slider .e-tab-handle::after {
    background-color: #f9920b;
  }
  
  #height_slider .e-slider-track {
    height: 8px;
    top: calc(50% - 4px);
    border-radius: 0;
  }
  
  #gradient_slider .e-range {
    height: 6px;
    top: calc(50% - 3px);
    border-radius: 5px;
    background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZTE0NTFkIiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMTclIiBzdG9wLWNvbG9yPSIjZmRmZjQ3IiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iNTAlIiBzdG9wLWNvbG9yPSIjODZmOWZlIiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iNjUlIiBzdG9wLWNvbG9yPSIjMjkwMGY4IiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iNzQlIiBzdG9wLWNvbG9yPSIjNmUwMGY4IiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iODMlIiBzdG9wLWNvbG9yPSIjZTMzZGY5IiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2UxNDQyMyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2dyYWQtdWNnZy1nZW5lcmF0ZWQpIiAvPgo8L3N2Zz4=);
    background: -webkit-gradient(
      linear,
      left top,
      left bottom,
      color-stop(0%, #1e5799),
      color-stop(100%, #7db9e8)
    );
    background: -webkit-linear-gradient(
      left,
      #e1451d 0,
      #fdff47 17%,
      #86f9fe 50%,
      #2900f8 65%,
      #6e00f8 74%,
      #e33df9 83%,
      #e14423 100%
    );
    background: linear-gradient(
      left,
      #e1451d 0,
      #fdff47 17%,
      #86f9fe 50%,
      #2900f8 65%,
      #6e00f8 74%,
      #e33df9 83%,
      #e14423 100%
    );
    background: -moz-linear-gradient(
      left,
      #e1451d 0,
      #fdff47 17%,
      #86f9fe 50%,
      #2900f8 65%,
      #6e00f8 74%,
      #e33df9 83%,
      #e14423 100%
    );
    background: -o-linear-gradient(
      left,
      #e1451d 0,
      #fdff47 17%,
      #86f9fe 50%,
      #2900f8 65%,
      #6e00f8 74%,
      #e33df9 83%,
      #e14423 100%
    );
  }
  
  #gradient_slider .e-slider-track {
    height: 8px;
    top: calc(50% - 4px);
    border-radius: 5px;
  }
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import 'zone.js';
bootstrapApplication(AppComponent).catch((err) => console.error(err));