每個元件都有你可以改變的個性:驅動它運動的彈簧、按鈕在你指尖下的反應、對話框和選單的進場方式、邊角的形狀和大小,以及它們佔用的空間。每一項都可以用一個屬性套用到某個元素內的所有內容,也可以用一個輸入屬性只套用到單一元件。
一個屬性,套用到整個子樹
把 data-nui-* 屬性加在 <body> 上會套用到整個應用程式,加在任何元素上則只套用到其中一部分。距離最近的屬性優先生效,因此可以巢狀使用。它們只設定 CSS 自訂屬性,所以不論使用哪種框架,甚至不用框架,效果都完全相同。
<body data-nui-motion="bouncy" data-nui-corners="squircle">
<!-- Everything here bounces and has squircle corners… -->
<main data-nui-press="squish" data-nui-density="compact">
<!-- …buttons in here squish, and controls are compact… -->
</main>
<aside data-nui-motion="none" data-nui-radius="none">
<!-- …and nothing in here moves or has rounded corners. -->
</aside>
</body>單一元件
在 Angular 中,nuiButton、nuiDialog 和 nuiMenu 以輸入屬性的形式接受相同的值。未設定的輸入屬性會沿用外層元素上的屬性。
<button nuiButton press="rubber" motion="elastic">Boing</button>
<dialog nuiDialog [(open)]="editing" enter="flip" corners="squircle">…</dialog>
<button nuiButton [nuiMenuTrigger]="actions">Actions</button>
<div nuiMenu #actions="ngMenu" enter="unfold" motion="mechanical">…</div>編譯成 CSS 的彈簧
動態效果以彈簧物理為基礎:用勁度、阻尼和質量取代持續時間和曲線。token 編譯器會求解每個彈簧,並將它寫入 CSS,表示為穩定所需的時間和一個 linear() 緩動函式,因此動畫在合成器執行緒上執行,不需要 JavaScript。內建六種彈簧 token,從 --nui-spring-snappy 到 --nui-spring-mechanical,--nui-motion 則保存目前使用的那一種。
想用其他彈簧,只要設定一個輸入屬性。Angular 會在執行階段用同一個求解器編譯它,而 springTransition() 能為你自己的元素產生對應的 CSS。
import { springTransition } from '@needless-ui/angular';
// In a template, any spring is an input:
// <button nuiButton [spring]="{ stiffness: 900, damping: 12 }">Save</button>
// Anywhere else, compile it yourself:
const wobbly = springTransition({ stiffness: 120, damping: 4, mass: 1.2 });
// '4152ms linear(0, 0.014 0.41%, …, 1)'
const card = document.querySelector<HTMLElement>('.card')!;
card.style.transition = `transform ${wobbly}`;預設集以外的任意值
預設集只是捷徑。其他任何效果,都可以自己設定 CSS 自訂屬性來實現:--nui-press 和 --nui-enter 可以使用任意 transform,--nui-radius-scale 和 --nui-density 可以使用任意數值。
.checkout {
--nui-motion: var(--nui-spring-jelly);
--nui-press: scale(0.92) rotate(-2deg);
--nui-enter: translateY(100%);
--nui-radius-scale: 1.5;
--nui-density: 1.1;
}無障礙
當系統要求減少動態效果時,彈簧會瞬間完成,按壓和進場效果也不再移動。不論密度如何設定,控制項都不會小於 WCAG 2.2 規定的 24px 目標尺寸;而且沒有任何預設集會更動顏色,因此所有對比度檢查依然成立。不支援 corner-shape 的瀏覽器會把所有邊角都繪製成圓角。