| 
									
										
										
										
											2020-09-24 20:30:13 +00:00
										 |  |  | # View encapsulation
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In Angular, component CSS styles are encapsulated into the component's view and don't | 
					
						
							|  |  |  | affect the rest of the application. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To control how this encapsulation happens on a *per | 
					
						
							|  |  |  | component* basis, you can set the *view encapsulation mode* in the component metadata. | 
					
						
							|  |  |  | Choose from the following modes: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * `ShadowDom` view encapsulation uses the browser's native shadow DOM implementation (see | 
					
						
							|  |  |  |   [Shadow DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Shadow_DOM) | 
					
						
							|  |  |  |   on the [MDN](https://developer.mozilla.org) site) | 
					
						
							|  |  |  |   to attach a shadow DOM to the component's host element, and then puts the component | 
					
						
							|  |  |  |   view inside that shadow DOM. The component's styles are included within the shadow DOM. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * `Emulated` view encapsulation (the default) emulates the behavior of shadow DOM by preprocessing | 
					
						
							|  |  |  |   (and renaming) the CSS code to effectively scope the CSS to the component's view. | 
					
						
							|  |  |  |   For details, see [Inspecting generated CSS](guide/view-encapsulation#inspect-generated-css) below. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * `None` means that Angular does no view encapsulation. | 
					
						
							|  |  |  |   Angular adds the CSS to the global styles. | 
					
						
							|  |  |  |   The scoping rules, isolations, and protections discussed earlier don't apply. | 
					
						
							|  |  |  |   This is essentially the same as pasting the component's styles into the HTML. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-03 09:52:53 -04:00
										 |  |  | To set the component's encapsulation mode, use the `encapsulation` property in the component metadata: | 
					
						
							| 
									
										
										
										
											2020-11-28 12:50:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-08 16:59:29 +02:00
										 |  |  | <code-example path="component-styles/src/app/quest-summary.component.ts" region="encapsulation.shadow" header="src/app/quest-summary.component.ts"></code-example> | 
					
						
							| 
									
										
										
										
											2020-09-24 20:30:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | `ShadowDom` view encapsulation only works on browsers that have native support | 
					
						
							| 
									
										
										
										
											2020-11-16 22:37:09 +01:00
										 |  |  | for shadow DOM (see [Shadow DOM v1](https://caniuse.com/shadowdomv1) on the | 
					
						
							|  |  |  | [Can I use](https://caniuse.com/) site). The support is still limited, | 
					
						
							| 
									
										
										
										
											2020-09-24 20:30:13 +00:00
										 |  |  | which is why `Emulated` view encapsulation is the default mode and recommended | 
					
						
							|  |  |  | in most cases. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | {@a inspect-generated-css} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## Inspecting generated CSS
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | When using emulated view encapsulation, Angular preprocesses | 
					
						
							|  |  |  | all component styles so that they approximate the standard shadow CSS scoping rules. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In the DOM of a running Angular application with emulated view | 
					
						
							|  |  |  | encapsulation enabled, each DOM element has some extra attributes | 
					
						
							|  |  |  | attached to it: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <code-example format=""> | 
					
						
							|  |  |  |   <hero-details _nghost-pmm-5> | 
					
						
							|  |  |  |     <h2 _ngcontent-pmm-5>Mister Fantastic</h2> | 
					
						
							|  |  |  |     <hero-team _ngcontent-pmm-5 _nghost-pmm-6> | 
					
						
							|  |  |  |       <h3 _ngcontent-pmm-6>Team</h3> | 
					
						
							|  |  |  |     </hero-team> | 
					
						
							|  |  |  |   </hero-detail> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </code-example> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | There are two kinds of generated attributes: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * An element that would be a shadow DOM host in native encapsulation has a | 
					
						
							|  |  |  |   generated `_nghost` attribute. This is typically the case for component host elements. | 
					
						
							|  |  |  | * An element within a component's view has a `_ngcontent` attribute | 
					
						
							|  |  |  | that identifies to which host's emulated shadow DOM this element belongs. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The exact values of these attributes aren't important. They are automatically | 
					
						
							| 
									
										
										
										
											2021-04-03 09:52:53 -04:00
										 |  |  | generated and you should never refer to them in application code. But they are targeted | 
					
						
							| 
									
										
										
										
											2020-09-24 20:30:13 +00:00
										 |  |  | by the generated component styles, which are in the `<head>` section of the DOM: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <code-example format=""> | 
					
						
							|  |  |  |   [_nghost-pmm-5] { | 
					
						
							|  |  |  |     display: block; | 
					
						
							|  |  |  |     border: 1px solid black; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   h3[_ngcontent-pmm-6] { | 
					
						
							|  |  |  |     background-color: white; | 
					
						
							|  |  |  |     border: 1px solid #777; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | </code-example> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | These styles are post-processed so that each selector is augmented | 
					
						
							|  |  |  | with `_nghost` or `_ngcontent` attribute selectors. | 
					
						
							| 
									
										
										
										
											2020-10-08 16:59:29 +02:00
										 |  |  | These extra selectors enable the scoping rules described in this page. |