Dojo 樣式簡介

簡介

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

爲單個部件設置樣式

  • 爲每一個部件單獨定義一個 CSS 模塊
  • 在部件的 TypeScript 代碼中使用相應的類型化的樣式類
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>;
});

讓部件支持主題

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>;
});

建立主題

  • 使用自定義的主題樣式屬性重寫部件默認的 CSS 類
  • 經過合適的部件主題 key 將一個或多個重寫後的樣式連接到主題結構中
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
};

提取公共的主題屬性

  • 導入一個集中定義的常規 CSS 文件 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) 也是如此。詳情參考[基於類部件的主題]()。框架

更改應用程序主題

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>
    );
});