在這篇微信小程序開發教程中,我們將介紹如何使用微信小程序開發計算器功能。
本文主要分為兩個部分,小程序主體部分及計算器業務頁面部分
一、小程序主體部分
一個小程序主體部分由三個文件組成,必須放在項目的根目錄,如下:
1. 小程序邏輯
App({ onLaunch: function() { // Do something initial when launch. }, onShow: function() { // Do something when show. }, onHide: function() { // Do something when hide. }, globalData: 'I am global data' })
2. 小程序公共設置
{
"pages": [
"page/index/index"
],
"window": {
"navigationBarBackgroundColor": "#000",
"backgroundColor": "#000",
"navigationBarBackgroundColor": "#000"
},
"networkTimeout": {
"request": 10000,
"connectSocket": 10000,
"uploadFile": 10000,
"downloadFile": 10000
},
"debug": true
}
二、計算器頁面部分
計算器頁面主要由以下文件組成。
1. 計算器頁面結構
頁面結構分為2個主要部分:顯示區和鍵盤區
其中鍵盤區又分功能鍵、數字鍵,及運算鍵,頁面結構如下
<template name="calculator-key"> <button hover-start-time="{{5}}" hover-stay-time="{{20}}" hover-class="calculator-key-hover" data-key="{{className}}" class="calculator-key {{className}}">{{display}}</button> </template> <view class="calculator"> <view class="calculator-display"> <view class="calculator-display-text">{{displayValue}}</view> </view> <view class="calculator-keypad"> <view class="input-keys"> <view class="function-keys" catchtap="onTapFunction"> <template is="calculator-key" data="{{className: 'key-clear', display: clearDisplay ? 'C' : 'AC'}}"/> <template is="calculator-key" data="{{className: 'key-sign', display: '±'}}"/> <template is="calculator-key" data="{{className: 'key-percent', display: '%'}}"/> </view> /*sdf*/ <view class="digit-keys" catchtap="onTapDigit"> <template is="calculator-key" data="{{className: 'key-0', display: '0'}}"/> <template is="calculator-key" data="{{className: 'key-dot', display: '●'}}"/> <template is="calculator-key" data="{{className: 'key-1', display: '1'}}"/> <template is="calculator-key" data="{{className: 'key-2', display: '2'}}"/> <template is="calculator-key" data="{{className: 'key-3', display: '3'}}"/> <template is="calculator-key" data="{{className: 'key-4', display: '4'}}"/> <template is="calculator-key" data="{{className: 'key-5', display: '5'}}"/> <template is="calculator-key" data="{{className: 'key-6', display: '6'}}"/> <template is="calculator-key" data="{{className: 'key-7', display: '7'}}"/> <template is="calculator-key" data="{{className: 'key-8', display: '8'}}"/> <template is="calculator-key" data="{{className: 'key-9', display: '9'}}"/> </view> </view> <view class="operator-keys" catchtap="onTapOperator"> <template is="calculator-key" data="{{className: 'key-divide', display: '÷'}}"/> <template is="calculator-key" data="{{className: 'key-multiply', display: '×'}}"/> <template is="calculator-key" data="{{className: 'key-subtract', display: '−'}}"/> <template is="calculator-key" data="{{className: 'key-add', display: '+'}}"/> <template is="calculator-key" data="{{className: 'key-equals', display: '='}}"/> </view> </view> </view>
2. 計算器樣式表
樣式代碼如下所示
@import "reset.wxss"; page { font: 100 14px 'Roboto'; } .calculator { width: 100%; height: 100vh; background: black; position: relative; box-shadow: 0px 0px 20px 0px #aaa; display: flex; flex-direction: column; box-sizing: border-box; } .calculator-display { background: #1c191c; flex: 1; } /*TODO:解決文本垂直居中問題*/ .calculator-display-text { padding: 0 30px; font-size: 6em; color: white; text-align: right; } .calculator-keypad { display: flex; } .calculator .function-keys { display: flex; } .calculator .digit-keys { background: #e0e0e7; display: flex; flex-direction: row; flex-wrap: wrap-reverse; } .calculator-key-hover { box-shadow: inset 0px 0px 25vw 0px rgba(0,0,0,0.25); } .calculator-key { display: block; width: 25vw; height: 25vw; line-height: 25vw; border-top: 1px solid #777; border-right: 1px solid #666; text-align: center; box-sizing: border-box; } .calculator .function-keys .calculator-key { font-size: 2em; } .calculator .digit-keys .calculator-key { font-size: 2.25em; } .calculator .digit-keys .key-0 { width: 50vw; text-align: left; padding-left: 9vw; } .calculator .digit-keys .key-dot { padding-top: 1em; font-size: 0.75em; } .calculator .operator-keys .calculator-key { color: white; border-right: 0; font-size: 3em; } .calculator .function-keys { background: linear-gradient(to bottom, rgba(202,202,204,1) 0%, rgba(196,194,204,1) 100%); } .calculator .operator-keys { background: linear-gradient(to bottom, rgba(252,156,23,1) 0%, rgba(247,126,27,1) 100%); } .input-keys { width: 75%; } .operator-keys { width: 25%; }
3、 計算器頁面邏輯處理
Page({ data: { value: null, // 上次計算后的結果,null表示沒有上次計算的結果 displayValue: '0', // 顯示數值 operator: null, // 上次計算符號,null表示沒有未完成的計算 waitingForOperand: false // 前一按鍵是否為計算符號 }, onLoad: function(options) { this.calculatorOperations = { 'key-divide': (prevValue, nextValue) => prevValue / nextValue, 'key-multiply': (prevValue, nextValue) => prevValue * nextValue, 'key-add': (prevValue, nextValue) => prevValue + nextValue, 'key-subtract': (prevValue, nextValue) => prevValue - nextValue, 'key-equals': (prevValue, nextValue) => nextValue } }, /* AC操作,一下回到解放前 */ clearAll() { this.setData({ value: null, displayValue: '0', operator: null, waitingForOperand: false }) }, /* 僅清空當前顯示的輸入值 */ clearDisplay() { this.setData({ displayValue: '0' }) }, onTapFunction: function(event) { const key = event.target.dataset.key; switch(key) { case 'key-clear': if (this.data.displayValue !== '0') { this.clearDisplay(); } else { this.clearAll(); } break; case 'key-sign': var newValue = parseFloat(this.data.displayValue) * -1 this.setData({ displayValue: String(newValue) }) break; case 'key-percent': const fixedDigits = this.data.displayValue.replace(/^-?\d*\.?/, '') var newValue = parseFloat(this.data.displayValue) / 100 this.setData({ displayValue: String(newValue.toFixed(fixedDigits.length + 2)) }); break; default: break; } }, onTapOperator: function(event) { const nextOperator = event.target.dataset.key; const inputValue = parseFloat(this.data.displayValue); if (this.data.value == null) { this.setData({ value: inputValue }); } else if (this.data.operator) { const currentValue = this.data.value || 0; const newValue = this.calculatorOperations[this.data.operator](currentValue, inputValue); this.setData({ value: newValue, displayValue: String(newValue) }); } this.setData({ waitingForOperand: true, operator: nextOperator }); }, onTapDigit: function(event) { const key = event.target.dataset.key; // 根據data-key標記按鍵 if(key == 'key-dot') { // 按下點號 if (!(/\./).test(this.data.displayValue)) { this.setData({ displayValue: this.data.displayValue + '.', waitingForOperand: false }) } } else { // 按下數字鍵 const digit = key[key.length-1]; if (this.data.waitingForOperand) { this.setData({ displayValue: String(digit), waitingForOperand: false }) } else { this.setData({ displayValue: this.data.displayValue === '0' ? String(digit) : this.data.displayValue + digit }) } } } })
三、程序效果圖
四、源代碼下載
掃描下方二維碼並關注公眾賬號,回復 “1236” 獲取
源代碼使用方法,請參考 微信小程序開發入門教程