很多人對 Rive 的第一印象是:「這是一個拿來取代 Lottie 的動效工具吧?」
但如果有持續關注這兩年的更新,就會發現 Rive 想做的事情早就不只是動畫。
從 State Machine、Data Binding、Responsive Layout,到近年加入的 Text Input 與 Accessibility,可以看出 Rive 正逐步補齊打造 UI 所需要的能力,希望成為一個能夠建構互動式 UI 的 Runtime。
Rive 官方也曾提到,他們希望重新找回當年 Flash 最迷人的地方:
"What you made in the tool was the actual product, not a mockup or prototype."
也就是說,在 Rive 裡完成的,不再只是設計稿或 Prototype,而是真正會交付給使用者使用的產品。
這樣的願景確實很吸引人,也讓不少團隊開始嘗試直接用 Rive 製作按鈕、卡片,甚至整個介面。但真正把 UI 放進 Rive 後才發現,困難的往往不是動畫,而是 UI 本身。
談到 UI,很多人第一個想到的是顏色、排版、動畫或圖示,但這些只是 UI 的其中一部分。
一個完整的 UI,還包含了互動元件、使用者操作後的回饋,以及整個介面的資訊架構。
如果今天使用的是 HTML,瀏覽器早就替我們準備好了這些能力:有 DOM 和 CSS 負責畫面、有 button、input、select 等原生元件處理互動,也有 hover、focus、active 等狀態,以及各種語意化 HTML 標籤描述頁面結構。
正因為這些能力一直都存在,我們很容易把它們視為理所當然。直到真正開始用 Canvas 開發 UI,才發現原來瀏覽器默默替我們做了這麼多事。
其中最容易被忽略的,就是互動元件。
很多人會以為,一個 input 不就是一個長方形,加上游標和文字就完成了。但真正的 input 處理的是一整套互動行為,而不只是外觀。真正重要的,不是它看起來像不像,而是它是否具備一個輸入框該有的能力。
而這些能力,在 HTML 幾乎都是免費的;一旦離開瀏覽器、走進 Canvas 的世界,就得重新思考該如何實現。
接下來,就來分享我們實際使用 Rive 開發 UI 時,遇到的幾個問題,以及最後是如何一步步解決它們的。
一開始,我們希望 Rive 完全掌控輸入框的畫面,例如 Focus 動畫、游標效果,同時保留 HTML Input 的輸入體驗,像是手機鍵盤、輸入法與複製貼上。
看起來是一個很合理的需求,但真正開始實作後才發現,這其實是在同時追求兩套不同的世界。
Rive 擅長的是畫面與動畫,而 HTML Input 則承擔了瀏覽器提供的大量原生能力。當我們希望 Rive 完全接手畫面時,也代表那些原本由瀏覽器負責的事情,都需要重新思考如何在 Canvas 中實現。
真正讓我們卡住的,其實不是「輸入文字」,而是手機端的焦點管理(Focus)。
在 HTML 中,點擊 Input後瀏覽器會自動處理焦點管理、鍵盤彈出與輸入法切換等一連串流程;但 Rive 本身只是 Canvas,沒有這些原生能力。如果改由 Rive 接收點擊,再透過 Runtime 呼叫 input.focus(),在部分行動瀏覽器中容易因為已經離開使用者操作(User Gesture),導致無法正常喚起鍵盤。
也就是說,**真正的挑戰不是畫出 Input,而是在保留 Rive 視覺效果的同時,維持瀏覽器原生輸入體驗。**因此,我們最後選擇讓 Rive 負責畫面,HTML Input 負責輸入,讓兩者發揮各自擅長的能力。
Rive 近年加入 Data Binding 和 List 功能,確實讓它越來越接近 UI Runtime。這也讓我們開始產生一個想法:
「既然 Rive 這麼方便,那是不是整個介面都可以交給它處理?」
但真正開始實作後才發現,能做到,不代表適合這麼做。
以最常見的商品列表為例,在 Vue 中通常只需要:API 取得資料 ➔ v-for 渲染 ➔ 完成
但如果要在 Rive 中實現同樣的列表,就需要將資料轉換成 ViewModel,再透過 Runtime 建立 List Item 並處理同步。同樣只是呈現資料,在 Rive 中卻需要額外處理資料同步與 Runtime 邏輯,增加了開發成本。
我們過去也曾嘗試將卡片列表、Tab 切換、輪播滾動與 RWD 排版交給 Rive 處理。剛完成時,細緻的動畫效果確實令人驚艷,也讓人覺得這就是未來 UI 的方向。
然而當 UI 規模逐漸增加後,我們才發現,搬進 Rive 的不只是畫面,也包含許多原本由瀏覽器與前端框架負責的能力。
因此,我們最後得到一個結論:
Rive 適合負責「讓 UI 更有生命力的互動與動畫」,但不一定適合承載大量資訊型 UI。
像遊戲 HUD、角色技能面板、互動卡片等需要大量狀態切換的場景,Rive 能發揮很大的價值;但歷史紀錄、純文字列表、大量資料展示等場景,交給 Vue、React 與 HTML/CSS 通常會更有效率。
前面聊了 Input 與 Data Binding,但在實際專案中,真正困難的往往不是「怎麼做出來」,而是「後續如何維護」。
當越來越多 UI 邏輯放進 Rive 後,原本由 Vue 或 React 管理的狀態與互動,也會逐漸轉移到 Rive 的 State Machine、Data Binding 與 Layout 中。隨著專案規模增加,這種雙軌開發模式開始帶來額外成本。
例如,一個按鈕狀態異常時,可能需要同時檢查 Vue 的資料流、Rive Runtime 的串接邏輯,以及 Rive Editor 端的狀態設定,才能確認問題發生在哪一個環節。
另外,.riv 是 Binary File,前端無法像閱讀程式碼一樣直接理解裡面的邏輯。當問題發生時,需要在程式碼、Rive Runtime 與 Editor 設定之間來回確認,增加除錯與問題定位的成本。當互動邏輯越來越複雜,設計與開發也需要共同理解更多 Runtime 與資料流。
經歷幾次專案嘗試後,我們得到一個體會:
素材層、元件層交給 Rive,通常能帶來很好的效果;但當它開始承擔列表渲染、Layout、滾動、事件管理等框架層工作時,維護成本就會快速增加。
這不是 Rive 的缺點,而是工具定位不同。Rive 是一個強大的動畫與互動 Runtime,但它不需要取代 Vue 或 React。
所以,「Rive 可以拿來做 UI 嗎?」答案是:
可以,但要讓 Rive 做它擅長的事,讓網頁做它擅長的事。
在對的場景用對的工具,才能保有 Rive 帶來的驚艷視覺體驗,也讓專案在長期維護時保持健康。