解析vue、angular深度作用选择器


Posted in Javascript onSeptember 11, 2019

在 Vue 的开发中,我们经常会用到外部组件库,例如 element,当使用 element 组件库中的某一个组件的时,我们可能会希望有一些定制的地方,通常的做法是 用CSS覆盖;有时层级不够就要另辟他径。

less使用/deep/

css使用>>>

Angular适用深度选择器

使用组件样式

对你编写的每个 Angular 组件来说,除了定义 HTML 模板之外,还要定义用于模板的 CSS 样式、 指定任意的选择器、规则和媒体查询。

实现方式之一,是在组件的元数据中设置 styles 属性。 styles 属性可以接受一个包含 CSS 代码的字符串数组。 通常你只给它一个字符串就行了,如同下例:

<!--src/app/hero-app.component.ts-->

@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的元数据中指定的样式只会对该组件的模板生效

它们既不会被模板中嵌入的组件继承,也不会被通过内容投影(如 ng-content)嵌进来的组件继承。

在这个例子中,h1 的样式只对 HeroAppComponent 生效,既不会作用于内嵌的 HeroMainComponent ,也不会作用于应用中其它任何地方的 h1 标签。

这种范围限制就是所谓的样式模块化特性

  • 可以使用对每个组件最有意义的 CSS 类名和选择器。
  • 类名和选择器是局限于该组件的,它不会和应用中其它地方的类名和选择器冲突。
  • 组件的样式不会因为别的地方修改了样式而被意外改变。
  • 你可以让每个组件的 CSS 代码和它的 TypeScript、HTML 代码放在一起,这将促成清爽整洁的项目结构。
  • 将来你可以修改或移除组件的 CSS 代码,而不用遍历整个应用来看它有没有在别处用到。

特殊的选择器

组件样式中有一些从影子(Shadow) DOM 样式范围领域(记录在W3C的CSS Scoping Module Level 1中) 引入的特殊选择器:

:host

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

<!--src/app/hero-details.component.css-->

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

:host 选择是是把宿主元素作为目标的唯一方式。除此之外,你将没办法指定它, 因为宿主不是组件自身模板的一部分,而是父组件模板的一部分。

要把宿主样式作为条件,就要像函数一样把其它选择器放在 :host 后面的括号中。

下一个例子再次把宿主元素作为目标,但是只有当它同时带有 active CSS 类的时候才会生效。

<!--src/app/hero-details.component.css-->

content_copy
:host(.active) {
 border-width: 3px;
}

:host-context

有时候,基于某些来自组件视图外部的条件应用样式是很有用的。 例如,在文档的 元素上可能有一个用于表示样式主题 (theme) 的 CSS 类,你应当基于它来决定组件的样式。

这时可以使用 :host-context() 伪类选择器。它也以类似 :host() 形式使用。它在当前组件宿主元素的祖先节点中查找 CSS 类, 直到文档的根节点为止。在与其它选择器组合使用时,它非常有用。

在下面的例子中,只有当某个祖先元素有 CSS 类 theme-light 时,才会把 background-color 样式应用到组件内部的所有 h2 元素中。

<!--src/app/hero-details.component.css-->

content_copy
:host-context(.theme-light) h2 {
 background-color: #eef;
}

已废弃 /deep/、>>> 和 ::ng-deep

组件样式通常只会作用于组件自身的 HTML 上。

把伪类 ::ng-deep 应用到如何一条 CSS 规则上就会完全禁止对那条规则的视图包装。任何带有 ::ng-deep 的样式都会变成全局样式。为了把指定的样式限定在当前组件及其下级组件中,请确保在 ::ng-deep 之前带上 :host 选择器。如果 ::ng-deep 组合器在 :host 伪类之外使用,该样式就会污染其它组件。

这个例子以所有的 h3 元素为目标,从宿主元素到当前元素再到 DOM 中的所有子元素:

<!--src/app/hero-details.component.css-->

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

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

/deep/ 和 >>> 选择器只能被用在仿真 (emulated) 模式下。 这种方式是默认值,也是用得最多的方式。 更多信息,见控制视图封装模式一节。

