Angular applications are styled with standard CSS. That means you can apply
everything you know about CSS stylesheets, selectors, rules, and media queries
directly to Angular applications.
另外,Angular 还能把组件样式捆绑在我们的组件上,以实现比标准样式表更加模块化的设计。
Additionally, Angular can bundle component styles
with components, enabling a more modular design than regular stylesheets.
在本章中,我们将学到如何加载和使用这些组件样式。
This page describes how to load and apply these component styles.
对于我们写的每个 Angular 组件来说,除了定义 HTML 模板之外,我们还要定义用于模板的 CSS 样式、
指定任意的选择器、规则和媒体查询。
For every Angular component you write, you may define not only an HTML template,
but also the CSS styles that go with that template,
specifying any selectors, rules, and media queries that you need.
One way to do this is to set the styles property in the component metadata.
The styles property takes an array of strings that contain CSS code.
Usually you give it one string, as in the following example:
The selectors you put into a component's styles apply only within the template
of that component. The h1 selector in the preceding example applies only to the <h1> tag
in the template of HeroAppComponent. Any <h1> elements elsewhere in
the application are unaffected.
这种模块化相对于 CSS 的传统工作方式是一个巨大的改进。
This is a big improvement in modularity compared to how CSS traditionally works.
可以使用对每个组件最有意义的 CSS 类名和选择器。
You can use the CSS class names and selectors that make the most sense in the context of each component.
类名和选择器是仅属于组件内部的,它不会和应用中其它地方的类名和选择器出现冲突。
Class names and selectors are local to the component and don't collide with
classes and selectors used elsewhere in the application.
我们组件的样式不会因为别的地方修改了样式而被意外改变。
Changes to styles elsewhere in the application don't affect the component's styles.
Component styles have a few special selectors from the world of shadow DOM style scoping
(described in the CSS Scoping Module Level 1 page on the
W3C site).
The following sections describe these selectors.
:host
使用:host伪类选择器,用来选择组件宿主元素中的元素(相对于组件模板内部的元素)。
Use the :host pseudo-class selector to target styles in the element that hosts the component (as opposed to
targeting elements inside the component's template).
The :host selector is the only way to target the host element. You can't reach
the host element from inside the component with other selectors because it's not part of the
component's own template. The host element is in a parent component's template.
要把宿主样式作为条件,就要像函数一样把其它选择器放在:host后面的括号中。
Use the function form to apply host styles conditionally by
including another selector inside parentheses after :host.
Sometimes it's useful to apply styles based on some condition outside of a component's view.
For example, a CSS theme class could be applied to the document <body> element, and
you want to change how your component looks based on that.
Use the :host-context() pseudo-class selector, which works just like the function
form of :host(). The :host-context() selector looks for a CSS class in any ancestor of the component host element,
up to the document root. The :host-context() selector is useful when combined with another selector.
The following example applies a background-color style to all <h2> elements inside the component, only
if some ancestor element has the CSS class theme-light.
Use the /deep/ selector to force a style down through the child component tree into all the child component views.
The /deep/ selector works to any depth of nested components, and it applies to both the view
children and content children of the component.
在这个例子中,我们以所有的<h3>元素为目标,从宿主元素到当前元素再到 DOM 中的所有子元素:
The following example targets all <h3> elements, from the host element down
through this component to all of its child elements in the DOM.
:host /deep/ h3 {
font-style: italic;}
/deep/选择器还有一个别名>>>。我们可以任意交替使用它们。
The /deep/ selector also has the alias >>>. You can use either interchangeably.
Use the /deep/ and >>> selectors only with emulated view encapsulation.
Emulated is the default and most commonly used view encapsulation. For more information, see the
Controlling view encapsulation section.
把样式加载进组件中
Loading styles into components
有几种方式把样式加入组件:
There are several ways to add styles to a component:
设置styles或styleUrls元数据
By setting styles or styleUrls metadata.
内联在模板的 HTML 中
Inline in the template HTML.
通过 CSS 文件导入
With CSS imports.
上述作用域规则对所有这些加载模式都适用。
The scoping rules outlined earlier apply to each of these loading patterns.
The URL is relative to the application root, which is usually the
location of the index.html web page that hosts the application.
The style file URL is not relative to the component file.
That's why the example URL begins src/app/.
To specify a URL relative to the component file, see Appendix 2.
Set the styles property, notthe styleUrls property. The module
bundler loads the CSS strings, not Angular.
Angular sees the CSS strings onlyafter the bundler loads them.
To Angular, it 's as if you wrote the styles array by hand.
For information on
loading CSS in this manner, refer to the module bundler's documentation.
模板内联样式
Template inline styles
我们也可以在组件的 HTML 模板中嵌入<style>标签。
You can embed styles directly into the HTML template by putting them
inside <style> tags.
@Component({
selector:'hero-controls',
template:`
<style>
button {
background-color: white;
border: 1px solid #777;
}
</style>
<h3>Controls</h3>
<button (click)="activate()">Activate</button>
`
})
模板中的link标签
Template link tags
我们也可以在组件的 HTML 模板中嵌入<link>标签。
You can also embed <link> tags into the component's HTML template.
像styleUrls标签一样,这个 link 标签的href指向的 URL 也是相对于应用的根目录的,而不是组件文件。
As with styleUrls, the link tag's href URL is relative to the
application root, not the component file.
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:
Native模式使用浏览器原生的 Shadow DOM
实现来为组件的宿主元素附加一个 Shadow DOM。组件的样式被包裹在这个 Shadow DOM 中。(译注:不进不出,没有样式能进来,组件样式出不去。)
Native view encapsulation uses the browser's native shadow DOM implementation (see
Shadow DOM
on the MDN 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模式(默认值)通过预处理(并改名)CSS 代码来模拟 Shadow DOM 的行为,以达到把 CSS 样式局限在组件视图中的目的。
更多信息,见附录 1 。(译注:只进不出,全局样式能进来,组件样式出不去)
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 Appendix 1.
None意味着 Angular 不使用视图封装。
Angular 会把 CSS 添加到全局样式中。而不会应用上前面讨论过的那些作用域规则、隔离和保护等。
从本质上来说,这跟把组件的样式直接放进 HTML 是一样的。(译注:能进能出。)
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.
通过组件元数据中的encapsulation属性来设置组件封装模式:
To set the components encapsulation mode, use the encapsulation property in the component metadata:
// warning: few browsers support shadow DOM encapsulation at this time
encapsulation:ViewEncapsulation.Native
原生(Native)模式只适用于有原生 Shadow DOM 支持的浏览器。
因此仍然受到很多限制,这就是为什么我们会把仿真 (Emulated) 模式作为默认选项,并建议将其用于大多数情况。
Native view encapsulation only works on browsers that have native support
for shadow DOM (see Shadow DOM v0 on the
Can I use site). The support is still limited,
which is why Emulated view encapsulation is the default mode and recommended
in most cases.
附录 1:查看仿真 (Emulated) 模式下生成的 CSS
Appendix 1: Inspecting the CSS generated in emulated view encapsulation
一个元素在原生封装方式下可能是 Shadow DOM 的宿主,在这里被自动添加上一个_nghost属性。
这是组件宿主元素的典型情况。
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.
这些属性的具体值并不重要。它们是自动生成的,并且我们永远不会在程序代码中直接引用到它们。
但它们会作为生成的组件样式的目标,就像我们在 DOM 的<head>区所看到的:
The exact values of these attributes aren't important. They are automatically
generated and you never refer to them in application code. But they are targeted
by the generated component styles, which are in the <head> section of the DOM:
These styles are post-processed so that each selector is augmented
with _nghost or _ngcontent attribute selectors.
These extra selectors enable the scoping rules described in this page.
You include the template and CSS files by setting the templateUrl and styleUrls metadata properties respectively.
Because these files are co-located with the component,
it would be nice to refer to them by name without also having to specify a path back to the root of the application.
我们也可以通过为文件名加上./前缀来使用相对URL:
You can use a relative URL by prefixing your filenames with ./: