微信小程序实现计算器小功能
程序员文章站
2022-03-27 08:09:20
微信小程序现在越来越火爆了,我也看到很多在校大学生都在自学了,那些专门从事app开发,网页开发的工作者更是看到了小程序的前景,在小程序领域也掺上一脚,本人也是自学小程序的,初期跟很多人一样,遇到一些不...
微信小程序现在越来越火爆了,我也看到很多在校大学生都在自学了,那些专门从事app开发,网页开发的工作者更是看到了小程序的前景,在小程序领域也掺上一脚,本人也是自学小程序的,初期跟很多人一样,遇到一些不懂的想问问别人,到贴吧去,一大堆广告,根本没人帮忙解决问题。
今天教一些刚入门的同学做一款计算器,如果c语言是编程的最佳入门语言,那计算器应该算得上是小程序的入门demo了,希望刚入门的同学们认真品味下面的代码,从wxml到js,再到wxss(页面的布局),每个代码都要弄懂他的意思
废话不多说,先上效果图,这是我入门时候自己做的一款计算器,很简单,逻辑也很单一,只是我们身边最常见的计算器的逻辑,我觉得从这个demo我更深刻学习到了wxss页面的布局知识
代码附上:
app.json
{ "pages":[ "pages/index/index", "pages/logs/logs" ], "window": { "navigationbarbackgroundcolor": "#000000", "navigationbartextstyle": "white", "navigationbartitletext": "智能计算器" }, "tabbar": { //补充说一下,我这个tabbar是用来设置底部tab的 "color":"#ff69b4", "selectedcolor":"#0000ff", "backgroundcolor":"#ffff00", "list": [ { "pagepath": "pages/index/index", "text": "计 算 机" }, { "pagepath": "pages/logs/logs", "text": "日志" }, { "pagepath":"pages/logs/logs", "text":"回家" } ] } }
/*app.wxss/*
.container { height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: space-between; padding: 200rpx 0; box-sizing: border-box; }
**其中一些组件不认识的话, 建议到多看几遍
index.wxml:
<template name="calculator-key"> <button hover-start-time="{{5}}" hover-stay-time="{{100}}" 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' : 'c'}}"/> <template is="calculator-key" data="{{classname: 'key-sign', display: '+/-'}}"/> <template is="calculator-key" data="{{classname: 'key-percent', display: '%'}}"/> </view> <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>
index.js:
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 }) } } } })
index.wxss:
page { height:100%; } .calculator { width: 100%; height: 100vh; border:solid 1px; background: rgb(238, 5, 5); position: relative; box-shadow: 0px 0px 20px 0px rgb(211, 41, 41); display: flex; flex-direction: column; box-sizing: border-box; } .calculator-display { /*显示器背景颜色*/ background: #2c2a2c; flex: 1; } /*todo:解决文本垂直居中问题,显示器数字颜色*/ .calculator-display-text { padding: 0 30px; font-size: 3em; color: rgb(245, 245, 248); text-align: right; } .calculator-keypad { display: flex; } .calculator .function-keys { display: flex; color:rgb(245, 13, 13); } .calculator .digit-keys { background: #0808f7; display: flex; flex-direction: row; flex-wrap: wrap-reverse; } .calculator-key-hover { /*按钮按下以后的颜色*/ box-shadow: inset 0px 0px 25vw 0px hsla(71, 90%, 48%, 0.898); } .calculator-key { background-color:aqua; display: block; width: 25vw; height: 25vw; line-height: 25vw; border-top: 1px solid rgb(6, 245, 78); border-right: 1px solid rgb(19, 241, 12); text-align: center; box-sizing: border-box; } .calculator .function-keys .calculator-key { font-size: 2em; } .calculator .digit-keys .calculator-key { font-size: 3em; } .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: rgb(248, 165, 10); border-right: 0; font-size: 3em; } .calculator .function-keys { background: linear-gradient(to bottom, rgb(6, 6, 240) 0%, rgb(52, 5, 240) 100%); } .calculator .operator-keys { background: linear-gradient(to bottom, rgba(252,156,23,1) 0%, rgba(247,126,27,1) 100%); } .input-keys { width: 100%; } .operator-keys { width: 100%; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。