從零開始製作【立體鍵盤】,畫UI免寫CSS,【盲打練習】的交互邏輯只用了10來行表達式!

来源:https://www.cnblogs.com/zcappp/archive/2022/07/14/16479745.html
-Advertisement-
Play Games

手把手教你從空白頁面開始通過拖拉拽可視化的方式製作【立體鍵盤】的靜態頁面,不用手寫一行CSS代碼,全程只用10來行表達式就完成了【盲打練習】的交互邏輯。 整個過程在眾觸應用平臺進行,快速直觀。 ...


手把手教你從空白頁面開始通過拖拉拽可視化的方式製作【立體鍵盤】的靜態頁面,不用手寫一行CSS代碼,全程只用10來行表達式就完成了【盲打練習】的交互邏輯。

整個過程在眾觸應用平臺進行,快速直觀。

 

最終UI效果圖

效果圖是用Win + Shift + S快捷鍵截的屏,所以Meta和Shift鍵處於按下的高亮狀態

 

交互效果圖

自由按鍵 vs 盲打練習

 

立體旋轉效果圖

 

等不及了,馬上親自動手試一試:https://keyboard.zc-app.cn/z

下麵的文章描述的是重點要點,手把手的教學請移步嗶哩嗶哩視頻:https://www.bilibili.com/video/BV16T411377x

 

準備按鍵佈局數據

通過觀察鍵盤我們很容易發現它是由4排按鍵組成的,每排按鍵又有不同數目的按鍵。很自然我們會把它們抽象出一個二維數組。
為了實現交互,需要捕捉被用戶按下按鍵的編碼(code),所以我們就把每個按鍵編碼提取出來作為數組項。
具體的編碼可以通過log($event.code)列印出來。

把所有按鍵編碼的二維數組賦給變數$v.keys

[
    ["Backquote", "Digit1", "Digit2", "Digit3", "Digit4", "Digit5", "Digit6", "Digit7", "Digit8", "Digit9", "Digit0", "Minus", "Equal", "Backspace", "Home"],
    ["Tab", "KeyQ", "KeyW", "KeyE", "KeyR", "KeyT", "KeyY", "KeyU", "KeyI", "KeyO", "KeyP", "BracketLeft", "BracketRight", "Backslash", "End"],
    ["CapsLock", "KeyA", "KeyS", "KeyD", "KeyF", "KeyG", "KeyH", "KeyJ", "KeyK", "KeyL", "Semicolon", "Quote", "Enter", "PageUp"],
    ["ShiftLeft", "KeyZ", "KeyX", "KeyC", "KeyV", "KeyB", "KeyN", "KeyM", "Comma", "Period", "Slash", "ShiftRight", "ArrowUp", "PageDown"],
    ["ControlLeft", "Fn", "MetaLeft", "AltLeft", "Space", "AltRight", "ControlRight", "ArrowLeft", "ArrowDown", "ArrowRight"]
]

 

同時在UI上也要顯示列印按鈕上的標識,我們把標識和編碼對於匹配規律性不強的按鈕挑出來(字母、數字很有規律),用對象把標識和按鈕編碼匹配起來,賦給變數$v.label

{
    "Backquote": "`",
    "Minus": "-",
    "Equal": "=",
    "BracketLeft": "[",
    "BracketRight": "]",
    "Backslash": "\\\\",
    "Semicolon": ";",
    "Quote": "\'",
    "PageUp": "PgUp",
    "ShiftLeft": "Shift",
    "Comma": ",",
    "Period": ".",
    "Slash": "/",
    "ShiftRight": "Shift",
    "ArrowUp": "▲",
    "PageDown": "PgDn",
    "ControlLeft": "Ctrl",
    "MetaLeft": "Meta",
    "AltLeft": "Alt",
    "AltRight": "Alt",
    "ControlRight": "Ctrl",
    "ArrowLeft": "◄",
    "ArrowDown": "▼",
    "ArrowRight": "►"
}

 

 

嵌套數據組件展示二維數組

先添加一個數據組件(類名keyboard),綁定$v.keys作為數據源;再在它裡面添加一個數據組件(類名row),用外層數據組件提供的數據項$x作為數據源,它其實是某排按鍵數組。
再添加一個div(動態類名("key " + $x))作為每個按鍵的容器,並通過可視化設計器添加陰影和圓角等共通樣式,給部分特殊按鍵添加選擇器以更改其顏色和寬度。
添加一個span,給它添加動態文本內容($v.label[$x]),這樣在$v.label里有匹配的按鍵就顯示出來了。 再添加|| $x.replace("Key", "").replace("Digit", "")那數字和字母也顯示出來了。

hover高亮

滑鼠移到組件樹的各層組件上,對應的元素就會高亮顯示,提示它(們)渲染的對應關係。

hover到keyboard時整個鍵盤的邊框高亮;
hover到row時每排按鍵高亮;
hover到div時每個按鍵的邊框高亮;
hover到span時每個按鍵上的字高亮。

 

按鍵按下事件邏輯

我們需要全局捕捉按鍵事件,所以在根節點上的onKeyDown事件上添加如下邏輯:

$v.key = $("." + $event.code)
stopIf(!$v.key)
$v.key.addClass("active")

