最简单的 HTML/CSS/JS 计算器

这个版本非常适合初学者,代码结构清晰,易于理解和修改。

源码下载

您可以直接将以下代码复制并保存为一个 .html 文件。

文件名:simple-calculator.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">简单计算器</title>
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            background-color: #f0f0f0;
            font-family: Arial, sans-serif;
        }
        .calculator {
            border: 2px solid #333;
            border-radius: 10px;
            padding: 20px;
            background-color: #fff;
            box-shadow: 0 5px 15px rgba(0,0,0,0.1);
        }
        .display {
            width: 100%;
            height: 50px;
            font-size: 24px;
            text-align: right;
            margin-bottom: 15px;
            padding: 0 10px;
            border: 1px solid #ccc;
            border-radius: 5px;
            box-sizing: border-box; /* 确保 padding 不会影响宽度 */
        }
        .buttons {
            display: grid;
            grid-template-columns: repeat(4, 1fr);
            gap: 10px;
        }
        button {
            height: 50px;
            font-size: 18px;
            border: 1px solid #ccc;
            border-radius: 5px;
            cursor: pointer;
            background-color: #e9e9e9;
            transition: background-color 0.2s;
        }
        button:hover {
            background-color: #d0d0d0;
        }
        .operator {
            background-color: #ff9500;
            color: white;
        }
        .operator:hover {
            background-color: #e68600;
        }
        .equals {
            background-color: #2ecc71;
            color: white;
            grid-column: span 2;
        }
        .equals:hover {
            background-color: #27ae60;
        }
        .clear {
            background-color: #e74c3c;
            color: white;
        }
        .clear:hover {
            background-color: #c0392b;
        }
    </style>
</head>
<body>
    <div class="calculator">
        <input type="text" class="display" id="display" readonly>
        <div class="buttons">
            <button class="clear" onclick="clearDisplay()">C</button>
            <button onclick="appendToDisplay('(')">(</button>
            <button onclick="appendToDisplay(')')">)</button>
            <button class="operator" onclick="appendToDisplay('/')">/</button>
            <button onclick="appendToDisplay('7')">7</button>
            <button onclick="appendToDisplay('8')">8</button>
            <button onclick="appendToDisplay('9')">9</button>
            <button class="operator" onclick="appendToDisplay('*')">×</button>
            <button onclick="appendToDisplay('4')">4</button>
            <button onclick="appendToDisplay('5')">5</button>
            <button onclick="appendToDisplay('6')">6</button>
            <button class="operator" onclick="appendToDisplay('-')">-</button>
            <button onclick="appendToDisplay('1')">1</button>
            <button onclick="appendToDisplay('2')">2</button>
            <button onclick="appendToDisplay('3')">3</button>
            <button class="operator" onclick="appendToDisplay('+')">+</button>
            <button onclick="appendToDisplay('0')">0</button>
            <button onclick="appendToDisplay('.')">.</button>
            <button class="equals" onclick="calculate()">=</button>
        </div>
    </div>
    <script>
        const display = document.getElementById('display');
        function appendToDisplay(value) {
            display.value += value;
        }
        function clearDisplay() {
            display.value = '';
        }
        function calculate() {
            try {
                // 使用 eval() 来计算表达式,注意 eval 有安全风险,但在这里是安全的,因为输入完全由用户控制。
                const result = eval(display.value);
                display.value = result;
            } catch (error) {
                display.value = 'Error';
            }
        }
    </script>
</body>
</html>

如何运行

  1. 创建文件:将上面的代码完整复制,粘贴到一个新的文本文件中。
  2. 保存文件:将文件另存为 simple-calculator.html(确保后缀名是 .html,而不是 .txt)。
  3. 打开文件:直接用浏览器(如 Chrome, Firefox, Edge)双击打开这个 html 文件即可看到计算器并使用。

功能更完善的科学计算器

这个版本增加了更多功能,如三角函数、对数、幂运算等,代码结构也更模块化。

源码下载

同样,您可以将以下代码保存为 .html 文件。

文件名:scientific-calculator.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">科学计算器</title>
    <style>
        body { display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background-color: #222; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }
        .calculator { border: 2px solid #444; border-radius: 15px; padding: 20px; background-color: #333; box-shadow: 0 10px 30px rgba(0,0,0,0.5); }
        .display { width: 100%; height: 60px; font-size: 28px; text-align: right; margin-bottom: 15px; padding: 0 15px; border: none; border-radius: 8px; background-color: #111; color: #fff; box-sizing: border-box; }
        .buttons { display: grid; grid-template-columns: repeat(5, 1fr); gap: 10px; }
        button { height: 50px; font-size: 16px; border: none; border-radius: 8px; cursor: pointer; color: #fff; transition: all 0.2s; font-weight: bold; }
        .number { background-color: #555; }
        .number:hover { background-color: #666; }
        .operator { background-color: #ff9500; }
        .operator:hover { background-color: #e68600; }
        .equals { background-color: #2ecc71; grid-column: span 2; }
        .equals:hover { background-color: #27ae60; }
        .clear { background-color: #e74c3c; }
        .clear:hover { background-color: #c0392b; }
        .function { background-color: #9b59b6; }
        .function:hover { background-color: #8e44ad; }
        .memory { background-color: #34495e; }
        .memory:hover { background-color: #2c3e50; }
    </style>
</head>
<body>
    <div class="calculator">
        <input type="text" class="display" id="display" readonly>
        <div class="buttons">
            <!-- 第一行:清除和括号 -->
            <button class="clear" onclick="clearDisplay()">C</button>
            <button class="clear" onclick="clearEntry()">CE</button>
            <button class="function" onclick="appendToDisplay('(')">(</button>
            <button class="function" onclick="appendToDisplay(')')">)</button>
            <button class="function" onclick="backspace()">⌫</button>
            <!-- 第二行:科学函数 -->
            <button class="function" onclick="appendFunction('sin(')">sin</button>
            <button class="function" onclick="appendFunction('cos(')">cos</button>
            <button class="function" onclick="appendFunction('tan(')">tan</button>
            <button class="function" onclick="appendFunction('log(')">log</button>
            <button class="function" onclick="appendFunction('sqrt(')">√</button>
            <!-- 第三行:数字和基本运算 -->
            <button class="number" onclick="appendToDisplay('7')">7</button>
            <button class="number" onclick="appendToDisplay('8')">8</button>
            <button class="number" onclick="appendToDisplay('9')">9</button>
            <button class="operator" onclick="appendToDisplay('/')">/</button>
            <button class="memory" onclick="memoryOperation('MS')">MS</button>
            <!-- 第四行 -->
            <button class="number" onclick="appendToDisplay('4')">4</button>
            <button class="number" onclick="appendToDisplay('5')">5</button>
            <button class="number" onclick="appendToDisplay('6')">6</button>
            <button class="operator" onclick="appendToDisplay('*')">×</button>
            <button class="memory" onclick="memoryOperation('MR')">MR</button>
            <!-- 第五行 -->
            <button class="number" onclick="appendToDisplay('1')">1</button>
            <button class="number" onclick="appendToDisplay('2')">2</button>
            <button class="number" onclick="appendToDisplay('3')">3</button>
            <button class="operator" onclick="appendToDisplay('-')">-</button>
            <button class="memory" onclick="memoryOperation('M+')">M+</button>
            <!-- 第六行 -->
            <button class="number" onclick="appendToDisplay('0')">0</button>
            <button class="number" onclick="appendToDisplay('.')">.</button>
            <button class="number" onclick="appendToDisplay('^')">^</button>
            <button class="operator" onclick="appendToDisplay('+')">+</button>
            <button class="memory" onclick="memoryOperation('MC')">MC</button>
            <!-- 第七行:等号 -->
            <button class="equals" onclick="calculate()">=</button>
        </div>
    </div>
    <script>
        const display = document.getElementById('display');
        let memory = 0;
        function appendToDisplay(value) {
            display.value += value;
        }
        function clearDisplay() {
            display.value = '';
        }
        function clearEntry() {
            display.value = display.value.slice(0, -1);
        }
        function backspace() {
            clearEntry();
        }
        function appendFunction(func) {
            display.value += func;
        }
        function calculate() {
            try {
                // 使用 Function 构造函数比 eval 更安全一些
                const result = new Function('return ' + display.value)();
                display.value = result;
            } catch (error) {
                display.value = 'Error';
            }
        }
        function memoryOperation(op) {
            const currentValue = parseFloat(display.value) || 0;
            switch(op) {
                case 'MS': // Memory Store
                    memory = currentValue;
                    break;
                case 'MR': // Memory Recall
                    display.value = memory;
                    break;
                case 'M+': // Memory Add
                    memory += currentValue;
                    break;
                case 'MC': // Memory Clear
                    memory = 0;
                    break;
            }
        }
    </script>
</body>
</html>

如何运行

运行方法与方案一完全相同:

  1. 将代码保存为 scientific-calculator.html 文件。
  2. 用浏览器打开即可。

从 GitHub 下载开源项目

如果您想学习更专业、更复杂的实现,或者直接使用一个功能强大的项目,GitHub 是最佳选择。

推荐项目

  • Calculator (by MDN Web Docs)

  • Calculator (by Vitor Luiz)

    • 简介:一个功能极其丰富的现代化计算器,支持主题切换、历史记录、科学计算模式等。
    • GitHub 地址https://github.com/vitorluiz/calculator
    • 特点:代码量较大,使用了现代前端技术(如 React),界面美观,功能强大。

如何从 GitHub 下载

  1. 访问 GitHub 页面:打开上面任一项目的 GitHub 链接。
  2. 找到 "Code" 按钮:在项目页面的右上角,你会看到一个绿色的 Code 按钮。
  3. 下载方式
    • 直接下载 ZIP:点击 Code 按钮,然后选择 "Download ZIP",浏览器会下载一个包含所有源代码的压缩包。
    • 使用 Git 克隆:如果你熟悉 Git,可以复制仓库的 URL,然后在你的命令行中使用 git clone [URL] 命令来下载。
  4. 解压并运行
    • 下载 ZIP 包后,将其解压到一个文件夹。
    • 进入解压后的文件夹,找到 index.html 文件。
    • 直接用浏览器打开这个 index.html 文件即可运行项目。

总结与建议

方案 优点 缺点 适合人群
方案一 代码极简,易于理解,适合快速上手。 功能单一,无法处理复杂运算。 初学者,想了解基本原理。
方案二 功能较全,包含科学计算和内存功能,代码结构稍好。 eval/Function 存在潜在安全风险(在完全可控的本地环境中问题不大)。 有一定基础的学习者,想扩展功能。
方案三 功能强大、代码规范、有学习文档、界面美观 项目可能较复杂,需要一定的学习成本。 进阶学习者寻找现成解决方案的开发者

给您的建议

  • 如果你是初学者,从方案一开始是最好的选择,它能帮你理解计算器最核心的逻辑。
  • 如果你已经掌握了基础,可以尝试方案二,学习如何添加新功能。
  • 如果你想做一个功能完善、界面美观的商业级计算器,或者想学习大型项目架构,直接去方案三的 GitHub 下载学习。