成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

angular怎么進行樣式隔離?實現機制詳解

angular怎么進行樣式隔離?下面本篇文章就來帶大家了解一下angular的樣式隔離實現機制,希望對大家有所幫助!

angular怎么進行樣式隔離?實現機制詳解

angular 以組件為基本單位。我們編寫一個一個的組件,再將這些組件組合為一顆組件樹。但是在開發的過程中,經常需要在父組件中覆蓋子組件的樣式。比如現在我們有一個parent 組件和child 組件,child 組件里面有一個span,span 的字體為紅色。

如下所示:

//child.componet.html <span class="child-span">child span</span> //child.component.scss .child-span {   color: red; }
登錄后復制

如果現在,parent 組件想要child 組件中span 的內容變成綠色。可以使用如下的方式

//parent.component.scss app-child {   ::ng-deep {     .child-span {       color: green;     }   } }
登錄后復制

登錄后復制

在parent 組件中,使用angular 提供的::ng-deep 關鍵字進行樣式的覆蓋。【相關教程推薦:《angular教程》】

現在我們修改一下child 組件的內容,在span 外面加上一層div,畢竟現實中的組件肯定不會只有一層這么簡單。

//child.componet.html <div class="child-div">   <span class="child-span">child span</span> </div> //child.component.scss .child-div {   .child-span {     color: red;   } }
登錄后復制

這時候,我們會發現child 組件中span 的內容又變回了紅色,之前parent 組件對其的覆蓋并沒有生效。

::ng-deep 為什么會失效呢?或者說,::ng-deep 會在什么時候有效?什么時候失效?更進一步說,angular 中組件和組件之間的樣式隔離是怎么做到的呢?

css 選擇器

css 中提供了元素選擇器,id 選擇器,class 選擇器以及屬性選擇器

對于angular 的樣式隔離的問題,比較重要的就是屬性選擇器。 在屬性選擇器中,通過給元素添加任意一個屬性,可以準確地選中這個元素。 比如說,

a[target] {     background-color:yellow; }
登錄后復制

通過上面的選擇器,我們可以選中所有帶有target屬性的a元素。

另外一個是后代選擇器

在css 中,后代選擇器會選擇指定元素的所有后代元素。 比如,

[attr] span {     color: green; }
登錄后復制

這個選擇器會首先選中帶有attr 屬性的元素,然后選中這個元素的所有后代span 元素。

有了css 屬性選擇器后代選擇器,就有了需要完成組件樣式隔離的所有工具。angular 中組件的樣式隔離與::ng-deep 完全基于這兩個內容。

angular 樣式隔離實現機制

我們現在回到之前的angular組件 child 組件的內容為

//child.componet.html <span class="child-span">child span</span> //child.component.scss .child-span {   color: red; }
登錄后復制

parent 組件的內容為

//parent.component.html <app-child></app-child>
登錄后復制

上面兩個組件經過angular 處理以后,生成的html 內容如下

angular怎么進行樣式隔離?實現機制詳解

可以看到,parent 組件上面多了_ngcontent-mye-c13_nghost-mye-c12 兩個屬性,而child 組件上面多了_ngcontent-mye-c12_nghost-mye-c11 兩個屬性,child 組件下的span 標簽,增加了_nghost-mye-c11 屬性。

對于scss 文件,經過angular 的處理以后,在child 組件中的.child-span 類,變成了.child-span[_nghost-mye-c11]

angular怎么進行樣式隔離?實現機制詳解

通過這些內容我們就可以看出來angular 的樣式隔離就是利用屬性選擇器完成的。

_nghost-mye-c11 這個屬性只會出現在child 組件中。在child.component.scss 中的.child-span類變成了.child-span[_nghost-mye-c11],根據之前提到的屬性選擇器的機制,.child-span 只會對child 組件的內容生效。

如果在parent 組件內部也寫一個.child-span類選擇器,那么生成的類選擇器就會是.child-span[_nghost-mye-c12]。而_nghost-mye-c12 這個屬性是屬于parent 組件的,于是這個.child-span 類只會對parent 組件的內容生效。并不會影響到child 組件,樣式的隔離也就完成了。

::ng-deep

那為什么通過::ng-deep 可以在parent 組件里面,覆蓋child 組件中的內容呢?

