JS原生——编写简易计算器

news2025/1/21 15:42:54

一个非常适合新手练习的小案例!!!

使用JS的ES5语法+HTML+CSS及企业级代码规范,方便后续良好的代码习惯养成!!!

先来看一下样式吧!!!(后附代码)

👇👇👇👇

一、设计思路

  • 实现功能:加减乘除运输、清空、清空末位
  • 结构:整体使用table表格,按钮部分使用button给对应的属性值在JS中获取,输入框/输出框使用input给固定的长度及不可编辑。
  • 样式:可自行设计修改。
  • 逻辑:因为使用了eval()方法在首位及末位默认不可输入运算符,运算符的下一位不能是运算符。

二、关于代码规范方面需要注意的

  1. 在ES5中为防止代码命名污染全局。参照函数是独立作用域的原则使用立即执行函数形成独立的作用域即模块化编程。
  2. 在ES5中不宜频繁操作DOM元素使用传参的方式传入获取父级,其他子级在父级下操作。
  3. 创建 init(初始化函数)来统一管理其他函数。
  4. 尽量遵照一个功能及一个函数原则可提起工具函数。(😳这个案例函数不复杂没做)

三、使用到的JS方法

  1. 基础的for循环。
  2. Number()转换数字格式。
  3. +=复合赋值运算符。
  4. .length获取字符串长度
  5. substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。
  6. slice() 方法可通过指定的开始和结束位置,提取字符串的某个部分,并以新的字符串返回被提取的部分。
  7. eval()将可运算的表达式进行运算。

四、代码部分

  1、HTML

<div class="calculator">
        <table>
            <tr>
                <td colspan="5"><input type="text" class="result" disabled="disabled"></td>
            </tr>
            <tr>
                <td><button value="7">7</button></td>
                <td><button value="8">8</button></td>
                <td><button value="9">9</button></td>
                <td><button class="del-button ac">AC</button></td>
                <td><button class="del-button c">C</button></td>
            </tr>
            <tr>
                <td><button value="4">4</button></td>
                <td><button value="5">5</button></td>
                <td><button value="6">6</button></td>
                <td><button value="-" class="operator">-</button></td>
                <td><button value="*" class="operator">*</button></td>
            </tr>
            <tr>
                <td><button value="1">1</button></td>
                <td><button value="2">2</button></td>
                <td><button value="3">3</button></td>
                <td rowspan="2"><button value="+" class="add operator">+</button></td>
                <td><button value="/" class="operator">/</button></td>
            </tr>
            <tr>
                <td><button value="0">0</button></td>
                <td><button value=".">.</button></td>
                <td><button value="00">00</button></td>
                <td><button class="equal-button">=</button></td>
            </tr>
        </table>
    </div>

2、css

