微信小程序計算器實現(xiàn)案例詳解
前言
嗨嗨嗨,好久沒更新小程序專欄了,本期淺淺用小程序寫一個計算器。
實現(xiàn)效果
實現(xiàn)步驟
新建一個項目,在app.json中配置文件導航欄的標題和顏色。
先在index.wxml中編寫計算器頁面的外層結構,也就是兩個view,第一個view顯示數(shù)字和運算符,第二個view顯示各種按鈕。
然后在index.wxss中添加樣式。在page(整體頁面)中使用flex布局,將result和btns的flex設置為1,實現(xiàn)兩個view平分頁面的效果。
<view class="result"></view> <view class="btns"></view>
page{ display: flex; flex-direction: column; height: 100%; } .result{ flex: 1; background-color: #e0e0e0; } .btns{ flex: 1; }
wxml
接下來我們來編寫頁面內容。我們可以先觀察計算器的布局,計算器的布局是5行4列,所以我們先寫5個view組件表示5行,每個view中分別添加4個view表示4列。每個view表示計算器的不同按鍵。給每個按鍵定義數(shù)據(jù)data-val。
上半部分只有兩個view組件,分別是用戶輸入的數(shù)字和需要的操作,這里需要綁定數(shù)據(jù)num和op
知識點:view組件的hover-class屬性表示該組件按下時的class樣式。
<view class="result"> <view class="result-num">{{num}}</view> <view class="result-op">{{op}}</view> </view> <view class="btns"> <view> <view hover-class="bg" bindtap="resetBtn">C</view> <view hover-class="bg" bindtap="delBtn">DEL</view> <view hover-class="bg" bindtap="opBtn" data-val="%">%</view> <view hover-class="bg" bindtap="opBtn" data-val="/">/</view> </view> <view> <view hover-class="bg" bindtap="numBtn" data-val="7">7</view> <view hover-class="bg" bindtap="numBtn" data-val="8">8</view> <view hover-class="bg" bindtap="numBtn" data-val="9">9</view> <view hover-class="bg" bindtap="opBtn" data-val="*">x</view> </view> <view> <view hover-class="bg" bindtap="numBtn" data-val="4">4</view> <view hover-class="bg" bindtap="numBtn" data-val="5">5</view> <view hover-class="bg" bindtap="numBtn" data-val="6">6</view> <view hover-class="bg" bindtap="opBtn" data-val="-">-</view> </view> <view> <view hover-class="bg" bindtap="numBtn" data-val="1">1</view> <view hover-class="bg" bindtap="numBtn" data-val="2">2</view> <view hover-class="bg" bindtap="numBtn" data-val="3">3</view> <view hover-class="bg" bindtap="opBtn" data-val="+">+</view> </view> <view> <view hover-class="bg" bindtap="numBtn" data-val="0">0</view> <view hover-class="bg" bindtap="dotBtn">.</view> <view hover-class="bg" bindtap="opBtn" data-val="=">=</view> </view> </view>
wxss
接下來編寫樣式啦,利用flex布局實現(xiàn)按鈕根據(jù)容器的大小自動平分寬度和高度,設置flex-basis:“50%”;用于使按鈕“0”占用兩個按鈕的寬度。
page{ display: flex; flex-direction: column; height: 100%; } .result{ flex: 1; background-color: #e0e0e0; position: relative; } .result-num{ position: absolute; font-size: 27pt; bottom: 5vh; right: 3vw; } .result-op{ font-size: 15pt; position: absolute; bottom: 1vh; right: 3vw; } .btns{ flex: 1; display: flex; flex-direction: column; font-size: 17pt; border-top: 1rpx solid #ccc; border-left: 1rpx solid #ccc; } .btns > view{ flex: 1; display: flex; } .btns > view > view{ flex-basis: 25%; border-right: 1rpx solid #ccc; border-bottom: 1rpx solid #ccc; box-sizing: border-box; display: flex; align-items: center; justify-content: center; } .btns > view:last-child > view:first-child{ flex-basis: 50%; } .btns > view:first-child > view:first-child{ color: red; } .btns > view >view:last-child{ color: #fc8e00; } .bg{ background: #ccc; }
頁面效果如下:
js
數(shù)字按鈕事件處理函數(shù)
- 添加數(shù)字按鈕事件實現(xiàn)數(shù)字的輸入,先設置值,即num和op。
- 設置result和isClear,其中result用來保存上次運算結果。isClear表示輸入的數(shù)字是否替代當前的數(shù)字,如果isClear的值為false,則表示下次輸入的數(shù)字放在當前顯示數(shù)字的末尾;如果isClear的值為true,則表示下次輸入的數(shù)字替代當前的數(shù)字。
- 判斷當前輸入的數(shù)字是否為0。如果為0,則設置num的值為0;否則設置num的值為當前輸入的值。
Page({ data: { num: '', op: '', }, // 數(shù)字按鈕處理事件 // 保存上次運算結果 result: null, isClear: false, numBtn:function(e){ var num = e.target.dataset.val; if(this.data.num === '0' || this.isClear){ this.setData({num:num}); this.isClear = false; }else{ this.setData({num:this.data.num+num}); } } })
計算按鈕處理事件
- 獲取當前輸入的數(shù)字和符號;
- 判斷是否重復計算;
- 判斷符號是什么,當符號為+時,返回的結果就是當前數(shù)字加上添加的數(shù)字;當符號為-時,返回的結果就是當前數(shù)字減去添加的數(shù)字…
// 計算按鈕事件 opBtn:function(e){ var op = this.data.op; var num = Number(this.data.num); this.setData({op:e.target.dataset.val}); //判斷是否重復計算 if(this.isClear){ return } this.isClear = true; if(this.result === null){ this.result = num; return } if(op === '+'){ this.result = this.result + num; }else if(op === '-'){ this.result = this.result - num; }else if(op === '*'){ this.result = this.result * num; }else if(op === '/') { this.result = this.result / num; }else if(op === '%'){ this.result = this.result % num; } this.setData({num:this.result + ''}) },
清空數(shù)字、刪除數(shù)字、添加“.”事件處理函數(shù)
// 清空數(shù)字、刪除數(shù)字、添加“.”事件處理函數(shù) dotBtn:function(){ if(this.isClear){ this.setData({num:'0.'}); this.isClear = false; return } if(this.data.num.indexOf('.' >=0)){ return } }, delBtn:function(){ var num = this.data.num.substr(0,this.data.num.length - 1); this.result = num; this.setData({num:num === ''?'0':num}) }, resBtn:function(){ this.result = null; this.isClear = false; this.setData({num:'0',op:''}) } })
總結
到此這篇關于微信小程序計算器實現(xiàn)案例的文章就介紹到這了,更多相關微信小程序計算器案例內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
淺談javascript控制HTML5的全屏操控,瀏覽器兼容的問題
下面小編就為大家?guī)硪黄獪\談javascript控制HTML5的全屏操控,瀏覽器兼容的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10layer.alert回調函數(shù)執(zhí)行關閉彈窗的實例
今天小編就為大家分享一篇layer.alert回調函數(shù)執(zhí)行關閉彈窗的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09