CSS 标准中用于 "刺穿 Shadow DOM" 的组合器已经被废弃,并将这个特性从主流浏览器和工具中移除。 因此,我们也将在 Angular 中移除对它们的支持(包括 /deep/、>>> 和 ::ng-deep)。 目前,建议先统一使用 ::ng-deep,以便兼容将来的工具。

总结

以上所述是小编给大家介绍的vue、angular深度作用选择器,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
javascript 事件查询综合 推荐收藏
Mar 10 Javascript
根据对象的某一属性进行排序的js代码(如:name,age)
Aug 10 Javascript
Node.js开发指南中的简单实例(mysql版)
Sep 17 Javascript
JQuery 实现在同一页面锚点链接之间的平滑滚动
Oct 29 Javascript
js实现的倒计时按钮实例
Jun 24 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
Sep 04 Javascript
微信小程序实现表单校验功能
Mar 30 Javascript
redux-saga 初识和使用
Mar 10 Javascript
浅谈Vue数据响应思路之数组
Nov 06 Javascript
JS通过识别id、value值对checkbox设置选中状态
Feb 19 Javascript
javascript解析json格式的数据方法详解
Aug 07 Javascript
JS跨浏览器解析XML应用过程详解
Oct 16 Javascript
javascript 构建模块化开发过程解析
Sep 11 #Javascript
解决layer弹出层msg的文字不显示的问题
Sep 11 #Javascript
js贪心算法 钱币找零问题代码实例
Sep 11 #Javascript
解决layui使用layui-icon出现默认图标的问题
Sep 11 #Javascript
js图数据结构处理 迪杰斯特拉算法代码实例
Sep 11 #Javascript
js简单的分页器插件代码实例
Sep 11 #Javascript
解决在layer.open中使用时间控件laydate失败的问题
Sep 11 #Javascript
You might like
php实现的zip文件内容比较类
2014/09/24 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
Maps Javascript
2007/01/22 Javascript
一些易混淆且不常用的属性,希望有用
2007/01/29 Javascript
不间断滚动JS打包类,基本可以实现所有的滚动效果,太强了
2007/12/08 Javascript
Js 刷新框架页的代码
2010/04/13 Javascript
JS解析json数据并将json字符串转化为数组的实现方法
2012/12/25 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
jquery 提交值不为空的元素示例代码
2013/05/10 Javascript
dwz 如何去掉ajaxloading具体代码
2013/05/22 Javascript
js使用for循环与innerHTML获取选中tr下td值
2014/09/26 Javascript
jquery使整个div区域可以点击的方法
2015/06/24 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
2015/10/15 Javascript
canvas绘制多边形
2017/02/24 Javascript
seajs中最常用的7个功能、配置示例
2017/10/10 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
vue单页开发父子组件传值思路详解
2018/05/18 Javascript
Vuex的热更替如何实现
2020/06/05 Javascript
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
Python3.x和Python2.x的区别介绍
2013/02/12 Python
Python中的map、reduce和filter浅析
2014/04/26 Python
Python Flask-web表单使用详解
2017/11/18 Python
Python访问MongoDB,并且转换成Dataframe的方法
2018/10/15 Python
python 获取等间隔的数组实例
2019/07/04 Python
英国家电购物网站:Sonic Direct
2019/03/26 全球购物
澳大利亚第一旅行车和房车配件店:Caravan RV Camping
2020/12/26 全球购物
北京-环亚运商测试题.net程序员初步测试题
2013/05/28 面试题
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
《在大海中永生》教学反思
2014/02/24 职场文书
2014年安全工作总结范文
2014/11/13 职场文书
社区端午节活动总结
2015/02/11 职场文书
无罪辩护词范文
2015/05/21 职场文书
Python爬虫进阶之Beautiful Soup库详解
2021/04/29 Python
浅谈如何提高PHP代码质量之单元测试
2021/05/28 PHP
MySQL数据库简介与基本操作
2022/05/30 MySQL
Spring boot admin 服务监控利器详解
2022/08/05 Java/Android