從零開始製作【立體鍵盤】,畫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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...