//parent.component.scss app-child {   ::ng-deep {     .child-span {       color: green;     }   } }
登錄后復制

登錄后復制

上面的內容通過angular 處理以后,生成的內容為app-child[_nghost-mye-c12] .child_span。位于::ng-deep 后面的類,去掉了自動添加的屬性,這時候根據css 的后代選擇器機制。app-child[_nghost-mye-c12] .child_span會選中child 組件下面的所有帶有.child_span 類的標簽,而且根據優先級計算,app-child[_nghost-mye-c12] .child_span 高于child 組件生成的.child_span[_nghost-mye-c11] ,于是child 組件中的樣式就被覆蓋掉了。

那為什么有時候::ng-deep不能夠覆蓋掉呢?比如,當child 組件代碼如下的時候

//child.componet.html <div class="child-div">   <span class="child-span">child span</span> </div> //child.component.scss .child-div {   .child-span {     color: red;   } }
登錄后復制

這時候即使我們發現child 組件中span 的顏色依舊是紅色。

實際上原因也不復雜,檢查angular 生成的樣式文件后,我們可以發現,之所以沒有把覆蓋掉,純粹是因為css 選擇器優先級的問題。child 組件生成的樣式.child-div[_nghost-mye-c11] .child-span[_nghost-mye-c11] 優先級高于parent 組件生成的樣式app-child[_nghost-mye-c12] .child。于是,我們看到的效果就是parent 組件中的::ng-deep 沒有生效,一種比較快捷的做法是直接在parent 組件的樣式后面加上!important。但是由于!important 權重太高的原因,并不是很推薦。歪個樓,在發現angular ::ng-deep 失效的原因之前,很遺憾,項目之前很多地方的都有這種用法。

另一個方法就是,既然是因為優先級不夠,那么提高parent 組件生成的樣式的優先級就可以了。 修改parent 組件的代碼為

:host {   app-child {     ::ng-deep {       .child-div {         .child-span {           color: green;         }       }     }   } }
登錄后復制

這時候,parent 組件生成的樣式[_nghost-mye-c12] app-child[_nghost-mye-c12] .child-div .child-span 優先級高于child 組件生成的樣式.child-div[_nghost-mye-c11] .child-span[_nghost-mye-c11] ,child 組件中span 的顏色也就變綠了。

這里我們使用了:host 關鍵字,接下來,我們簡單看看它的作用。

:host

上個小結中,parent 組件生成的樣式是[_nghost-mye-c12] app-child[_nghost-mye-c12] .child-div .child-span,如果去掉:host,就會發現,生成的樣式變成了app-child[_nghost-mye-c12] .child-div .child-span。所以:host 關鍵字只是給生成的樣式,加上了parent 組件屬性字段而已。

那這個:host有什么用呢?

常見的作用有兩個。

一個就是選擇當前的組件標簽,在angular 中,我們自定義的組件,比如這里的parent 組件app-parent 和child 組件app-child 最后都是會渲染到生成的html 文檔上的。如果需要選中這些標簽,就可以使用:host 關鍵字。

另一個作用還是隔離樣式,將class 類寫在:host 內部,這個類無論如何也是不可能泄漏到全局去的。實際上,通過前面的內容分析可以發現,不寫在:host 里面,也不會泄漏到全局。但是如果出現了以下的情況

//some.component.scss ::ng-deep {     .random-class {         xxxx     } }
登錄后復制

這個類經過angular 處理以后,最后會變為

.random-class {     xxxx }
登錄后復制

random-class 將會對全局造成影響。

但是如果把它包裹在:host 內部,哪怕使用了::ng-deep 關鍵字,最多也只會影響到這個組件的后代元素。 所以在angular 官方文檔中有下面的一段話。

Applying the ::ng-deep pseudo-class to any CSS rule completely disables view-encapsulation for that rule. Any style with ::ng-deep applied becomes a global style. In order to scope the specified style to the current component and all its descendants, be sure to include the :host selector before ::ng-deep. If the ::ng-deep combinator is used without the :host pseudo-class selector, the style can bleed into other components.

總結

