解析Angular 2+ 樣式綁定方式
引言
開發(fā)ngx(angular 2+ 以后都直接稱為ngx
)也有1年半的時(shí)間了,剛開始開發(fā)的時(shí)候使用的還是angular2 RC版,現(xiàn)在已經(jīng)出angular5了,時(shí)光飛逝?。?br />
ngx從設(shè)計(jì)之初就是一個(gè)component-based的框架,所以大到一個(gè)頁面,小到一個(gè)按鈕,都是一個(gè)component。
這就涉及到了組件的重用,設(shè)計(jì)通用組件的時(shí)候,必不可少的就是動(dòng)態(tài)的樣式綁定。
回頭想想, angular還真是給我們提供了好幾種屬性綁定的方式呢。
接下來我們就來具體看看如果在組件中使用樣式綁定。
style binding
[style.propertyName]
我們有一個(gè)button,默認(rèn)的樣式是bootstrap
的primary
,
假如在不同的頁面中按鈕的大小要不同,這個(gè)時(shí)候就需要?jiǎng)討B(tài)綁定button的字體大小,可以使用[style.propertyName]
來實(shí)現(xiàn)。
template中代碼
<button class="btn btn-primary" [style.fontSize]="fontSize"> Style Binding </button>
Component類中代碼
private fontSize: string = "2em";
結(jié)果如圖:
假如我們還需要?jiǎng)討B(tài)設(shè)置button的邊框半徑border-radius
,
template中代碼則變?yōu)椋?/p>
<button class="btn btn-primary" [style.fontSize]="fontSize" [style.borderRadius]="borderRadius"> Style Binding </button>
Component類中代碼則變?yōu)椋?/p>
private fontSize: string = "2em"; private borderRadius: string = "10px";
則結(jié)果變成:
使用[style.propertyName]來綁定樣式屬性固然不粗,可是一旦有新的需求,我們就需要繼續(xù)加上我們需要綁定的屬性, 這個(gè)時(shí)候組件上綁定的屬性就會(huì)越來越多,我們有沒有辦法來創(chuàng)建一個(gè)object
來存儲(chǔ)我們需要綁定的屬性呢? 當(dāng)然有,[ngStyle]就可以幫我們來做這件事情。
[ngStyle]
所以上面的例子,我們就可以直接使用[ngStyle]
來動(dòng)態(tài)綁定button的font-size
和border-radius
。
template中的代碼則變?yōu)椋?/p>
<button class="btn btn-primary" [ngStyle]="btnStyle" > Style Binding </button>
Component類的代碼則變?yōu)椋?/p>
private btnStyle: any = { borderRadius: "10px", fontSize: "2em" };
結(jié)果為:
[style.propertyName] vs. [ngStyle]
[style.propertyName]每次只能綁定一個(gè)屬性
而 [ngStyle] 則可以同時(shí)綁定多個(gè)屬性
當(dāng)[style.propertyName] 和 [ngStyle] 綁定同一個(gè)屬性時(shí),比如都需要?jiǎng)討B(tài)修改font-size
, [style.propertyName]則會(huì)覆蓋[ngStyle]里面的同一屬性.
當(dāng)然除了style binding, 我們還可以使用class binding來動(dòng)態(tài)修改樣式。
class binding
[class.className]
使用這種方式,我們可以根據(jù)綁定變量的值來動(dòng)態(tài)添加或者移除css class。
還是使用剛才button的例子。
則代碼變?yōu)椋?/p>
//template <button class="btn btn-primary" [class.btnBorder]="changeBorder" > Style Binding </button> //CSS .btnBorder { border-color: green; border-radius: 10px; } //Component Class private changeBorder: boolean = true;
結(jié)果如圖:
看著字體有點(diǎn)小啊,我們?cè)賱?dòng)態(tài)添加一個(gè)改變字體的class:my
這個(gè)時(shí)候代碼就變?yōu)榱耍?/p>
//template <button class="btn btn-primary" [class.btnBorder]="changeBorder" [class.btnFont]="changeFont" > Style Binding </button> //CSS .btnBorder { border-color: green; border-radius: 10px; } .btnFont { font-size: 2em; font-weight: bold; } //Component Class private changeBorder: boolean = true; private changeFont: boolean = true;
結(jié)果如圖:
[ngClass]
像[ngStyle]一樣,angular也給我們提供了一個(gè)指令[ngClass]來動(dòng)態(tài)綁定多個(gè)css class。
那么我們可以使用[ngClass]對(duì)上面的代碼重構(gòu)一下
//template <button class="btn btn-primary" [ngClass]= "{'btnFont': changeFont, 'btnBorder': changeBorder}"> Style Binding </button> //CSS .btnBorder { border-color: green; border-radius: 10px; } .btnFont { font-size: 2em; font-weight: bold; } //Component Class private changeBorder: boolean = true; private changeFont: boolean = true;
結(jié)果依舊為:
[ngClass]需要綁定一個(gè)object,key是css類名, value是綁定的變量。
[class.className] vs. [ngClass]
[class.className]每次只能綁定一個(gè)CSS類。
而 [ngClass] 則可以同時(shí)綁定多個(gè)CSS類。
當(dāng)[class.className] 和 [ngClass] 需要?jiǎng)討B(tài)修改同一個(gè)樣式時(shí),比如都需要?jiǎng)討B(tài)修改font-size
, [class.className]則會(huì)覆蓋[ngClass]里面的統(tǒng)一樣式.
[className]
angular還提供一種綁定方式,就是直接通過修改元素的className
來動(dòng)態(tài)改變樣式。
但我不推薦
這種使用方式,為什么不推薦? 看下面的例子
//template <button class="btn btn-primary" [className]="changedFont"> Style Binding </button> //CSS .btnBorder { border-color: green; border-radius: 10px; } .btnFont { font-size: 2em; font-weight: bold; } //Component Class private changedFont: string = "btnFont";
結(jié)果卻變成了這樣:
我們預(yù)先設(shè)置好的bootstrap的primary
被移除了, 就是因?yàn)閇className]會(huì)添加動(dòng)態(tài)綁定的類名,然后移除之前所有的類名。
所以這種綁定方式是很有危險(xiǎn)性的,因?yàn)獒槍?duì)一個(gè)組件,我們通常都會(huì)有很多種類來共同控制樣式。
在通用組件中,非常不推薦使用[className]。
總結(jié)
最后再來總結(jié)下angular中各種樣式綁定的特點(diǎn)和區(qū)別:
- [style.propertyName] 直接綁定一個(gè)string類型的樣式值,或者string類型的變量。優(yōu)先級(jí)最高,會(huì)覆蓋已有的樣式屬性。
- [ngStyle]綁定一個(gè)樣式組合的object,key是css屬性名,value是對(duì)應(yīng)的樣式值,或者string類型的變量。
- [class.className] 直接綁定true/false, 或者boolean類型的變量。
- [ngClass]綁定一個(gè)css類名組合的object,key是css類名,value是true/false 或者boolean類型的變量。
- [className] 直接綁定css類名,或者string類型的變量。 (不推薦使用這種方式)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
如何在Angular8.0下使用ngx-translate進(jìn)行國際化配置
這篇文章主要介紹了如何在Angular8.0下使用ngx-translate進(jìn)行國際化配置,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07詳解基于angular-cli配置代理解決跨域請(qǐng)求問題
本篇文章主要介紹了詳解基于angular-cli配置代理解決跨域請(qǐng)求問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07如何以Angular的姿勢(shì)打開Font-Awesome詳解
這篇文章主要給大家介紹了關(guān)于如何以Angular的姿勢(shì)打開Font-Awesome的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Angular具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04Angular.JS去掉訪問路徑URL中的#號(hào)詳解
最近天天都在用AngularJS,各類文檔也都看過好幾遍,但總是些編程上的事找不到優(yōu)雅的解決辦法。今天終于把AngularJS的項(xiàng)目訪問路徑URL里的#號(hào)去掉了,這個(gè)問題不見得有多難,關(guān)鍵是花多長時(shí)間去理解AngularJS框架本身,下面來看看詳細(xì)介紹,需要的朋友可以參考下。2017-03-03Angular4學(xué)習(xí)筆記之新建項(xiàng)目的方法
本篇文章主要介紹了Angular4學(xué)習(xí)筆記之新建項(xiàng)目的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07