vue制作优雅的拟态化微立体计算器😆

举报
北极光之夜。 发表于 2021/07/20 15:37:33 2021/07/20
【摘要】 一.话不多,先看效果: 这个效果是我在b站看到一个up写的,感觉拟态化微立体效果很简约却又有种优雅的感觉。😉而优雅又怎么能缺了我, <( ̄︶ ̄)> ,所以话不多说,自己马上也整了一个,实现并不难,超详细的制作过程如下(最后附上完整代码): 二.超级详细的制作过程:1.首先自然是定义html标签(先别理标签里的vue语法),我定义一个父盒子.calculator,然后定义一个span标签放...

一.话不多,先看效果:

在这里插入图片描述
 这个效果是我在b站看到一个up写的,感觉拟态化微立体效果很简约却又有种优雅的感觉。😉而优雅又怎么能缺了我, <( ̄︶ ̄)> ,所以话不多说,自己马上也整了一个,实现并不难,超详细的制作过程如下(最后附上完整代码):

二.超级详细的制作过程:

1.首先自然是定义html标签(先别理标签里的vue语法),我定义一个父盒子.calculator,然后定义一个span标签放计算结果,其它按钮都用button标签包裹。计算器的布局采用grid布局,所以在每个按钮里绑定属性grid-area指定它将要放在哪一个区域:

 <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>

2.定义好基本的全局css样式:

 * {
        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);
      }

box-sizing:border-box;盒子边框和内边距的值是包含在width内;
display: flex; flex布局,让计算器整体在窗口居中显示。
background-color:给背景个不是那么纯白的色。

3.计算器父盒子.calculator的整体样式

 .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;
      }

grid-template-areas: 定义每个按钮所占的区域位置;
grip-gap:每个按钮间距离;
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); 左上白,右下灰;

4.按钮的css样式,实现拟态化效果按钮:

 .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);
      }

背景渐变色加上阴影实现拟态化微立体风格按钮:
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); 左上白右下灰;
点击按钮时把外阴影改为内阴影:
box-shadow: inset -2px -2px 8px -2px white,
inset 2px 2px 8px -2px rgba(0, 0, 0, 0.15);

5.计算结果的span标签也同样实现拟态化效果:

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;
      }

6.开始vue部分,实现计算器计算逻辑与功能,首先定义基本变量:

 data: { 
     // result为计算结果
          result: "0",
          //代表是否输入了小数点
          isDot: false,
          //代表是否输入了运算符(加减乘除)
          isOperator: false,
          //代表是否有了第一次次输入
          isFirst: false,
        },

7.给每个按钮绑定对应的点击事件,并传入参数,同时显示计算结果result:

<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>

8.开始书写事件函数,实现计算逻辑,首先定义一个函数,判断当前输入是否为运算符(加减乘除):

 //该方法返回当前是否输入的是运算符(加减乘除),是则返回真,反之
          operator(num) {
            //indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。如果要检索的字符串值没有出现,则该方法返回 -1。
            return ["+", "-", "*", "/"].indexOf(num) > -1;
          },

9.输入函数entry,包括数字、小数点、等号与运算符:

 entry(num) {
   //是否是第一次输入,且第一次输入的不能运算符
            if (this.result == "0" && !this.operator(num)) {
              //第一次就输入小数点
              if (num == ".") {
                this.result += ".";
                //已输入小数点,次数用完了,只有再次输入运算符号后才能再次输小数点
                this.isDot = true;
              } else {
               //当前result为输入
                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;
            }
          },

10.点击 =,输出结果:

 // 结果
          getResult() {
            //eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
            //toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。
            //parseFloat() 函数可解析一个字符串,并返回一个浮点数。
            //toString() 方法可把一个 Number 对象转换为一个字符串,并返回结果。
            this.result = parseFloat(eval(this.result).toFixed(12).toString());
            // 同时小数点和运算符改为没输入状态
            this.isDot = false;
            this.isOperator = false;
          },

//parseFloat() 函数可解析一个字符串,并返回一个浮点数。
//eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
//toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。
//toString() 方法可把一个 Number 对象转换为一个字符串,并返回结果。

11. 当点击清空AC,正负±,百分比%时的事件处理函数:

 // 清空 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();
          },

三.总结:

计算器到这就完成了,下次见啦,拜拜~

对了,完整代码在gitee仓库免费下载链接如下https://gitee.com/aurora-in-winter/blog.git

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。