组件样式

angular使用标准的css来设置样式,所以可以把关于css的知识和技能直接用于angular程序中,例如样式表、选择器、规则以及媒体查询等。

angular会把组件样式绑定在组件上,这样可以实现比标准样式表更加模快化的设置。

放在组件样式中的选择器,只会应用在组件自身的模板中。

可以使用对每个组件最有意义的css类名和选择器

类名和选择器是仅属于组件内部的,它不会和应用中其他地方的类名和选择器出现冲突。

组件的样式不会因为别的地方修改了样式而被随意改变。

组件模板样式:

可以在组件的元数据中设置styles属性,styles属性可以接受一个包含css代码的字符串数组。
例如

@Component({
  selector: 'app-root',
  template: `
    <h1>Tour of Heroes</h1>
    <app-hero-main [hero]="hero"></app-hero-main>
  `,
  styles: ['h1 { font-weight: normal; }']
})
export class HeroAppComponent {
/* . . . */
}

在@Component的元数据中指定的样式只会对该组件的模板生效。它们既不会被模板中嵌套的组件继承,也不会被通过内容投影嵌进来的组件继承。

特殊的选择器

:host
使用:host伪类选择器,用来选择组件宿主元素中的元素(相对于组件模板内部的元素)。

:host{
  display: block;
  border:1px solid black;
}

因为宿主不是组件自身模板的一部分,而是父组件模板的一部分,所以:host是能以宿主元素为目标的唯一方式。
要把宿主样式作为条件,就要像函数一样把其他选择器放在:host后面的括号中。

:host(.active) { /*只有当宿主元素带有active类的时候才会生效*/
  border-width: 3px;
}

:host-context
:host-context()伪类选择器在当前宿主元素的祖先节点中查找css类,直到文档的根节点为止。在与其他选择器组合使用时,她是非常有用的。
下面例子中,只有当某个祖先元素有css类theme-light时,我们才会把background-color样式应用到组件nebulous的所有<h2>元素中。
已废弃/deep/、>>>和::ng-deep
组件样式通常只会作用在组件自身的HTML上。
可以使用/deep/选择器来强制一个样式对各级子组件的视图也生效。它不但会作用于组件的子视图,也会作用于投影进来的内容(ng-content)
这个例子以所有的 <h3> 元素为目标,从宿主元素到当前元素再到 DOM 中的所有子元素:

:host /deep/ h3 {
  font-style: italic;
}

/deep/组合器还有两个别名:>>>和::ng-deep

把样式加载进组件中

有几种方式把样式加入组件中:

1.设置styles或styleUrls元数据
2.内联在模板的HTML中
3.通过css文件导入

元数据中的样式

@Component({
  selector: 'app-root',
  template: `
    <h1>Tour of Heroes</h1>
    <app-hero-main [hero]="hero"></app-hero-main>
  `,
  styles: ['h1 { font-weight: normal; }']
})
export class HeroAppComponent {
/* . . . */
}
或者是把外部 CSS 文件添加到 `@Component的 styleUrls属性中来加载外部样式
@Component({
  selector: 'app-root',
  template: `
    <h1>Tour of Heroes</h1>
    <app-hero-main [hero]="hero"></app-hero-main>
  `,
  styleUrls: ['./hero-app.component.css']
})
export class HeroAppComponent {
/* . . . */
}

模板内联样式

@Component({
  selector: 'app-hero-controls',
  template: `
    <style>
      button {
        background-color: white;
        border: 1px solid #777;
      }
    </style>
    <h3>Controls</h3>
    <button (click)="activate()">Activate</button>
  `
})
或者通过link标签引入样式
@Component({
  selector: 'app-hero-team',
  template: `
    <!-- We must use a relative URL so that the AOT compiler can find the stylesheet -->
    <link rel="stylesheet" href="../assets/hero-team.component.css">
    <h3>Team</h3>
    <ul>
      <li *ngFor="let member of hero.team">
        {{member}}
      </li>
    </ul>`
})

可以使用css的@imports语法来把css文件导入到css文件中

url是相对于正在导入的css文件的
/* The AOT compiler needs the `./` to show that this is local */
@import './hero-details-box.css';

需要在angular.json文件中配置全局样式文件。
可以使用sass、less、stylus来编写样式,并使用相应的扩展名(.scss、.less、.styl)来把它们指定到@Component.styleUrls元数据中。

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
...
视图封装模式

通过在组件的元数据上设置视图封装模式,可以分别控制每个组件的封装模式,可选的封装模式如下:

1.ShadowDom模式使用浏览器原生的Shadow DOM实现来为组件的宿主元素附加一个Shadow DOM。组件的视图被附加到这个Shadow DOM中,组件的样式也被包含在这个Shadow DOM中。

2.Native视图包装模式使用浏览器原生的Shadow DOM的一个废弃实现。(没有样式能进来,组件样式出不去。不进不出)

3.Emulated模式通过预处理css代码来模拟Shadow DOM的行为,以达到把css样式局限在组件视图中的目的。(全局样式能进来,组件样式出不去。只进不出)

4.None意味着Angular不使用试图封装。Angular会把css添加到全局样式中,而不会应用前面讨论过的那些作用域规则、隔离和保护等。从本质上讲,这跟把组件的样式直接放进HTML是一样的。(能进能出)

通过组件元数据中的 encapsulation 属性来设置组件封装模式:

// warning: few browsers support shadow DOM encapsulation at this time
encapsulation: ViewEncapsulation.Native

ShadowDom模式只适用于提供了原生Shadow DOM支持的浏览器。它仍然受到很多限制,这个为什么仿真(Emulated)模式是默认选项,并建议将其应用于大多数情况。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,809评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,189评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,290评论 0 359
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,399评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,425评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,116评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,710评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,629评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,155评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,261评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,399评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,068评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,758评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,252评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,381评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,747评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,402评论 2 358

推荐阅读更多精彩内容