我們首先介紹了css 的屬性選擇器和后代選擇器。通過分析angular 生成的html 和css 代碼,發現angular 的樣式隔離功能,完全是基于這兩個內容實現的。接下來,分析了::ng-deep 有時候生效,有時候有不生效的原因。最后介紹了使用:host 關鍵字來完全避免樣式泄漏到全局。

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
无码AV岛国片在线播放| 日韩乱码人妻无码系列中文字幕| 欧产日产国色天香区别9视频| 免费人成视频网站在线18| 欧美黑人又大又粗XXXXX吞精| 人人爽人人澡人人人妻| 色欲香天天天综合网站无码| 无码国产精品一区二区免费I6| 亚洲AV玩弄放荡人妇系列| 亚洲乱理伦片在线观看中字| 又大又粗欧美成人网站| AV在线播放网站| 波多野结衣无内裤护士| 国产丰满老熟女重口对白| 黑人狂虐中国人妻陈艳| 巨大垂乳日本熟妇挤奶| 人妻激情偷乱频一区二区三区| 色五月丁香六月欧美综合| 先锋中文字幕在线资源 | 草莓 丝瓜 香蕉 向日葵 榴莲| 闺蜜张开腿让我爽了一夜| 果冻传媒AⅤ毛片无码蜜桃| 狂野欧美激情性XXXX| 人妻无码久久一区二区三区免费 | 亚洲А∨天堂久久精品9966| 在线观看大片免费播放器 | 又大又粗又爽的少妇免费视频| YY111111少妇影院无码老| 国产高清中文版HD中字 | 亚洲国产精品福利片在线观看| 中文无码熟妇人妻AV在线| 成人性生交大片免费看| 国语精品自产拍在线观看网站| 免费 成 人 黄 色 网站69| 色ww1区2区在线观看| 亚洲精品成人久久久| AV无码中出一区二区三区| 国产精品国产三级国AV| 久久久亚洲裙底偷窥综合| 人物动物交互第LL0集| 亚洲AⅤ秘区二区三区4| 综合久久国产九一剧情麻豆 | 黑人上司与人妻激烈中文字幕 | 黑人啊灬啊灬啊灬快灬深| 男生坤坤放在女生坤坤里开元棋| 天天做天天爱夜夜爽毛片| 一本大道大臿蕉无码视频| 敌伦交换第21部分剧情介绍| 久久国产成人精品国产成人亚洲| 日本ⅩXXX色视频在线观看| 亚洲国产成人高清在线观看| BT天堂网.WWW在线资源| 国内精品综合久久久40P| 欧美亚洲国产SUV| 亚洲成A人片在线不卡一二三区| CHINESE熟女老女人HD视频| 国内色母与进口色母区别| 欧美日韩成人在线观看| 亚洲丰满熟妇浓毛XXXX| 波多野结衣人妻女教师4| 九九99久久精品国产| 色一情一乱一伦一视频免费看| 一区二区三区精品视频免费播放| 国产9 9在线 | 中文| 蜜桃AV噜噜一区二区三区| 五月婷日韩中文字幕| CHINESE国产AVVIDE| 精品久久久久久天美传媒| 色婷婷精品久久二区二区蜜臀av | 天堂А√在线中文在线新版| 中文字幕人妻被公上司喝醉在线| 国产精品香蕉在线观看网| 欧美精品九九99久久在免费线| 亚洲WWW永久成人网站| 成熟妇女性成熟满足视频| 久久综合激激的五月天| 午夜无码乱码在线观看| 把腿张开老子臊烂你的小说 | 亚洲色成人一区二区三区小说| 国产爆乳无码一区二区麻豆| 欧美交换配乱吟粗大视频| 亚洲日韩高清AⅤ在线观看| 国产成人午夜在线视频A站| 欧美XXXX黑人又粗又大| 亚洲乱码一区AV春药高潮| 国产成人亚洲精品无码高潮| 青春草无码精品视频在线观看 | AV无码AV高潮AV喷吹免费| 久久精品这里热有精品| 小东西好几天没弄了还能吃吗 | 在线观看特色大片免费网站 | 成人精品免费视频在线观看| 美女扒开粉嫩尿口的照片| 亚洲国产精品无码专区| 国产精品99无码一区二蜜桃| 人妻少妇性色精品专区av| 中国亚州女人69内射少妇| 精品人妻潮喷久久久又裸又黄| 为什么放进去女的就老实了| 波多野结衣迅雷下载| 男人吃奶摸下挵进去好爽| 亚洲中文字幕AV无码专区| 国产一卡2卡3卡4卡网站免费| 少女たちよ在线观看动漫在线观看 | 在教室伦流澡到高潮HGL视频| 精品高潮呻吟99AV无码视频| 无码中文字幕AV久久专区| 多毛小姐BGMBGMBGM| 人妻丰满被色诱中文字幕| 重囗味sm在线观看无码| 久久人人做人人妻人人玩精品VA| 亚洲成人无码AV| 国产女人喷潮视频在线观看| 天天大片天天看大片| 东北少妇大叫高潮XXXⅩ| 人与动人物XXXX毛片在线播放| JAPANESE高潮尖叫| 欧美乱妇狂野欧美在线视频| 80岁老熟妇乱子伦牲交| 蜜桃Av噜噜一区二区三区绯色| 伊人精品无码一区二区三区电影| 久久精品人妻中文系列葵司| 亚洲乱亚洲乱少妇无码| 精品人妻无码中字系列| 亚洲国产成人爱AV网站| 精品麻豆一区二区三区乱码| 亚洲国产成人爱AV在线播放| 饥渴少妇高清VIDEOS| 亚洲VA无码专区国产乱码| 国语自产精品视频在线区| 亚洲VA中文字幕无码毛片| 好男人好资源电影在线播放| 亚洲成a人片在线观看无码关注| 黑人大荫蒂高潮视频| 亚洲精品欧美综合二区| 久久97精品久久久久久久不卡| 亚洲精品自产拍在线观看动漫| 精品少妇一区二区| 亚洲一线二线三线品牌精华液 | 强壮公的侵犯让我高潮不断| YYYY11111少妇无码影院| 人人澡人人妻人人爽人人蜜桃| 成年免费视频黄网站在线观看| 日本熟妇人妻XXXXX野外呻| 成人免费A级毛片久久| 少妇精品久久久久www| 国产高潮呻吟无码精品AV| 性饥渴少妇做私密SPA| 好紧真爽喷水高潮视频办公室| 亚洲精品无码久久久久SM | 国产精品秘 入口A级熟女| 亚洲 小说 欧美 激情 另类| 精产国品一二三产区区别在线观看 | 国产免费人成视频在线播放播| 亚洲成aV人无码| 久久婷婷人人澡人人爽人人喊| 中文字幕一区二区人妻| 清区二三区国产好的精华液| 丰满大屁股BWWBWWBWW| 无人区卡一卡二卡三乱码入口| 国精产品一区一区三区| 亚洲熟妇无码乱子AV| 免费SM虐女调教网站视频| 扒开腿狂躁女人爽出白浆| 丝袜中文人妻无码有码久热| 国内精品人妻无码久久久影院| 亚洲日本人成网站在线播放| 麻豆影视视频在线观看完整版| BT天堂在线观看WWW| 少妇厨房愉情理9仑片视频| 国产青草视频在线观看 | 久久AV高潮AV无码AV| 27邪态恶动图GIF喷水赞一把| 日本护士毛茸茸高潮| 国产精品久久久久精品麻豆| 亚洲欧美国产精品久久| 农村妇女野战BBXXX农村妇女| 成人午夜亚洲精品无码区| 亚洲Av无码成人黄网站在线| 久久综合亚洲色一区二区三区| 啊灬啊灬高潮来了…视频APP| 无码AV无码一区二区| 精品无码国产污污污免费网站| 777国产偷窥盗摄精品品在线| 少妇被粗大的猛烈进出96影院| 果冻传媒AⅤ毛片无码| 最新版天堂资源网在线种子| 视频一区二区三区日韩| 久久99青青精品免费观看| SLEEP强弙VIDE○SHO| 性高朝久久久久久久久久| 每天都在挨CAO中醒来H| 丰满少妇奶水一区二区三区| 亚洲美女国产精品久久久久久久久| 欧美丰满多毛少妇XXXXX性| 国产精华液一区二区区别大吗| 亚洲中文字幕无码爆乳AV| 日本做受高潮好舒服视频| 皇叔撞着小公主的小说叫什么 | 国产看黄网站又黄又爽又色|