先根據事件中的按鍵編碼($event.code)選擇有沒有以此編碼為類名的元素,如果沒找到說明用戶按下的鍵不在此虛擬鍵盤上(真實鍵盤第一排的功能鍵),則停止往下運行(stopIf),如果找到了則給此元素添加acitve類。此時我們要添加選擇器.key.active,併在可視化設計器添加按鍵處於按下狀態時的樣式(按鍵的按下位移、背光、陰影)

 

按鍵彈起事件邏輯

按鍵彈起的時候就應該去掉上面添加的active類以恢復常態,所以在根節點上的onKeyUp事件上添加如下邏輯:

$("." + $event.code).removeClass("active")

 

 

盲打邏輯

盲打邏輯會在兩種情況下執行:一是用戶在【盲打練習】勾勾上打勾時,二是用戶按中待按按鍵時。

盲打的邏輯是從所有按鍵中隨機選擇一個按鍵,給它添加selected類,等待用戶按鍵,如果用戶按下的按鍵剛好是此鍵則繼續產生一個隨機按鍵,如此往複。

 

onReady中把鍵盤二維數組合併成一維數組$v.all,再去除FnMetaLeft兩個特殊按鍵:

$v.all = $v.keys.reduce('$acc.concat($x)', [])
$v.all.splice($v.all.indexOf("Fn"), 1)
$v.all.splice($v.all.indexOf("MetaLeft"), 1)

 

 

添加$exp.盲打局部表達式:

stopIf(!$f.x.盲打)
$v.selected = $v.all[$w.Math.floor($w.Math.random() * $v.all.length)]
$("." + $v.selected).addClass("selected")

 

如果【盲打練習】勾勾未勾上則停止繼續運行;從所有按鍵$v.all中,產生隨機數,並添加selected類。

 

把表達式轉換成函數(func)並賦給變數$v.盲打

$v.盲打 = func($exp.盲打)

 

 

用戶打勾時開始執行此函數:

$v.盲打()

 

 

在上面的onKeyDown事件上繼續添加如下邏輯:

stopIf(!$v.key.classList.contains("selected"))
$v.key.removeClass("selected")
$v.盲打()

 

如果用戶按下的按鍵類名中包含selected類名,說明按對了,移除此類名,繼續執行盲打函數,否則說明打錯了,不予理會(stopIf)。

 

更多教學視頻請移步嗶哩嗶哩空間:https://space.bilibili.com/475645807,裡面不僅有各種前端可視化案例演示和講解,還有多個完整功能的網站應用案例的開發過程演示和講解。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 事務 原子性 事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。 一致性: 執行的結果必須是使資料庫從一個一致性狀態變到另一個一致性狀態。因此當資料庫只包含成功事務提交的結果時,就說資料庫處於一致性狀態。 隔離性 一個事務的執行不能被其他事務干擾。即一 ...
  • 資料庫定義語言(DDL) 資料庫 創建資料庫 CREATE DATABASE IF NOT EXISTS 資料庫名 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 刪除資料庫 drop database 資料庫名; 切換資料庫 use 資料庫名; 查看所有 ...
  • 聚集函數 count([distinct]列名) 統計某列的值總和 sum([distinct]列名) 統計一列的和(註意必須是數字類型的) avg([distinct]列名) 計算一列的平均值(註意必須是數字類型) max([distinct]列名) 尋找一列的最大值 min([distinct] ...
  • 視圖 視圖(view)是一種虛擬存在的表,是一個邏輯表,本身並不包含數據。作為一個select語句保存在數據字典中的。通過視圖,可以展現基表的部分數據;視圖數據來自定義視圖的查詢中使用的表,使用視圖動態生成。 意義 簡單:方便操作,特別是查詢操作,減少複雜的SQL語句,增強可讀性; 安全:資料庫授權 ...
  • 資料庫規範化 第一範式: 欄位不可再分 1NF(第一範式)是指資料庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重覆的屬性。 第二範式: 非主鍵欄位完全依賴主鍵欄位 第二範式(Second Normal Form,2nd NF)是指每個表必須有主 ...
  • 如何在 SQL Server 中使用 Try Catch 處理錯誤? 從 SQL Server 2005 開始,我們在TRY 和 CATCH塊的幫助下提供了結構錯誤處理機制。使用TRY-CATCH的語法如下所示。 BEGIN TRY --這裡寫可能導致錯誤的語句 END TRY BEGIN CATC ...
  • 一年一度的高考結束了,很多學生即將離開父母,一個人踏入大學生活,但由於人生閱歷較少,容易被不法分子盯上。 每年開學季也是大一新生遭受詐騙的高峰期,以下是一些常見的案例。有的騙子會讓新生下載註冊一些惡意金融應用這些應用可能包含有病毒、木馬等程式,也可能是仿冒某些知名軟體的應用,犯罪分子通過惡意應用便可 ...
  • 本文簡介 本文主要講解使用 NodeJS 操作 Redis ,順便會先帶一帶 Redis 基礎用法。 在寫本文時,使用 NPM 安裝的 Redis 依賴包已經到了 4.1.0 版本了。我以前用過 2.8 ,這兩個版本在用法上也是有差別的。可能一些老項目還在用老版本的依賴包。所以我會把2個版本的用法都 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...