В каждом Front-End проекте вместо CSS я использую SCSS (CSS со сверхспособностями), потому что возможностей SCSS много и они полезны в крупномасштабных приложениях.

Одной из моих любимых функций являются переменные SCSS, которые помогают вам с шаблоном DRY (не повторяйтесь). Но недостатком является то, что эти переменные недоступны из JavaScript.

Эту проблему можно решить с помощью переменных CSS, также известных как пользовательские свойства CSS.

Переменные CSS — это объекты, определенные авторами CSS, которые содержат определенные значения для повторного использования в документе.

Я создал Angular Utility (Service), которая получает и устанавливает значение переменной CSS.

@Injectable()
export class CssVariablesUtility {
  public getValue(propertyName: string): string | null {
    try {
      const root: HTMLElement = document.documentElement;
      const value: string =                        
            getComputedStyle(root).getPropertyValue(propertyName);
      return value ? value.trim() : null;
    } catch(ex) { return null; }
  }
  public setValue(propertyName: string, newValue: string): void {
    try {
      const root: HTMLElement = document.documentElement;
      root.style.setProperty(propertyName, newValue);
    } catch (ex) { }
  }
}

Вы можете скачать приведенный выше код здесь.

РЕАЛЬНАЯ ЖИЗНЕННАЯ ПРОБЛЕМА

Допустим, у вас есть верхнее меню в приложении высотой 50 пикселей. И вы хотите создать элемент DOM с помощью JavaScript, и высота этого элемента должна быть равна области просмотра минус высота верхнего меню.

Вы можете установить следующую высоту элемента: calc(100vh — 50px) . Но если изменилось верхнее меню, вы также должны изменить высоту элемента JavaScript, и я почти уверен, что вы об этом забудете.

Давайте воспользуемся CSS-переменными и CSSVariablesUtility, чтобы решить эту проблему.

В CSS мы добавим это:

/* Variables */
:root { 
  --topmenu-height: 50px;
}
/* Menu */
.top-menu {
  height: var(--topmenu-height);
}

И в JavaScript мы добавим это:

constructor(
  private cssVariablesUtility: CssVariablesUtility
}
ngAfterViewInit() {
  const topMenuHeight: number = this.cssVariablesUtility
                                    .getValue('--topmenu-height');
  el.style.height = `calc(100vh - ${topMenuHeight})`;
}

Теперь высота элемента зависит от CSS!!!

Если вам понравилось это, пожалуйста, похлопайте и поставьте звездочку репозиторию.