iPhone风格的计算器

这个iPhone风格的计算器实现了以下功能:

设计特点

  • 浅色网页背景(#f5f5f7),黑色计算器主体
  • 圆角设计和阴影效果,符合iPhone计算器风格
  • 显示屏位于顶部,白色大字体显示

按钮设计

  • 数字按钮(0-9)和小数点:灰色背景,白色文字
  • 功能按钮(AC、±、%):浅灰色背景,黑色文字
  • 运算符按钮(÷、×、−、+、=):浅橙色背景
  • 零按钮:占据两列宽度,左对齐,圆角设计

功能实现

  • 基本四则运算(加减乘除)
  • 清除功能(AC)
  • 正负切换(±)
  • 百分比计算(%)
  • 小数点输入
  • 按钮点击时的视觉反馈(变暗效果)

计算器具有完整的错误处理,如除零错误,同时支持大数字的科学计数法显示。所有按钮都有适当的点击反馈效果。

网站演示

https://nide.xin/jisuan

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>iPhone风格计算器</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 100vh;
            background-color: #f5f5f7;
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
        }

        .calculator {
            width: 320px;
            background-color: #000;
            border-radius: 30px;
            padding: 20px;
            box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
            overflow: hidden;
        }

        .display {
            width: 100%;
            height: 120px;
            background-color: #000;
            color: white;
            text-align: right;
            padding: 20px;
            font-size: 60px;
            font-weight: 300;
            overflow: hidden;
            text-overflow: ellipsis;
            white-space: nowrap;
            margin-bottom: 20px;
        }

        .buttons {
            display: grid;
            grid-template-columns: repeat(4, 1fr);
            gap: 12px;
        }

        .button {
            height: 70px;
            border-radius: 50%;
            border: none;
            font-size: 32px;
            font-weight: 400;
            cursor: pointer;
            display: flex;
            justify-content: center;
            align-items: center;
            transition: background-color 0.2s;
            user-select: none;
        }

        .button:active {
            opacity: 0.7;
        }

        .number, .decimal {
            background-color: #333;
            color: white;
        }

        .function {
            background-color: #a5a5a7;
            color: black;
        }

        .operator {
            background-color: #f1a33c;
            color: white;
        }

        .zero {
            grid-column: span 2;
            border-radius: 35px;
            justify-content: flex-start;
            padding-left: 28px;
        }

        .equals {
            background-color: #f1a33c;
            color: white;
        }
    </style>
</head>
<body>
    <div class="calculator">
        <div class="display" id="display">0</div>
        <div class="buttons">
            <button class="button function" onclick="clearAll()">AC</button>
            <button class="button function" onclick="toggleSign()">±</button>
            <button class="button function" onclick="percentage()">%</button>
            <button class="button operator" onclick="setOperation('÷')">÷</button>
            
            <button class="button number" onclick="appendNumber('7')">7</button>
            <button class="button number" onclick="appendNumber('8')">8</button>
            <button class="button number" onclick="appendNumber('9')">9</button>
            <button class="button operator" onclick="setOperation('×')">×</button>
            
            <button class="button number" onclick="appendNumber('4')">4</button>
            <button class="button number" onclick="appendNumber('5')">5</button>
            <button class="button number" onclick="appendNumber('6')">6</button>
            <button class="button operator" onclick="setOperation('-')">−</button>
            
            <button class="button number" onclick="appendNumber('1')">1</button>
            <button class="button number" onclick="appendNumber('2')">2</button>
            <button class="button number" onclick="appendNumber('3')">3</button>
            <button class="button operator" onclick="setOperation('+')">+</button>
            
            <button class="button number zero" onclick="appendNumber('0')">0</button>
            <button class="button number decimal" onclick="addDecimal()">.</button>
            <button class="button operator equals" onclick="calculate()">=</button>
        </div>
    </div>

    <script>
        let currentInput = '0';
        let previousInput = '';
        let operation = null;
        let shouldResetDisplay = false;

        const display = document.getElementById('display');

        function updateDisplay() {
            // 格式化显示数字,限制长度
            let displayValue = currentInput;
            if (displayValue.length > 10) {
                displayValue = parseFloat(displayValue).toExponential(5);
            }
            display.textContent = displayValue;
        }

        function appendNumber(number) {
            if (currentInput === '0' || shouldResetDisplay) {
                currentInput = number;
                shouldResetDisplay = false;
            } else {
                currentInput += number;
            }
            updateDisplay();
        }

        function addDecimal() {
            if (shouldResetDisplay) {
                currentInput = '0.';
                shouldResetDisplay = false;
                updateDisplay();
                return;
            }
            
            if (!currentInput.includes('.')) {
                currentInput += '.';
                updateDisplay();
            }
        }

        function clearAll() {
            currentInput = '0';
            previousInput = '';
            operation = null;
            shouldResetDisplay = false;
            updateDisplay();
        }

        function toggleSign() {
            currentInput = (parseFloat(currentInput) * -1).toString();
            updateDisplay();
        }

        function percentage() {
            currentInput = (parseFloat(currentInput) / 100).toString();
            updateDisplay();
        }

        function setOperation(op) {
            if (operation !== null) calculate();
            previousInput = currentInput;
            operation = op;
            shouldResetDisplay = true;
        }

        function calculate() {
            if (operation === null || shouldResetDisplay) return;

            const prev = parseFloat(previousInput);
            const current = parseFloat(currentInput);
            let result;

            switch (operation) {
                case '+':
                    result = prev + current;
                    break;
                case '−':
                    result = prev - current;
                    break;
                case '×':
                    result = prev * current;
                    break;
                case '÷':
                    if (current === 0) {
                        result = '错误';
                    } else {
                        result = prev / current;
                    }
                    break;
                default:
                    return;
            }

            // 处理结果显示
            if (result === '错误') {
                currentInput = result;
            } else {
                // 如果结果是整数,显示为整数
                if (Number.isInteger(result)) {
                    currentInput = result.toString();
                } else {
                    // 保留适当的小数位数
                    currentInput = parseFloat(result.toFixed(10)).toString();
                }
            }
            
            operation = null;
            previousInput = '';
            shouldResetDisplay = true;
            updateDisplay();
        }

        // 初始化显示
        updateDisplay();
    </script>
</body>
</html>