純 HTML+CSS+JavaScript 編寫的計算器應用

發表於2016-09-26

一道筆試題

之前偶然看到一個公司的筆試題,題目如下:

用HTML5、CSS3、JavaScript,做一個網頁,實現如下圖形式計算器

101005972-57e398d659d05_articlex

具體要求:

  1. 有且只有一個檔案:index.html。不允許再有其他檔案,不允許再有單獨的CSS、JS、PNG、JPG檔案。
  2. 執行環境為 Google Chrome。
  3. 必須支援標準的四則運算。例如:1+2*3=7。
  4. 請在收到郵件的48小時內獨立完成本測試,並回複本郵件。

一道筆試題引發的一個練手專案

花了一點時間寫好的第一版,符合了筆試題的要求。後來左看右看覺得還可以改進做的更好,於是給它不斷的改進,加新功能等,這樣下來沒完沒了,利用業餘時間一點一點的寫,從剛開始的網頁版,到後來做響應式的移動版,再到現在的移動App,短短續續大概寫了3個月吧。

專案地址

最終版的計算器,專案地址和預覽圖片在 GitHub:https://github.com/dunizb/sCalc

功能說明

最終版的功能如下:

  1. 介面佈局採用CSS3 的 Flex box佈局
  2. 內建兩套主題可切換
  3. 計算曆史記錄顯示
  4. 左滑右滑可以切換單手模式(App)
  5. 當輸入手機號碼後長按等於號可以撥打手機號碼(App)
  6. 版本更新檢查(App)

介面佈局

由於這個專案只是練手,所以採用了HTML5個CSS3技術,也不打算相容IE等低版本瀏覽器,所以直接使用CSS3提供的Flexbox佈局方式。並且使用rem單位來進行自動計算尺寸。

計算計算曆史記錄顯示功能,使用HTML5提供的本地儲存功能之Local Storage,為了方便使用Local Storage,對它進行了簡單的封裝(見js/common.js檔案)使之key值按一定規律生產,方便管理。

1243273525-57e399093b0a0_articlex

key由appName+id組成,id是自動增長不重複的,可以按id和appName刪除一條記錄,輸入*則全部刪除。

打包APP

移動Web版計算器寫完後,又想把他做成APP在手機上執行,由於本人沒用過混合APP諸如ionic之類的框架,所以參考了一下,選擇了Hbuild來進行開發和APP的打包,非常方便。(HBuild).

單手模式

左滑右滑可以切換單手模式,這就需要移動端的touch事件了,使用如下程式碼判斷是左滑還是又滑:

如果是坐滑,就position:absolut;left:0,bottom:0,再把最外層DIV縮小到80%,這樣就實現了左滑計算器縮小移動到左下角。右滑道理一樣。

電話撥打功能

當輸入手機號碼後長按等於號可以撥打手機號碼。這個功能沒什麼神奇,在移動Web上會對那些看起來像是電話號碼的數字處理為電話連結,比如:

  • 7位數字,形如:1234567
  • 帶括號及加號的數字,形如:(+86)123456789
  • 雙連線線的數字,形如:00-00-00111
  • 11位數字,形如:13800138000

可能還有其他型別的數字也會被識別。我們可以通過如下的meta來開啟電話號碼的自動識別:

開啟電話功能

開啟簡訊功能:

但是,在Android系統上,只能呼叫系統的撥號介面,在iOS上則能調過這一步直接把電話撥打出去。

版本更新檢查

在關於頁面,有一個版本更新檢查按鈕,就能檢查是否有新版本,這個功能的原理是傳送一個JSOPN請求去檢查伺服器上的JSON檔案,比對版本號,如果伺服器上的版本比APP的版本高則會提示有新版本可以下載。\

客戶端JavaScript程式碼:

服務端JSON:

下個版本計劃

當前3.1.0版本還存在一些問題:

  1. 由於JS本身存在計算浮點數精度丟失問題,所以這個問題在專案中同意存在,需要自己去處理這個問題
  2. 由於使用了第三方的天氣介面,用了jquery.Ajax方法,所以違背了使用純原生寫的初衷。

所以下個版本的開發計劃為:

  1. 解決浮點數計算精度問題
  2. 把獲取天氣資訊的jquery.Ajax方法替換為原生JavaScript程式碼,自己封裝JSONP請求函式
  3. 使用物件導向方式重構APP

歡迎大家到github上來看看,如果喜歡可以star、watch一下,或提issue。

相關文章