一.先看效果:
二.超级详细的制作过程:1.首先自然是定义html标签(先别理标签里的vue语法),我定义一个父盒子.calculator,然后定义一个span标签放计算结果,其它按钮都用button标签包裹。计算器的布局采用grid布局,所以在每个按钮里绑定属性grid-area指定它将要放在哪一个区域:
2.定义好基本的全局css样式:
box-sizing:border-box;盒子边框和内边距的值是包含在width内; 3.计算器父盒子.calculator的整体样式
grid-template-areas: 定义每个按钮所占的区域位置; 4.按钮的css样式,实现拟态化效果按钮:
背景渐变色加上阴影实现拟态化微立体风格按钮: 5.计算结果的span标签也同样实现拟态化效果:
6.开始vue部分,实现计算器计算逻辑与功能,首先定义基本变量:
7.给每个按钮绑定对应的点击事件,并传入参数,同时显示计算结果result:
8.开始书写事件函数,实现计算逻辑,首先定义一个函数,判断当前输入是否为运算符(加减乘除):
9.输入函数entry,包括数字、小数点、等号与运算符:
10.点击 =,输出结果:
//parseFloat() 函数可解析一个字符串,并返回一个浮点数。 11. 当点击清空AC,正负±,百分比%时的事件处理函数:
完整代码: <!-- * @Author: your name * @Date: 2021-07-17 18:30:43 * @LastEditTime: 2021-07-18 16:16:02 * @LastEditors: Please set LastEditors * @Description: In User Settings Edit * @FilePath: undefinedd:练习ue计算器.html --> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { height: 100vh; display: flex; justify-content: center; align-items: center; background-color: rgb(231, 231, 231); } .calculator { display: grid; grid-template-areas: "num-0 num-0 num-0 num-0" "num-10 num-11 num-18 num-13" "num-7 num-8 num-9 num-14" "num-4 num-5 num-6 num-15" "num-1 num-2 num-3 num-12" "num-19 num-16 num-17 num-17"; grid-gap: 15px; grid-template-columns: repeat(4, 55px); grid-template-rows: repeat(6, 55px); box-shadow: -5px -5px 15px -5px white, 5px 5px 15px -5px rgba(0, 0, 0, 0.15); border-radius: 15px; padding: 25px; } .calculator > button { text-align: center; font-family: "fangsong"; font-weight: bold; font-size: 22px; border: none; color: rgb(114, 114, 114); background-image: linear-gradient(135deg, rgba(0, 0, 0, 0.1), white); box-shadow: -2px -2px 8px -2px white, 2px 2px 8px -2px rgba(0, 0, 0, 0.15); border-radius: 20px; } .calculator > button:active { box-shadow: inset -2px -2px 8px -2px white, inset 2px 2px 8px -2px rgba(0, 0, 0, 0.15); } div > span { color: rgb(70, 70, 70); padding: 0 8px 0 0; font-size: 25px; line-height: 55px; text-align: right; box-shadow: inset -2px -2px 10px -2px white, inset 2px 2px 10px -2px rgba(0, 0, 0, 0.15); overflow-x: auto; } </style> </head> <body> <div id="app"> <div class="calculator"> <span style="grid-area: num-0">{{result}}</span> <button @click="entry('1')" style="grid-area: num-1">1</button ><button @click="entry('2')" style="grid-area: num-2">2</button ><button @click="entry('3')" style="grid-area: num-3">3</button ><button @click="entry('4')" style="grid-area: num-4">4</button ><button @click="entry('5')" style="grid-area: num-5">5</button ><button @click="entry('6')" style="grid-area: num-6">6</button ><button @click="entry('7')" style="grid-area: num-7">7</button ><button @click="entry('8')" style="grid-area: num-8">8</button ><button @click="entry('9')" style="grid-area: num-9">9</button> <button @click="allClear" style="grid-area: num-10">AC</button ><button @click="different" style="grid-area: num-11">±</button ><button @click="entry('*')" style="grid-area: num-12">×</button ><button @click="entry('/')" style="grid-area: num-13">÷</button ><button @click="entry('+')" style="grid-area: num-14">+</button ><button @click="entry('-')" style="grid-area: num-15">-</button ><button @click="entry('.')" style="grid-area: num-16">.</button ><button @click="getResult()" style="grid-area: num-17">=</button ><button @click="percentage" style="grid-area: num-18">%</button ><button @click="entry('0')" style="grid-area: num-19">0</button> </div> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script> var app = new Vue({ el: "#app", data: { result: "0", //是否输入了小数点 isDot: false, //是否输入了运算符 isOperator: false, //是否有了第一次输入 isFirst: false, }, methods: { //该方法返回当前是否输入的是运算符(加减乘除),是则返回真,反之 operator(num) { //indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。如果要检索的字符串值没有出现,则该方法返回 -1。 return ["+", "-", "*", "/"].indexOf(num) > -1; }, // 输入 entry(num) { //是否是第一次输入,且第一次输入的不能运算符 if (this.result == "0" && !this.operator(num)) { //第一次就输入小数点 if (num == ".") { this.result += "."; //已输入小数点,次数用完了,只有输入运算符号后才能再次输小数点 this.isDot = true; } else { this.result = num; } this.isFirst = true; return; } // 有了第一次输入,继续输入其它数字 if (!this.operator(num)) { //如果小数点输入次数用完就不能再输入,只有输入运算符号后才能再次输小数点 if (num == "." && this.isDot) { //直接返回 return; } // 如果小数点输入次数没用完,程序可以继续往下走,不直接return if (num == ".") { this.isDot = true; //输入点后不能直接输入运算符,先把isOperator该为true this.isOperator = true; } else { //如果输入的是数字,证明还没输入运算符 this.isOperator = false; } // 拼接输入字符 this.result += num; } //输入运算符(如果连第一次都没输入就输入运算符那就当你第一次输入的是0了) if (this.operator(num) && !this.isOperator) { // 拼接输入的运算符 this.result += num; //可以再次输入小数点 this.isDot = false; //已输入运算符,下一次输入不能再是运算符 this.isOperator = true; } }, // 结果 = getResult() { //eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。 //toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。 //parseFloat() 函数可解析一个字符串,并返回一个浮点数。 //toString() 方法可把一个 Number 对象转换为一个字符串,并返回结果。 this.result = parseFloat(eval(this.result).toFixed(12).toString()); this.isDot = false; this.isOperator = false; }, // 清空 AC allClear() { this.result = "0"; this.isDot = false; this.isFirst = false; this.isOperator = false; }, // 正负 ± different() { //如果还没第一次输入或者运算符已经输入了,都直接取消返回 if (!this.isFirst || this.isOperator) { return; } // 符合条件,将乘一个 -1 this.result += "* -1"; // 返回新结果 this.getResult(); }, // 百分比 % percentage() { //如果还没第一次输入或者运算符已经输入了,都直接取消返回 if (!this.isFirst || this.isOperator) { return; } // 符合条件,将乘一个 0.01 this.result += "* 0.01"; // 返回新结果 this.getResult(); }, }, }); </script> </body> </html> |