CSS樣式表全稱叫Cascading Style Sheets是一種用來表現HTML文件樣式的語言,是Web前端開發中一定會用到的排版語言,那麼Ngui中css的靈感就來自於此。與其說是靈感還不如果說是借鑒並通過精簡而來,因為開發這個框架的初衷效率一直就是最重的目標,其次才是使用體驗 ...
CSS樣式表簡介
CSS樣式表全稱叫Cascading Style Sheets
是一種用來表現HTML文件樣式的語言,是Web前端開發中一定會用到的排版語言,那麼Ngui中css的靈感就來自於此。與其說是靈感還不如果說是借鑒並通過精簡而來,因為開發這個框架的初衷效率一直就是最重的目標,其次才是使用體驗。
下麵是Ngui中CSS樣式表的寫法:
import { CSS, Div, Text } from 'ngui';
CSS({
'.a': {
width: '100%',
height: '100%',
contentAlign: 'center',
},
'.a .b': {
width: 100,
height: 100,
marginTop: 'auto',
marginBottom: 'auto',
backgroundColor: '#f00',
},
});
const vx = (
<Div class="a">
<Text class="b">Hello!</Text>
</Div>
);
是不是很熟悉呢。
CSS樣式表運行時
這裡說的是新式表到底是什麼時間應用到視圖上的。樣式表並不會主動去查詢View.class,繪圖線程在渲染幀畫面前會先查詢並解決所有需要更新的樣式表class
。請記住樣式表只是靜態的屬性集合,樣式表的應用是需要的視圖對像主動查詢。所以當一個視圖先前已經應用過樣式表,然後樣式表屬性被更改後並不會影響到先前應用樣式表的視圖。需要註意的一點是樣式表樣表應用只是簡單的對視圖對像屬性的更改,並沒有權重的概念,所以在應用樣式表時需要註意與直接設置屬性的先後順序,很有可能先前設置的視圖屬性被樣式表覆蓋,因為樣式表class
的設置並不會立即生效它總是在渲染開始前才應用到視圖。
CSS樣式表名稱規則
非常抱歉的告訴各位,現在的樣式表體系只支持class
並不支持id
與tagName
。還是因為同樣的原因效率問題,所以我希望儘量簡單。當然這一切都需要在使用體驗上付出代價,也許在某一天會有人想出更好的替代方案也說不定,要知道眾人的力量是無窮的況且現在框架本身不需限制於任何標準。
名稱組合
樣式表首先都是全局的,後面定義的同名樣式表會與前面定義的樣式表合併如果有重覆的屬性會進行替換。怎樣的名字是同名的呢?並不是說定義時的名稱組合key
本身,看下麵的例子。
CSS({
'.a': { height: 100 },
'.b': { backgroundColor: '#f00' },
'.c': { border: '1 #000' },
'.a.b': { width: 100 },
'.b.a': { width: 200 },
});
const vx = (
<Div class="a b c" />
);
上面.a.b
與.b.a
表示其實是同一個名稱。並且最後的width
為200。
並且越長的名稱組合就會有越多的組合結果,也就是說查詢也會需要更多的時間。比如class="a b c"
的樣式組合會有.a
、.b
、.c
、.a.b
、.a.c
、.b.c
、.a.b.c
7種結果,當視圖應用這個樣式時需要查詢這7種可能性。所以在Ngui中CSS樣式表的組合限制在4個,多於4個時的組合時可能會出現意想不到結果。
多級名稱
樣式表的數據結構其實是個樹狀結構,每個具名的樣式表都可以有子樣式表,子級樣式表以空格區分且級數沒有限制但理論來說越多的級數查詢的速度也會越慢。如:
CSS({
'.a': { width: 200, height: 200 },
'.b': { height: 100 },
'.a .b': { width: 100, height: 200 },
});
const vx = (
<Div class="a">
<Text class="b">Hello!</Text>
</Div>
);
-
子級樣式表權重會更高上面的例子中Text的
height
應該是200
.a .b
的樣式表屬性會覆蓋.b
。 -
多級樣式表的應用也必須對應視圖的嵌套關係,這樣樣式才能生效,比如上面的例子中
.a .b
這個樣式表應用於視圖時,這個視圖的父級或頂級視圖的樣式表必須亦一個.a
。
偽類
偽類有三種類型分為normal
、hover
、down
分別對應正常、游標進入、游標按下。當然在觸摸屏上沒有游標所有hover
也不會存在。只有normal
、down
對應觸摸開始與觸摸結束。
例:
CSS({
'.a': { width: 100, height: 100 },
'.a:normal': { backgroundColor: '#aaa' },
'.a:hover': { backgroundColor: '#f00' },
'.a:down': { backgroundColor: '#f0f' },
});
const vx = (
<Div class="a" />
);
有一點需要註意偽類不可以再有子級偽類,如:
CSS({
'.a:hover': { backgroundColor: '#f00' },
'.a:hover .b': { width: 200 },
'.a:hover .b:hover': { backgroundColor: '#ff0' }, // 這條規則會拋出異常
});