前言
在上一篇說明 JS 互通性時,有提到在 Blazor 上撰寫 JS 的部分,現在來介紹在 Blazor 中 CSS 的部分
CSS Isolation (CSS 隔離)
大家都知道 CSS 的套用是全域的,只要符合 CSS Selector 的所選的項目就會被套用上對應的樣式,想跑都沒辦法跑,為了避免衝突,微軟在 .Net 5 支援了在元件中使用 CSS Isolation,我們來看一下他是怎麼運作的
首先,我們將目光轉移到 wwwroot/index.html
,在其中會看到有引入一個專案名稱.style.css
可是在專案目錄中卻找不到這份檔案的存在
這是因為這個檔案是所有的元件CSS,編譯後匯總產生,接下來我們來實作一下CSS,看一下隔離是怎麼實現的
在
Pages
資料夾中新增一個檔案,名稱為Index.razor.css
完成後會發現他躲在Index.razor檔案下,其實這樣做就完成隔離了,在其中寫的CSS只會和Index.razor
內的元素產生反應在剛剛新增的
Index.razor.css
內撰寫內容
|
|
- 執行專案,觀察結果
h1 標籤的 Hello World,成功變色了
打開開發人員工具看一下會發現在 h1 的 html 上多了
b-x8jq25t3t1
,CSS的選擇器則變成h1[b-x8jq25t3t1]
這個看起來像是亂碼的就是 CSS 隔離實行的關鍵,編譯時會給予隨機的字串,用以區別各個元件內的 CSS Selector
子元件的 CSS 隔離
演示一下正常的情況
建立一個 CssTest.razor
,將原本的 h3 改成 h1
|
|
然後放到 Index.razor
ˋ 中
|
|
可以發現子元件的h1
標籤沒有被轉譯過
如果想讓子元件也可以讀取到父元件的 CSS 樣式,只需要加入 ::deep
,所以回到剛剛的 Index.razor.css
|
|
完成後執行就會發現 啪! 沒了,怎麼連原本的紅色都沒了???
導致這樣的原因是 ::deep
被轉譯後變成 b-x8jq25t3t1
所以CSS樣式變成這樣
|
|
HTML的部分則是這樣
|
|
仔細看會發現轉譯後的 CSS Selector 沒有選到我們要套用樣式的元素,應該在外包一層有 x8jq25t3t1
的標籤,所以我們只要在外層包一個div
就可以了
Index.razor
|
|
套用後就可以正常使用了!
自訂識別格式
在預設情況,Blazor 框架所產生的CSS隔離識別碼會是b-
+ 10個字元組成的,如果想要自訂最前面的b
也是可以的只需要在專案檔內調整即可
|
|
加入後成果會像是這樣
如果想要把全部的元件都使用自定義的識別碼,可以把 Component 的名稱改成 *
前處理器
很多人開發時,會使用 Scss、Less來開發,但是不幸的是 Blazor 的 CSS 隔離目前暫時不支援使用前處理器,但是可以透過一些套件來使用
關閉 CSS 隔離
如果不想要使用 CSS 隔離,也可以把這項功能關閉,一樣是在專案檔的地方調整
|
|
小結
到這邊我們大概清楚了網頁三大要素 HTML、CSS、Javascript 該寫在哪邊,接下來我們來講講在Blazor上檔案的上傳以及下載