Dojo 是基於 HTML 的技術,使用 CSS 爲框架中的元素和用它開發的應用程序設置樣式。css
Dojo 鼓勵將結構樣式封裝在各部件中,以便最大限度複用;同時將外觀主題設置到應用程序全部部件上。用戶爲他們的應用程序設置樣式和主題時,這種模式提供了固定的套路,即便混合使用 Dojo 的 @dojo/widgets
庫中的部件、由第三方提供的部件或者爲特定應用程序開發的內部使用的部件時也是如此。git
功能 | 描述 |
---|---|
爲單個部件設置樣式 | CSS Modules 用於定義,在單個部件的做用域內有效的樣式,避免潛在的交叉污染和樣式衝突。經過類型化的 CSS 模塊導入和 IDE 自動完成功能,部件能夠精確的引用 CSS 類名。 |
強大的主題支持 | 能夠輕鬆開發出支持主題的部件,這樣的部件既能使用簡化的、中心化的應用程序主題,也能調整或覆蓋單個實例的目標樣式(若是須要的話)。CLI 工具支持分發自定義主題。 |
響應式的主題變動 | 與 Dojo 應用程序中的其餘響應式狀態變動相似,當一個部件或者整個應用程序的主題發生變化時,只有受影響的部件纔會從新渲染。 |
提取 CSS 屬性 | 每一個 CSS 模塊可經過 CSS 自定義屬性和 var() 引用集中定義的 :root 樣式變量。 |
簡化定義第三方部件的主題 | 應用程序能夠輕鬆擴展主題以覆蓋第三方部件,如 Dojo 內置部件庫中的部件,Dojo 也提供了開箱即用的主題,應用程序可直接使用。CLI 工具極大簡化了主題的建立和組合。 |
注意: 如下示例是按順序在前一個示例的基礎上構建的。每一個示例都儘可能簡短,只突出顯示跟上一個示例相比發生變化的部分。
這些示例假定應用程序名爲:github
package.json
{ "name": "my-app" }
應用程序名與部件主題的 key 有關。json
src/styles/MyWidget.m.css
.root { font-family: sans-serif; }
src/widgets/MyWidget.tsx
import { create, tsx } from '@dojo/framework/core/vdom'; import * as css from '../styles/MyWidget.m.css'; const factory = create(); export default factory(function MyWidget() { return <div classes={[css.root]}>My Widget</div>; });
theme
中間件theme.classes
返回主題化的 css 類名,這樣部件的默認樣式就會被主題覆蓋 src/widgets/MyWidget.tsx
import { create, tsx } from '@dojo/framework/core/vdom'; import theme from '@dojo/framework/core/middleware/theme'; import * as css from '../styles/MyWidget.m.css'; const factory = create({ theme }); export default factory(function MyWidget({ middleware: { theme } }) { const { root } = theme.classes(css); return <div classes={[root]}>My Widget</div>; });
src/themes/MyTheme/MyWidget.m.css
.root { color: hotpink; background-color: slategray; }
src/themes/MyTheme/theme.ts
import * as myWidgetCss from './MyWidget.m.css'; export default { 'my-app/MyWidget': myWidgetCss };
variables.css
,其中定義了 CSS 自定義屬性 var()
引用自定義屬性src/themes/variables.css
:root { --foreground: hotpink; --background: slategray; }
src/themes/MyTheme/MyWidget.m.css
@import '../variables.css'; .root { color: var(--foreground); background-color: var(--background); }
theme
中間件可用於設置應用程序主題。要設置「默認的」或初始化主題,則使用 theme.set
函數,同時用 theme.get
函數肯定是否須要設置主題。應該在應用程序的頂級部件中設置默認主題。app
src/App.tsx
import { create, tsx } from '@dojo/framework/core/vdom'; import theme from '@dojo/framework/core/middleware/theme'; import myTheme from '../themes/MyTheme/theme'; const factory = create({ theme }); export default factory(function App({ middleware: { theme }}) { // if the theme isn't set, set the default theme if (!theme.get()) { theme.set(myTheme); } return ( // the application's widgets ); });
注意: 當同時使用基於函數的部件和基於類的部件時,應該使用應用程序註冊器來註冊主題。當使用基於類的部件時(如 @dojo/widgets
) 也是如此。詳情參考[基於類部件的主題]()。框架
theme
中間件 在可用的主題間切換src/widgets/ThemeSwitcher.tsx
import { create, tsx } from '@dojo/framework/core/vdom'; import theme from '@dojo/framework/core/middleware/theme'; import myTheme from '../themes/MyTheme/theme'; import alternativeTheme from '../themes/MyAlternativeTheme/theme'; const factory = create({ theme }); export default factory(function ThemeSwitcher({ middleware: { theme } }) { return ( <div> <button onclick={() => { theme.set(myTheme); }} > Use Default Theme </button> <button onclick={() => { theme.set(alternativeTheme); }} > Use Alternative Theme </button> </div> ); });