2

My Angular 2 Dart application has many nested components. If a certain property of one of my components is set to true, a popup is shown.

If this popup is shown I want to add a class to the document body.

Pseudo code example:

<html>
<head>
</head>
<body class="">
<app-component>
<home-component> <!-- with routers -->
<inner-component>
<popup-component>
// if I am active I want to add a body class
</popup-component>
</inner-component>
</home-component>
</app-component>
</body>
</html>

Simple reason: If the popup component is displayed I want to disable body scrolling (overflow-x:hidden;). The popup component is shown if the property bool show_popup within popup_component.dart is set to true.

Unfortunatly in CSS - as far as i know - there is no selector to check this (Is there a CSS parent selector?) - otherwise I would say something like

body:has(.my_popup) 

in the main.css file or something similar.

How can I achieve the desired result?

Community
  • 1
  • 1
Blackbam
  • 12,200
  • 19
  • 71
  • 117

1 Answers1

4

There are two way.

You can use

@HostBinding('class.someclass') bool isSomeClass = true;

in the root component if it has

selector: 'body'

or

document.querySelector('body').classes.add('someClass');

You can use :host-context(...) to style a component depending on a selector matching a parent

:host-context(body.someClass) {
  background-color: red;
}

will make the background color red when the body element has class="someClass" set.

Günter Zöchbauer
  • 490,478
  • 163
  • 1,733
  • 1,404