* {
            margin: 0;
            padding: 0;
        }

        .calculator {
            padding: 30px;
        }

        td {
            width: 20%;
            padding: 5px;
        }

        table {
            border-radius: 16px;
            background: #EAECF3;
            padding: 5px;
        }

        button {
            width: 100%;
            height: 40px;
            border: 0;
            border-radius: 16px;
            box-shadow: inset 1px 1px 1px 0px rgb(230 244 255 / 80%), inset -1px -1px 1px 0px rgb(40 48 85 / 30%), 1px 1px 3px 0px rgb(40 50 85 / 10%);
            user-select: none;
            color: #283155;
            text-shadow: 2px 1px 1px rgb(0 0 0 / 10%);
            opacity: 2 !important;
            cursor: pointer;
            background-image: linear-gradient(135deg, #F4F5F6, #fff);
            font-size: 16px;
        }

        input {
            height: 56px;
            font-size: 20px;
            border: 0;
            border-radius: 18px;
            background: #fff;
            box-shadow: inset -1px -1px 1px 0 rgb(223 255 257 / 70%);
            box-shadow: inset 1px 1px 1px 0 rgb(40 49 86 / 30%);
            overflow: hidden;
        }

        .add {
            height: 90px;
        }

        .operator {
            background-image: linear-gradient(133deg, #D9DCE8, #E2E4EF);
        }

        .del-button {
            background-image: linear-gradient(133deg, #FFA80E, #FFC355);
            color: #fff;
        }

        .equal-button {
            box-shadow: inset 1px 1px 1px 0px rgb(223 255 255 / 21%), inset -2px -2px 1px 0px rgb(40 49 85 / 30%), 1px 1px 3px 0px rgb(157 174 167 / 20%);
            background: #4f6ef2;
            color: #fff;
        }

        .result {
            padding-left: 10px;
        }

3、JS

; (function (doc) {
            var oCalculator = doc.getElementsByClassName('calculator')[0],
                oResult = oCalculator.getElementsByClassName("result")[0],
                btnGroup = oCalculator.getElementsByTagName('button'),
                btnEqual = oCalculator.getElementsByClassName("equal-button")[0],
                ac = oCalculator.getElementsByClassName("ac")[0],
                c = oCalculator.getElementsByClassName("c")[0],
                strRest = '';

            var init = function () {
                bindEvents()
            }

            function bindEvents() {
                for (let i = 0; i <= btnGroup.length - 1; i++) {
                    btnGroup[i].addEventListener('click', computed, false)
                }
                btnEqual.addEventListener('click', equal, false)
                ac.addEventListener('click', empty, false)
                c.addEventListener('click', fDelete, false)
            }

            function computed(ev) {
                var e = ev || window.event,
                    value = e.target.value;
                if (strRest.length === 0) {
                    if (Number(value)) {
                        strRest += value;
                        renderResult()
                    }
                } else if (strRest.length < 15) {
                    if (oResult.value.substr(-1) === '+' || oResult.value.substr(-1) === '-' || oResult.value.substr(-1) === '*' || oResult.value.substr(-1) === '/') {
                        if (Number(value)) {
                            strRest += value;
                            renderResult()
                        }
                    } else {
                        strRest += value;
                        renderResult()
                    }
                } else if (strRest.length === 15) {
                    if (Number(value)) {
                        strRest += value;
                        renderResult()
                    }
                }
            }

            function renderResult() {
                oResult.value = strRest
            }

            function equal() {
                oResult.value = eval(strRest);
                strRest = oResult.value;
            }

            function empty() {
                strRest = '';
                oResult.value = strRest;
            }

            function fDelete() {
                strRest = strRest.slice(0, strRest.length - 1);
                oResult.value = strRest;
            }

            init()
        })(document)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/408534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

组件通信的6种方式

什么是组件通信 vue组件中关系说明: 如上图所示, A与B、A与C、B与D、C与E组件之间是父子关系&#xff1b; B与C之间是兄弟关系&#xff1b;A与D、A与E之间是隔代关系&#xff1b; D与E是堂兄关系&#xff08;非直系亲属&#xff09; 针对以上关系我们归类为&#xff1a; 父…

前端跨域解决方案

文章目录1.同源政策2.跨域解决方案2.1 CORS普通跨域请求&#xff1a;只需服务端设置Access-Control-Allow-Origin即可携带cookie跨域请求&#xff1a;前后端都需设置2.2 JSONP原理缺点数据格式jsonp跨域实现2.3 postMessage跨域2.4 WebSocket属性&#xff1a;事件&#xff1a;使…

vue3+vite:本地代理,配置proxy

一、项目&#xff1a;uniappvue3vitets 二、配置文件在vite.config.ts proxy: {/snow: { // 匹配请求路径&#xff0c;localhost:3000/snowtarget: https://www.snow.com/, // 代理的目标地址changeOrigin: true, // 开发模式&#xff0c;默认的origin是真实的 origin:localh…

压缩gltf/glb模型踩坑与解决 three.js DRACOLoader

前言 使用前端three.js加载3d模型过程中&#xff0c;往往会出现模型大小过大导致前端加载时间过长&#xff0c;降低用户体验。 本文所记录的是笔者在使用gltf-pipeline压缩3d模型中踩坑DRACOLoader与解决的一个过程。 所采用的three库版本为 ^0.138.2 解决方案与介绍 通过g…

31.JavaScript数组进阶,一网打尽数组操作函数slice、filter、map、reduce、some、every、find、splice

文章目录数组进阶元素删除&#xff08;对象方式&#xff09;splice()删除一个元素删除多个元素截断数组元素替换元素插入返回值负索引slice()concat()forEach()indexOf、lastIndexOf、includesfind、findIndexfiltermapsortreversestr.split()和arr.join()reduce、reduceRightA…

vue在html标签 {{}} 中调用函数的方法

目录 一、问题 1&#xff09;实现上述需求&#xff1a;有两种方式 2&#xff09;两种实现方式对比&#xff1a; 二、解决方法&#xff08;在html渲染时调用函数&#xff09; 三、总结 注&#xff1a;不想仔细看的&#xff0c;可以直接看有颜色的及代码哟 一、问题 1.在ht…

关于 HbuilderX 运行项目到手机,搜索不到手机解决

注意 本文内&#xff0c;我的 HbuilderX 安装目录都是在 D:\app 目录下&#xff0c;所有关于本文的操作文件都是在 HbuilderX 安装包内。 第一步&#xff1a;打开环境变量&#xff0c;找到系统变量&#xff0c;然后点击编辑。 第二部&#xff1a;配置 HbuilderX 的 adbs 目录…

JS中的位运算

目录 JS中的位运算 JS中的与运算 JS中的或运算 JS中的否&#xff08;非&#xff09;运算 计算机中负数的存储方式 JS中的异或运算 JS中位运算的应用场景 位的叠加&#xff08;开关&#xff09; JS中的位移运算 左位移 右位移 全右位移 首先了解一下什么是位运算 位…

Vite 配置篇:日常开发掌握这些配置就够了!

不知道有没有这样的兄弟&#xff0c;学习 Vite 的时候&#xff0c;官网上各种配置看的是眼花缭乱。不知道哪些需要掌握&#xff0c;哪些只用简单了解一下。为了提高大家的效率&#xff0c;我把项目中常用的配置梳理了一下分享给大家&#xff0c;希望对你上手 Vite 有所帮助。话…

若依框架前端切换TagView时刷新问题

若依框架点击顶部tag切换时&#xff0c;永远都是刷新的。刷新问题两种情况&#xff1a;普通view切换时刷新及iFrame切换刷新 一、普通view切换时刷新 原因是view的name与在菜单填写的大小写不一致&#xff0c;按若依框架规则&#xff0c;路由地址必须写为 camel 驼峰命名形式&…

前端:Tomcat服务器部署Web项目

文章目录1.1 C/S架构1.2 B/S架构2.1 服务器2.2 常见服务器3.1 Tomcat安装3.2 Tomcat使用3.3 Tomcat配置3.4 Tomcat项目部署4.1 Servlet技术4.2 Servlet配置4.3 配置测试4.4 Servlet部署5.1 IDEA部署1.1 C/S架构 Client / Server客户端/服务器 客户端作为独立程序 图形效果较好…

【面试题】面试官: Vue如何实现权限管理?

我正在参加「掘金启航计划」 一、权限管理 权限管理就是让不同的用户只能访问自己权限内的资源&#xff0c;有以下几种 路由权限&#xff0c;用户登录后只能看到自己权限内的导航菜单&#xff0c;且只能访问自己权限内的路由地址视图权限&#xff0c;用户只能看到自己权限内…

为你心仪的她做一个 “旋转木马“告白相册【零基础纯 CSS3 实现】

&#x1f4b3; 效果展示&#xff1a; 旋转相册效果里面就不放女朋友的美照了防止虐狗 &#x1f970;&#x1f970;&#x1f970;&#xff0c;就用个前端技能树的图片代替哈&#xff0c;有需要大家自行替换。 &#x1f4b3; 源码获取&#xff1a; 源码我已经上传到了资源里&…

Django web开发(二) - Mysql数据库

文章目录Mysql数据库Mysql的安装(CentOS7)下载修改配置文件Mysql强制重置密码远程可登录数据库管理数据表的管理常用数据类型数据管理添加数据查询数据删除数据修改数据员工管理Python管理数据库添加数据查询数据删除数据修改数据案例: Flask Mysql案例: 查询所有用户Mysql数据…

Three.js 渲染glb,gltf模型(保姆级教程)

1.准备工作 将下列文件在three.js的包中找到&#xff0c;注意的是我这里使用的是模块化版本的&#xff0c;这里不知道模块化的&#xff0c;可以先去看一下es6的模块化。 控制器&#xff1a; OrbitControls.js 加载器&#xff1a;GLTFLoader.js 材质&#xff1a; RoomEnviron…

echarts折线图流动特效的实现(非平滑曲线)

1.实现效果 2.实现原理 echarts官网&#xff1a;series-lines 注意&#xff1a;流动特效只支持非平滑曲线&#xff08;smooth&#xff1a;false&#xff09; series-lines路径图&#xff1a; 用于带有起点和终点信息的线数据的绘制&#xff0c;主要用于地图上的航线&#xff…

若依框架:前端登录组件与图像验证码

在上一篇《若依框架&#xff1a;前端项目结构与初始页面渲染流程》中&#xff0c;我们探讨了与“vue.config.js文件配置、.env模式和环境变量配置、vue-router全局导航守卫配置、vue-router路由配置简介”相关的内容&#xff0c;书接上回&#xff0c;我们继续探讨若依前端项目的…

前端实现在线预览Word文件

简介 在项目中遇到了个需求&#xff0c;大致需求这样的&#xff1a;用户在上传文件前需要先预览一下内容&#xff0c;确认内容是否正确&#xff0c;正确的情况下才可以上传&#xff1b; 那么这里面会涉及到一个在上传前的文档的预览操作&#xff0c;下面就记录一下踩坑记录 d…

uni-app ——使用uploadFile上传多张图片

前言&#xff1a;最近的工作中出现了一个功能点&#xff0c;具体写法我在前面的文章中已经阐述过&#xff0c;不过之前的情况是上传图片调用后端的一个接口&#xff0c;整个表单页面提交的时候调用的是另一个接口&#xff0c;我也从中学到了另外的一种方法&#xff0c;写到这里…

UniApp Scroll-View 设置占满下方剩余高度的方法小记

前言&#xff1a;点滴积累&#xff0c;贵在坚持一、布局描述&#xff1a;屏幕分为上下两部分&#xff0c;上面部分高度固定&#xff0c;比如 400rpx&#xff08;单位可以指定为其他的比如px、upx等&#xff0c;高度也可以自己设定&#xff09;&#xff0c;下面部分为 scroll-vi…