在過去,早期的 Web 更多用做内容展示的頁面,最早從後端架構中直出,再配上各種 CSS 以及 JS 的互動内容,以完成最終對頁面内容的展示,那時候的 Web 更多屬于 【内容開發】,做内容的直出與展示。而如今現代 Web 開發體系已經有了翻天覆地的變化,早已超出了【内容開發】的範疇,在各個領域都有 JavaScript 的身影。同樣,Web 也已經脫離了用戶端以及浏覽器的限制,各式各樣基于 Web 标準或者私有标準的 Web runtime 層出不窮。【Web 應用開發】差別于傳統的【内容開發】,它對開發者提出了更高的要求,也對 Web 的能力提出了更高的要求,無論是基于标準化方面的考量,還是基于對易用性的考慮,我們都期望 Web 開發者可以獲得通過更進階的封裝的标準的高性能的能力。
而手勢能力就是其中的一塊。
目前在 Web 标準中,手勢能力是屬于缺失的一塊能力,更多的開發者通過 hammer.js 來獲得一個通過 JavaScript 模拟出來的手勢事件來開發一個手勢強互動的應用,或者是直接基于更底層的 Touch event來做進一步的封裝。
首先,我們需要知道,由于在端側有各種各樣的螢幕操作的裝置,常見的比如說類 apple pencil 的電子筆裝置(pen),手指直接觸摸操作(touch),還有滑鼠(mouse)等。是以在 W3C 标準中, 将所有的接觸螢幕的實體裝置抽象成了一個 pointer,無論上層是那種實體裝置,對于螢幕隻感覺與抽象這一個觸摸到的點,基于 type 區分具體的上層的實體裝置。
聊聊各端手勢體系以及對 Web 标準手勢的思考連續手勢與離散手勢各端手勢體系FlutterAndroid标準
連續手勢:從 pointer down 到 pointer moves 到 pointer up,中間過程可以通過 state 狀态來描述的手勢,可以清楚地通過不同的回調或者不同的狀态讓開發者感覺目前手勢所處的狀态的手勢。常見連續手勢:pan。
離散手勢:完整手勢觸發完畢後才會通過回調來通知開發者,無中間狀态的轉換。常見離散手勢:click。
連續手勢會頻繁通過回調或者狀态來通知開發者目前手勢所處的狀态,我們來看一種情況:
element.addEventLisenter('pan', (gestureEvent) => {
if (gestureEvent.state === 'up') {
// do something...
}
})
假設我們需要在 Web 标準中實作 pan 這個手勢,如果它是一個連續手勢,而我們的場景隻需要用 up 這種狀态,就需要不斷地将目前的狀态通過 Bridge 以及 JS engine 傳遞到 JavaScript 中,這頻繁的傳遞開銷是對裝置性能的一種浪費。當然,也有架構方案通過更加細分的粒度去解決這個事情,譬如說拆分成
panstart
、
panupdate
panend
等,當開發者不給這些方法注冊回調時,可以在架構内部判斷并做相應優化。然而細分的 API 抽象不夠底層,對于開發者來說也并不那麼友好。
那在 Web 技術上,我們應該使用怎麼樣一套手勢規範,來兼顧易用性、性能以及标準化呢?就目前來看,基于 Web 技術體系發展來的 Web runtime 的已經非常多了,諸如 Web、React Native、小程式等體系已經在端側帶來了巨大的運作時碎片化。未來不止于移動端上,還有各種 IOT 裝置出現,可能會有越來越多的 Web runtime 會出現。未來可能會有更多領域會有不一樣的終端裝置,而折疊屏、柔性屏的到來也可能會讓端側的裝置(手機、IOT、車載等)形成更多更複雜的的跨端場景,随之而來的也是更多的互動手勢來與這些裝置進行“溝通交流”。