从编程小白到全栈开发:一个简易纯前端计算器

简介: 在前文中,我给大家介绍了在JS全栈开发中前端和后端的概念,如果你有了一种茅塞顿开的感觉,恭喜你,你骨骼清奇,是个当程序猿的好苗子。扯了这么久,到现在还没真正开始讲代码方面的知识,真是不好意思。

在前文中,我给大家介绍了在JS全栈开发中前端和后端的概念,如果你有了一种茅塞顿开的感觉,恭喜你,你骨骼清奇,是个当程序猿的好苗子。

扯了这么久,到现在还没真正开始讲代码方面的知识,真是不好意思。但是对一个初学者来说,必要的心理建设和学前铺垫是非常必要的。编程是一个既要充分发挥创造力和想象力,又要忍受重复枯燥性的一项活动,所以我也在时刻思考着如何以通俗有趣的方式来讲解这些内容,让你有足够的兴趣学习下去。

人对抽象的概念比较难理解一些,所以我会使用一些比较形象的东西来解释我们在学习编程的过程中遇到的各种问题。

好,今天一上来,我就要教你写一个比较实际的程序:一个简易的计算器。它的功能比较基础,只有加减乘除的功能。

但是,我们的目标是JS全栈开发呀!

没错,所以我们要学习的,是如何实现一个纯前端的计算器;以及,如何把这个计算器改造成由前端和后端协同来完成计算的网络计算器。

纯前端实现的计算器

我们要做的是一个能做对两个数字进行加、减、乘、除的简易计算器,功能非常简单。所以,这样的功能完全能在前端全部搞定。

让我们先来看一下对这个计算器的功能定义描述:

  • 用户能输入两个数字
  • 用户能选择做加、减、乘、除法中其中一种数学运算
  • 用户点击“计算”按钮进行运算
  • 计算完成后显示运算结果

构建基本功能

好的,看明白了功能需求,我们就开工吧!请打开你的VS Code,新建一个文件,并把它保存为calculator.html。接下来我们来一步步的来编辑这个文件,使其一点点的达到我们想要的功能。

第一步,在文件中输入以下代码,它是作为一个HTML文件最基础的代码:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>计算器</title>
</head>

<body>

</body>

</html>

第一行的<!DOCTYPE html>代表了这个HTML文件所遵循的HTML规范版本。HTML规范有很多种,而该文档中的这个表示该文档使用了HTML5规范,这是当今主流的规范。对这些规范感兴趣的朋友,可以当做课外作业,自行搜索了解。

HTML里面这种用尖括号<>包起一个单词的东西,我们叫做标签元素,HTML规范中定义了很多标签元素,用于实现页面上各种各样的功能。

<head>标签包含的区域,一般是用来放这个网页的描述信息(我们叫做元数据)及资源信息(比如需要引入的js和css代码等等),一般这些信息在我们通过浏览器查看网页的时候是不可见的。

<body>标签包含的部分呢,基本上是构建一个页面中可见界面的那部分代码。比如一个页面上我们能看到的超链接啊,按钮啊,输入框啊之类的,都会在这部分区域进行编写。

VS Code小技巧:感觉写上面的代码好多字啊,打字慢的人,一个一个输入好麻烦,嗯,来试试VS Code神技!在空的html文件中,输入一个感叹号(!),然后按键盘上左边的Tab键。

VS Code小技巧

接下来我们来做第二步:为了能让用户输入两个数字,我们决定在页面上放两个输入框,输入框在HTML中是<input>,来看下加上输入框后<body>区域的代码:

<body>
    <div class="calculator">
        <input type="text" id="num1">
        <input type="text" id="num2">
    </div>
</body>

在浏览器中运行或刷新一下你的页面,是不是看到两个输入框出现了?

输入框

然后是第三步:为了能让用户选择做加、减、乘、除法中其中一种数学运算,我们给他们一个下拉框来做选择吧:

<body>
    <div class="calculator">
        <input type="text" id="num1">

        <select id="operator">
            <option value="+">+</option>
            <option value="-">-</option>
            <option value="*">*</option>
            <option value="/">/</option>
        </select>

        <input type="text" id="num2">
    </div>
</body>
下拉框
下拉框-选择

我们看到页面上,在两个输入框之间,就多了一个包含了加减乘除运算符的下拉框,下拉框的功能,在HTML中可以用<select>来实现,<select>里面的4个<option>,分别就是下拉框的4个选项。

再来第四步,我们需要提供一个“计算”按钮供用户在输入完成后进行点击并进行运算,按钮我们用<button>来做:

<body>
    <div class="calculator">
        <input type="text" id="num1">

        <select id="operator">
            <option value="+">+</option>
            <option value="-">-</option>
            <option value="*">*</option>
            <option value="/">/</option>
        </select>

        <input type="text" id="num2">

        <button onclick="calc()">计算</button>
    </div>
</body>

我们可以看到,这里的<button>上面,有一个很显眼的onclick="calc()",这是做什么用的呢?这个的意思,其实就是告诉页面,如果有用户点击(click)了这个按钮,则运行一段JS代码:一个叫做calc的JS函数。

为什么要在这里运行JS函数呢?因为HTML标签本身是用来构建界面的,它处理不了什么逻辑性的东西,要处理逻辑功能,我们就要让JS闪亮登场了。

我们来看一下这个calc的JS函数是个什么样子的:

<body>
    <div class="calculator">
        <input type="text" id="num1">

        <select id="operator">
            <option value="+">+</option>
            <option value="-">-</option>
            <option value="*">*</option>
            <option value="/">/</option>
        </select>

        <input type="text" id="num2">

        <button onclick="calc()">计算</button>
    </div>

    <script>
        function calc() {
            // 获取id为num1的输入框
            var num1El = document.getElementById('num1');

            // 从num1输入框获取文字内容并转换成数字类型
            var num1 = parseFloat(num1El.value);

            // 获取id为num2的输入框
            var num2El = document.getElementById('num2');

            // 从num2输入框获取文字内容并转换成数字类型
            var num2 = parseFloat(num2El.value);

            // 获取id为operator的下拉框
            var operatorEl = document.getElementById('operator');

            // 从下拉框获取当前选中的内容
            var operator = operatorEl.value;

            var result = 0;

            // 根据选中的运算类型,进行相应的计算
            if (operator === '+') {
                result = num1 + num2;   // 相加
            } else if (operator === '-') {
                result = num1 - num2;   // 相减
            } else if (operator === '*') {
                result = num1 * num2;   // 相乘
            } else if (operator === '/') {
                result = num1 / num2;   // 相除
            }

            // 显示计算结果
            alert('计算结果是:' + result);
        }
    </script>
</body>

可以看到,我们在<script>标签内,写入了一段JS的代码,这种形式,是在HTML中嵌入JS代码的一种方式(还有其他的方式,我们后面再聊)。这个calc函数的功能,就是从页面上获取用户输入的两个数字,以及根据用户选择的运算符,进行相应的数学运算,并显示出计算结果。

在这段代码中,三次出现了document.getElementById,它是用于从document这个对象上,根据标签元素的id属性值进行匹配,查找到匹配的标签元素。然后,你可以看到,对于输入框的获取的value,我们会用parseFloat进行处理,为什么这样做呢?因为HTML的<input>输入框中获取的value,总是字符串类型的,而字符串类型的内容,直接进行数学运算会有问题。来看下面的例子:

var a = '2.5';
var b = '8';

// 将两个字符串a和b相加
// 结果为字符串'2.58'
var c = a + b; 

// 将字符串a和b分别先转换为浮点数,再进行相加,
// 结果则为数字10.8
var d = parseFloat(a) + parseFloat(b); 

所以,在写代码的时候,要注意你的数据类型是否已处理正确。

好了,至此,一个非常简易(是简陋)的计算器就完成了,输入内容后进行计算,它看起来就像是这样的:

计算器

你竟然是这样的计算器,真是丑爆了!

哎,我们来稍微修饰一下它,给它化个妆磨个皮吧。为HTML化妆的功能,是通过一种叫做CSS(层叠样式表)的技术实现的,它可以为HTML的可视化元素设置各种样式,让我们的页面变得更生动。我为我们的计算器稍稍粉饰了一下,在HTML代码的<head>标签中,加入以下代码:

    <style>
        .calculator {
            border: 2px solid #98a2da;
            border-radius: 5px;
            padding: 20px;
            width: 300px;
            background-color: #dcdffa;
        }

        input {
            display: block;
            margin: 15px 0;
            border: 1px solid #98a2da;
            border-radius: 5px;
            color: #cccccc;
            width: 90%;
            height: 30px;
            padding: 5px 10px;
            font-size: 16px;
            font-weight: bold;
            text-align: right;
        }

        select {
            height: 30px;
            padding: 5px 10px;
            font-size: 16px;
            width: 50px;
        }

        button {
            border: 1px solid #98a2da;
            border-radius: 5px;
            background-color: #ffffff;
            font-size: 16px;
            padding: 5px 20px;
            color: #7d7d7d;
        }
    </style>

在浏览器中刷新我们的页面,你将看到我们的计算器变得看起来稍微那么顺眼了一些:

添加样式后的计算器

真是人靠衣装,HTML靠CSS啊。而且,一份同样的HTML代码,可以使用不同的CSS代码来变换出不同的样子,很是强大,真是可以媲美亚洲4大邪术啊!

好,一个纯前端实现的简易计算器就成功实现了!对初学者来说,这个内容还是有点多的,自己实践和思考一下。其中肯定有很多我没解释的地方你还不明白,没关系,随着学习的深入,一切都会明朗。有问题,记得给我留言提问哦。

在下一篇中,我们将会在今天这个纯前端计算器的基础上,将其改造为一个由前端和后端协同来完成计算的网络计算器,敬请期待哦。

坚持学习,坚持实践,你也能成为专家。
欢迎关注一斤代码的系列课程《从编程小白到全栈开发》

目录
相关文章
|
1月前
|
Cloud Native 前端开发 JavaScript
前端开发者必看:不懂云原生你就OUT了!揭秘如何用云原生技术提升项目部署与全栈能力
【10月更文挑战第23天】随着云计算的发展,云原生逐渐成为技术热点。前端开发者了解云原生有助于提升部署与运维效率、实现微服务化、掌握全栈开发能力和利用丰富技术生态。本文通过示例代码介绍云原生在前端项目中的应用,帮助开发者更好地理解其重要性。
60 0
|
2月前
|
JavaScript 前端开发 Docker
前端全栈之路Deno篇(二):几行代码打包后接近100M?别慌,带你掌握Deno2.0的安装到项目构建全流程、剖析构建物并了解其好处
在使用 Deno 构建项目时,生成的可执行文件体积较大,通常接近 100 MB,而 Node.js 构建的项目体积则要小得多。这是由于 Deno 包含了完整的 V8 引擎和运行时,使其能够在目标设备上独立运行,无需额外安装依赖。尽管体积较大,但 Deno 提供了更好的安全性和部署便利性。通过裁剪功能、使用压缩工具等方法,可以优化可执行文件的体积。
122 3
前端全栈之路Deno篇(二):几行代码打包后接近100M?别慌,带你掌握Deno2.0的安装到项目构建全流程、剖析构建物并了解其好处
|
23天前
|
前端开发 JavaScript 安全
揭秘!前端大牛们如何高效解决跨域问题,提升开发效率!
【10月更文挑战第30天】在Web开发中,跨域问题是一大挑战。本文介绍前端大牛们常用的跨域解决方案,包括JSONP、CORS、postMessage和Nginx/Node.js代理,对比它们的优缺点,帮助初学者提升开发效率。
44 4
|
2月前
|
JavaScript 前端开发 测试技术
前端全栈之路Deno篇(五):如何快速创建 WebSocket 服务端应用 + 客户端应用 - 可能是2025最佳的Websocket全栈实时应用框架
本文介绍了如何使用Deno 2.0快速构建WebSocket全栈应用,包括服务端和客户端的创建。通过一个简单的代码示例,展示了Deno在WebSocket实现中的便捷与强大,无需额外依赖,即可轻松搭建具备基本功能的WebSocket应用。Deno 2.0被认为是最佳的WebSocket全栈应用JS运行时,适合全栈开发者学习和使用。
108 7
|
2月前
|
前端开发 JavaScript 中间件
前端全栈之路Deno篇(四):Deno2.0如何快速创建http一个 restfulapi/静态文件托管应用及oak框架介绍
Deno 是由 Node.js 创始人 Ryan Dahl 开发的新一代 JavaScript 和 TypeScript 运行时,旨在解决 Node.js 的设计缺陷,具备更强的安全性和内置的 TypeScript 支持。本文介绍了如何使用 Deno 内置的 `Deno.serve` 快速创建 HTTP 服务,并详细讲解了 Oak 框架的安装和使用方法,包括中间件、路由和静态文件服务等功能。Deno 和 Oak 的结合使得创建 RESTful API 变得高效且简便,非常适合快速开发和部署现代 Web 应用程序。
|
2月前
|
JSON 分布式计算 前端开发
前端的全栈之路Meteor篇(七):轻量的NoSql分布式数据协议同步协议DDP深度剖析
本文深入探讨了DDP(Distributed Data Protocol)协议,这是一种在Meteor框架中广泛使用的发布/订阅协议,支持实时数据同步。文章详细介绍了DDP的主要特点、消息类型、协议流程及其在Meteor中的应用,包括实时数据同步、用户界面响应、分布式计算、多客户端协作和离线支持等。通过学习DDP,开发者可以构建响应迅速、适应性强的现代Web应用。
|
2月前
|
JavaScript 前端开发 Serverless
前端全栈之路Deno篇:Deno2.0与Bun对比,谁更胜一筹?可能Deno目前更适合serverless业务
在前端全栈开发中,Deno 2.0 和 Bun 作为新兴的 JavaScript 运行时,各自展现了不同的优势。Deno 2.0 重视安全性和多平台兼容性,尤其是对 Windows 的良好支持和原生 TypeScript 支持;而 Bun 则以卓越的性能和简便的开发体验著称,适合快速迭代的小型项目。两者在不同场景下各具特色,Deno 更适合企业级应用和serverless,Bun 则适用于追求速度的项目。
143 1
|
2月前
|
JSON 前端开发 数据格式
前端的全栈之路Meteor篇(五):自定义对象序列化的EJSON介绍 - 跨设备的对象传输
EJSON是Meteor框架中扩展了标准JSON的库,支持更多数据类型如`Date`、`Binary`等。它提供了序列化和反序列化功能,使客户端和服务器之间的复杂数据传输更加便捷高效。EJSON还支持自定义对象的定义和传输,通过`EJSON.addType`注册自定义类型,确保数据在两端无缝传递。
|
2月前
|
前端开发 安全 API
前端全栈之路Deno篇(三):一次性搞懂和学会用Deno 2.0 的权限系统详解和多种权限配置权限声明方式
本文深入解析了 Deno 2.0 的权限系统,涵盖主包和第三方包的权限控制机制,探讨了通过命令行参数、权限 API 和配置文件等多种权限授予方式,并提供了代码示例和运行指导,帮助开发者有效管理权限,提升应用安全性。
|
2月前
|
前端开发 JavaScript API
前端的全栈之路Meteor篇(完):关于前后端分离及与各框架的对比,浅析分离之下的潜在耦合
本文探讨了Meteor.js这一全栈JavaScript框架的特点与优势,特别是在前后端分离架构中的应用。Meteor通过共享数据结构和简化全栈开发流程,实现了前后端的紧密协作。文章还对比了其他全栈框架,如Next.js、Nuxt.js等,分析了各自的优势与适用场景,最后讨论了通过定义文档归属者和用户专有数据集简化后端构建及端云数据同步的方法。