文章目录
- 一、运行效果
- 二、知识储备
-
- 三、实现步骤
- (一)准备工作
-
- (二)实现页面结构
- 1、编写页面整体结构
- 2、编写结果区域的结构
- 3、编写按钮区域第一行按钮的结构
- 4、编写按钮区域第二行按钮的结构
- 5、编写按钮区域第三行按钮的结构
- 6、编写按钮区域第四行按钮的结构
- 7、编写按钮区域第五行按钮的结构
- 8、查看页面结构源码
- (三)实现页面样式
- 1、编写页面样式
- 2、编写结果区域样式
- 3、编写按钮区域样式
- (1)按钮区域总体样式
- (2)按钮区域中每一行的样式
- (4)按钮区域每一行中每个按钮的样式
- (5)让0按钮跨2列
- (6)清除按钮样式
- (7)最后一列按钮样式
- (8)按钮的盘旋样式类
- 4、查看页面样式源码
- (四)创建工具模块
- 1、数学模块 - math.js
- 2、计算模块 - calc.js
- (五)实现页面逻辑
- (六)特殊情况处理
一、运行效果
二、知识储备
(一)data-*自定义属性
{"pages": ["pages/index/index"],"window": {"navigationBarTextStyle": "black","navigationBarTitleText": "案例3-2知识储备","navigationBarBackgroundColor": "#eee"},"style": "v2","sitemapLocation": "sitemap.json"
}
<view>姓名:{{name}}</view>
<view>年龄:{{age}}</view>
<button bind:tap="change" data-name="陈燕文" data-age="18">修改姓名与年龄</button>
Page({data: {name: "未知",age: "0"},change: function(e) {this.setData({name: e.target.dataset.name,age: e.target.dataset.age})}
})
(二)模块
module.exports = {message: "欢迎访问泸职院~"
}
var welcome = require('../../utils/welcome.js')
Page({onLoad: function() {console.log("welcome模块暴露的数据:" + welcome.message)},data: {name: "未知",age: "0"},change: function(e) {this.setData({name: e.target.dataset.name,age: e.target.dataset.age})}
})
三、实现步骤
(一)准备工作
1、创建项目
- 创建微信小程序项目 -
计算器
- 单击【确定】按钮
- 按照惯例,做一些初始化工作
2、设置导航栏
- 在
app.json
文件设置window
配置项
(二)实现页面结构
1、编写页面整体结构
2、编写结果区域的结构
- 两行内容:第一行是当前计算式,第二行是当前计算结果
3、编写按钮区域第一行按钮的结构
- 第一行包含四个按钮:清除按钮、删除按钮、正负号切换按钮、除号按钮
- 第20行代码设置了
data-val
自定义属性,用于区分不同按钮
4、编写按钮区域第二行按钮的结构
- 第二行包含四个按钮:7按钮、8按钮、9按钮、乘号按钮
- 第二行四个按钮都设置了
data-val
自定义属性,用于区分不同按钮
5、编写按钮区域第三行按钮的结构
- 第三行包含四个按钮:4按钮、5按钮、6按钮、减号按钮
- 第三行四个按钮都设置了
data-val
自定义属性,用于区分不同按钮
6、编写按钮区域第四行按钮的结构
- 第四行包含四个按钮:1按钮、2按钮、3按钮、加号按钮
7、编写按钮区域第五行按钮的结构
- 第五行包含三个按钮:0按钮、点按钮、等号按钮
- 第58行代码设置了
data-val
自定义属性,用于区分不同按钮 - 查看预览效果
8、查看页面结构源码
<view class="result"><view class="result-sub">{{sub}}</view><view class="result-num">{{num}}</view>
</view>
<view class="btns"><view><view hover-class="bg" hover-stay-time="50" bind:tap="btnReset">C</view><view hover-class="bg" hover-stay-time="50" bind:tap="btnDel">DEL</view><view hover-class="bg" hover-stay-time="50" bind:tap="btnPosNeg">+/-</view><view hover-class="bg" hover-stay-time="50" bind:tap="btnOperate" data-val="÷">÷</view></view><view><view hover-class="bg" hover-stay-time="50" bind:tap="btnNum" data-val="7">7</view><view hover-class="bg" hover-stay-time="50" bind:tap="btnNum" data-val="8">8</view><view hover-class="bg" hover-stay-time="50" bind:tap="btnNum" data-val="9">9</view><view hover-class="bg" hover-stay-time="50" bind:tap="btnOperate" data-val="×">×</view></view><view><view hover-class="bg" hover-stay-time="50" bind:tap="btnNum" data-val="4">4</view><view hover-class="bg" hover-stay-time="50" bind:tap="btnNum" data-val="5">5</view><view hover-class="bg" hover-stay-time="50" bind:tap="btnNum" data-val="6">6</view><view hover-class="bg" hover-stay-time="50" bind:tap="btnOperate" data-val="-">-</view></view><view><view hover-class="bg" hover-stay-time="50" bind:tap="btnNum" data-val="1">1</view><view hover-class="bg" hover-stay-time="50" bind:tap="btnNum" data-val="2">2</view><view hover-class="bg" hover-stay-time="50" bind:tap="btnNum" data-val="3">3</view><view hover-class="bg" hover-stay-time="50" bind:tap="btnOperate" data-val="+">+</view></view><view><view hover-class="bg" hover-stay-time="50" bind:tap="btnNum" data-val="0">0</view> <view hover-class="bg" hover-stay-time="50" bind:tap="btnDot">.</view><view hover-class="bg" hover-stay-time="50" bind:tap="btnCalculate">=</view></view>
</view>
(三)实现页面样式
1、编写页面样式
- 编写
page
样式
2、编写结果区域样式
- 结果区域有三个样式类:
result
、result-sub
和result-num
- 修改页面结构,暂时查看预览效果
- 查看预览效果之后,将页面结构改回去
3、编写按钮区域样式
(1)按钮区域总体样式
.btns
选择器
- 查看预览效果
(2)按钮区域中每一行的样式
.btns > view
选择器
- 查看预览效果
(4)按钮区域每一行中每个按钮的样式
.btns > view > view
选择器
- 查看预览效果
(5)让0按钮跨2列
.btns > view:last-child > view:first-child
选择器
- 查看预览效果
(6)清除按钮样式
.btns > view:first-child > view:first-child
选择器
- 查看预览效果
(7)最后一列按钮样式
.btns > view > view:last-child
选择器
- 查看预览效果
(8)按钮的盘旋样式类
.bg
选择器
- 查看预览效果
4、查看页面样式源码
page {height: 100vh;display: flex;flex-direction: column;color: #555;
}
.result { flex: 1; background: #f3f6fe;position: relative;
}
.result-sub {font-size: 52rpx;position: absolute;bottom: 16vh;right: 3vw;
}
.result-num {font-size: 100rpx;position: absolute;bottom: 3vh;right: 3vw;
}
.btns {flex: 1;display: flex;flex-direction: column;font-size: 48rpx;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: #f00;
}
.btns > view > view:last-child {color: #fc8e00;
}
.bg {background: #eee;
}
(四)创建工具模块
- 在项目根目录创建
utils
目录
1、数学模块 - math.js
- 在
utils
目录里创建math.js
文件
module.exports = {add: function (a, b) {var r1, r2, mtry {r1 = a.toString().split('.')[1].length} catch (e) {r1 = 0}try {r2 = b.toString().split('.')[1].length} catch (e) {r2 = 0}m = Math.pow(10, Math.max(r1, r2))return (a * m + b * m) / m},sub: function (a, b) {var r1, r2, m, ntry {r1 = a.toString().split('.')[1].length} catch (e) {r1 = 0}try {r2 = b.toString().split('.')[1].length} catch (e) {r2 = 0}m = Math.pow(10, Math.max(r1, r2))n = (r1 >= r2) ? r1 : r2return ((a * m - b * m) / m).toFixed(n)},mul: function (a, b) {var m = 0,s1 = a.toString(),s2 = b.toString()try {m += s1.split('.')[1].length} catch (e) { }try {m += s2.split('.')[1].length} catch (e) { }return Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m)},div: function (a, b) {var t1 = 0,t2 = 0,r1, r2try {t1 = a.toString().split('.')[1].length} catch (e) { }try {t2 = b.toString().split('.')[1].length} catch (e) { }r1 = Number(a.toString().replace('.', ''))r2 = Number(b.toString().replace('.', ''))return (r1 / r2) * Math.pow(10, t2 - t1)}
}
2、计算模块 - calc.js
(五)实现页面逻辑
(六)特殊情况处理