解析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 词法作用域和闭包分析说明
Aug 12 Javascript
JavaScript下利用fso判断文件是否存在的代码
Dec 11 Javascript
jquery属性过滤选择器使用示例
Jun 18 Javascript
js实现div闪烁原理及实现代码
Jun 24 Javascript
简化版手机端照片预览组件
Apr 13 Javascript
微信小程序 连续旋转动画(this.animation.rotate)详解
Apr 07 Javascript
用Cordova打包Vue项目的方法步骤
Feb 02 Javascript
layui table 表格上添加日期控件的两种方法
Sep 28 Javascript
vue实现购物车加减
May 30 Javascript
vue-router之解决addRoutes使用遇到的坑
Jul 19 Javascript
swiper自定义分页器的样式
Sep 14 Javascript
JavaScript 绘制饼图的示例
Feb 19 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
vBulletin HACK----显示话题大小和打开新窗口于论坛索引页
2006/10/09 PHP
php jquery 实现新闻标签分类与无刷新分页
2009/12/18 PHP
PHP+memcache实现消息队列案例分享
2014/05/21 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
PHP Trait代码复用类与多继承实现方法详解
2019/06/17 PHP
20款效果非常棒的 jQuery 插件小结分享
2011/11/18 Javascript
javascript五图轮播切换实用版
2012/08/17 Javascript
js中的json对象详细介绍
2014/10/29 Javascript
JavaScript中exec函数用法实例分析
2015/06/08 Javascript
探究Javascript模板引擎mustache.js使用方法
2016/01/26 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
JS常见简单正则表达式验证功能小结【手机,地址,企业税号,金额,身份证等】
2017/01/22 Javascript
vue.js父组件使用外部对象的方法示例
2017/04/25 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
2017/06/14 Javascript
看看“疫苗查询”小程序有温度的代码
2018/07/31 Javascript
小程序兼容安卓和IOS数据处理问题及坑
2018/09/18 Javascript
原生js实现Flappy Bird小游戏
2018/12/24 Javascript
JavaScript实现简单验证码
2020/08/24 Javascript
Python之Scrapy爬虫框架安装及使用详解
2017/11/16 Python
深入浅析python3中的unicode和bytes问题
2019/07/03 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
2019/07/22 Python
Django Xadmin多对多字段过滤实例
2020/04/07 Python
python多线程实现同时执行两个while循环的操作
2020/05/02 Python
python实现126邮箱发送邮件
2020/05/20 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
2020/12/10 Python
各大浏览器 CSS3 和 HTML5 兼容速查表 图文
2010/04/01 HTML / CSS
html5实现多文件的上传示例代码
2014/02/13 HTML / CSS
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
柯基袜:Corgi Socks
2017/01/26 全球购物
如何打印出当前源文件的文件名以及源文件的当前行号
2015/04/05 面试题
财务管理专业自荐信范文
2013/12/24 职场文书
安全教育感言
2014/03/04 职场文书
2014县政府领导班子三严三实对照检查材料思想汇报
2014/09/26 职场文书
庆祝儿童节标语
2014/10/09 职场文书
浅析Redis Sentinel 与 Redis Cluster
2021/06/24 Redis
python 标准库原理与用法详解之os.path篇
2021/10/24 Python