Sencha Touch CSS 渲染
在 Sencha Touch 的環境中,所有的畫面顯示與配置都是統一透過 CSS 進行渲染。當然在使用 Sencha Touch 時我們也需要盡可能地遵循「使用 CSS 渲染設計模式」。一般來說在網頁中使用 CSS 語法可以分為內部套用 (Inline) 與外部套用兩種主要的方式,內部套用就是透過 style 參數進行設定,彈性低不推薦使用;而外部套用就是將 CSS 語法寫在另一個地方(通常是獨立的 CSS 檔案),然後載入進行串接與渲染。
我們可以在最原始的 app.json 看到預設就載入的 app.css(),如下:
...
"css": [
{
"path": "resources/css/app.css",
"update": "delta"
}
],
...
使用外部套用 CSS 是最推薦的方式,因此在套用時就需要 CSS Query,然而 CSS Query 最依賴的設計就是 ID 與 Class。那麼在 Sencha Touch 中要如何指定 Class 與 ID 呢?查閱一下文件,其實所有的 Ext.Component 都支援 id 與 class 的指定,我們可以透過以下方法在 config.id 中指定 ID:
Ext.define('Demo.view.Main', {
extend: 'Ext.Component',
config: {
id: 'my-super-id'
}
});
若是要指定 Class 可以透過 config.cls 或者 Ext.Component.setCls() / addCls() 來完成,如下所示:
Ext.define('Demo.view.Main', {
extend: 'Ext.Component',
config: {
cls: 'my-super-cls',
listeners: {
initialize: function () {
this.addCls('my-super-cls-add');
}
},
}
});
從上面的程式看來,這個元件一開始被指定了「my-super-cls」,此外在 initialize 又被新增了「my-super-cls-add」,因此擁有了這兩個 Class,Dom 結構如下圖:
上圖中我們可以看到確實有出現我們程式中指定的 Class,而由於我們沒有指定 id,因此 id 由 Sencha Touch 自行產生。注意看一下 class 還出現了其他莫名其妙的名稱,這些都是 Ext 既有的機制,這些機制是很有用的,可以應用在設計 CSS Query 上。
如果你想要使用內部套用直接指定 CSS 給元件也可以透過 config.style 來達成,當然這種方法上面提過彈性不高不建議使用。
Ext.define('Demo.view.Main', {
extend: 'Ext.Component',
config: {
style: 'border: 1px solid #000;'
}
});
Sencha Touch UI 機制
接下來我們來介紹 Sencha Touch 既有的 UI 機制,與其說是 UI 機制倒不如解釋為「預設自動將元件加入 Class 的機制」比較容易了解。原生的 Ext 元件都有一個 alias 名稱叫做 xtype,所有的元件也會依據這個特性自動加入 Class。此外除了上一節提到的 ID 與 Class 之外,Sencha Touch 還提供了 UI 設計模式,這個設計有點類似 Theme 的感覺,既有的元件很多都已經提供許多不同的 UI 來讓我們套用(例如: Ext.Button 等等),當然我們也可以自行定義自己需要的 UI。先來整理一下 Sencha Touch 自動加入Class 有哪些機制:
- 自動加入 xtype Class
- 自動加入 UI Class
- 自動加入特性 Class, 例如:x-sized, x-item-hidden 等
- 自動加入狀態 Class, 例如:x-stretched 等
假設我們使用了 button 這個 xtype 元件,並且指定了 ui 為 custom,那麼這個元件最少就會擁有 x-button 與 x-button-custom 這兩個 Class,配合 CSS 的設計我們就能夠搭配出適合的版面與顯示畫面了。
實作範例介紹
我們先在在 app.json 中加入自訂的 CSS 檔案 (custom.css),如下:
...
"css": [
{
"path": "resources/css/app.css",
"update": "delta"
},
{
"path": "resources/css/custom.css",
"update": "delta"
}
],
...
建立 custom.css 檔案,來覆蓋預設樣式。內容如下:
/* 覆寫預設按鈕的邊框為黑色 */
.x-button {
border-color: #000;
}
/* 指定id=my-button-id邊框為紅色 */
#my-button-id {
border-color: #f00;
}
/* 指定class=my-button邊框為綠色 */
.my-button {
border-color: #0f0;
}
/* 指定ui=my-ui邊框為藍色 */
.x-button-my-ui {
border-color: #00f;
}
寫一個測試的 Panel 來套用我們自定的 CSS,程式碼如下:
Ext.define('Demo.view.Main', {
extend: 'Ext.Panel',
config: {
padding: 20,
items: [
{
xtype: 'button',
text: 'Default'
},
{
xtype: 'spacer',
height: 20
},
{
xtype: 'button',
text: 'id: \'my-button-id\'',
id: 'my-button-id'
},
{
xtype: 'spacer',
height: 20
},
{
xtype: 'button',
text: 'cls: \'my-button\'',
cls: 'my-button'
},
{
xtype: 'spacer',
height: 20
},
{
xtype: 'button',
text: 'ui: \'action\'',
ui: 'action'
},
{
xtype: 'spacer',
height: 20
},
{
xtype: 'button',
text: 'ui: \'my-ui\'',
ui: 'my-ui'
}
]
}
});
執行結果:


