在現代Web開發中,JavaScript已經成為前端開發的核心技術之一。通過JavaScript,我們可以實現各種復雜的交互功能,甚至可以在瀏覽器中模擬桌面應用程序的功能。本文將詳細介紹如何使用JavaScript來仿制Windows計算器的功能。我們將從項目結構、HTML、CSS到JavaScript邏輯一步步進行講解,最終實現一個功能完整的計算器。
在開始編寫代碼之前,我們需要先規劃一下項目的結構。一個簡單的計算器項目通常包括以下幾個部分:
我們將分別創建這三個文件,并在HTML文件中引入CSS和JavaScript文件。
首先,我們需要創建一個HTML文件來定義計算器的界面結構。計算器的界面通常包括一個顯示屏和一系列按鈕。我們可以使用HTML的<div>
元素來創建這些組件。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JavaScript計算器</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="calculator">
<div class="display" id="display">0</div>
<div class="buttons">
<button class="btn clear" id="clear">C</button>
<button class="btn backspace" id="backspace">←</button>
<button class="btn operator" id="divide">÷</button>
<button class="btn operator" id="multiply">×</button>
<button class="btn number" id="seven">7</button>
<button class="btn number" id="eight">8</button>
<button class="btn number" id="nine">9</button>
<button class="btn operator" id="subtract">-</button>
<button class="btn number" id="four">4</button>
<button class="btn number" id="five">5</button>
<button class="btn number" id="six">6</button>
<button class="btn operator" id="add">+</button>
<button class="btn number" id="one">1</button>
<button class="btn number" id="two">2</button>
<button class="btn number" id="three">3</button>
<button class="btn equals" id="equals">=</button>
<button class="btn number zero" id="zero">0</button>
<button class="btn decimal" id="decimal">.</button>
</div>
</div>
<script src="script.js"></script>
</body>
</html>
在這個HTML結構中,我們創建了一個<div>
元素作為計算器的容器,并在其中定義了一個顯示屏和一系列按鈕。每個按鈕都有一個唯一的id
,以便在JavaScript中引用。
接下來,我們需要為計算器添加一些樣式,使其看起來更像Windows計算器。我們可以使用CSS來設置計算器的布局、顏色、字體等。
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #f0f0f0;
font-family: Arial, sans-serif;
}
.calculator {
width: 300px;
background-color: #333;
border-radius: 10px;
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5);
overflow: hidden;
}
.display {
background-color: #222;
color: #fff;
font-size: 2.5em;
text-align: right;
padding: 20px;
box-sizing: border-box;
height: 80px;
display: flex;
align-items: center;
justify-content: flex-end;
}
.buttons {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 1px;
}
.btn {
background-color: #444;
color: #fff;
border: none;
font-size: 1.5em;
padding: 20px;
cursor: pointer;
transition: background-color 0.2s;
}
.btn:hover {
background-color: #555;
}
.btn:active {
background-color: #666;
}
.btn.operator {
background-color: #ff9500;
}
.btn.operator:hover {
background-color: #ffaa33;
}
.btn.operator:active {
background-color: #cc7700;
}
.btn.equals {
background-color: #ff2d55;
grid-column: span 2;
}
.btn.equals:hover {
background-color: #ff4d6a;
}
.btn.equals:active {
background-color: #cc2244;
}
.btn.clear {
background-color: #ff3b30;
}
.btn.clear:hover {
background-color: #ff5c52;
}
.btn.clear:active {
background-color: #cc3026;
}
.btn.backspace {
background-color: #ff9500;
}
.btn.backspace:hover {
background-color: #ffaa33;
}
.btn.backspace:active {
background-color: #cc7700;
}
.btn.zero {
grid-column: span 2;
}
在這個CSS文件中,我們為計算器的各個部分設置了樣式。我們使用了grid
布局來排列按鈕,并為不同類型的按鈕設置了不同的背景顏色和懸停效果。
現在,我們已經完成了計算器的界面設計和樣式設置,接下來我們將使用JavaScript來實現計算器的邏輯功能。
首先,我們需要定義一些變量來存儲計算器的狀態。這些變量包括當前顯示的值、上一個操作數、當前運算符等。
let displayValue = '0';
let firstOperand = null;
let secondOperand = null;
let currentOperator = null;
let shouldResetDisplay = false;
displayValue
:當前顯示在計算器屏幕上的值。firstOperand
:第一個操作數。secondOperand
:第二個操作數。currentOperator
:當前選擇的運算符。shouldResetDisplay
:一個布爾值,用于指示是否應該在輸入下一個數字時重置顯示屏。接下來,我們需要為計算器的按鈕添加事件監聽器,以便在用戶點擊按鈕時執行相應的操作。
const display = document.getElementById('display');
const numberButtons = document.querySelectorAll('.number');
const operatorButtons = document.querySelectorAll('.operator');
const clearButton = document.getElementById('clear');
const backspaceButton = document.getElementById('backspace');
const decimalButton = document.getElementById('decimal');
const equalsButton = document.getElementById('equals');
numberButtons.forEach(button => {
button.addEventListener('click', () => {
appendNumber(button.textContent);
});
});
operatorButtons.forEach(button => {
button.addEventListener('click', () => {
chooseOperator(button.textContent);
});
});
clearButton.addEventListener('click', clear);
backspaceButton.addEventListener('click', backspace);
decimalButton.addEventListener('click', appendDecimal);
equalsButton.addEventListener('click', calculate);
在這個代碼片段中,我們為數字按鈕、運算符按鈕、清除按鈕、退格按鈕、小數點按鈕和等號按鈕分別添加了事件監聽器。每個按鈕被點擊時,都會調用相應的函數來處理輸入。
當用戶點擊數字按鈕時,我們需要將數字添加到顯示屏上。如果顯示屏上的值是0
,或者需要重置顯示屏,我們將直接替換顯示屏上的值。
function appendNumber(number) {
if (displayValue === '0' || shouldResetDisplay) {
displayValue = number;
shouldResetDisplay = false;
} else {
displayValue += number;
}
updateDisplay();
}
appendNumber
函數接收一個數字作為參數,并將其添加到displayValue
中。displayValue
是0
,或者shouldResetDisplay
為true
,我們將直接替換displayValue
。updateDisplay
函數來更新顯示屏上的值。當用戶點擊運算符按鈕時,我們需要保存當前的操作數和運算符,并準備接收下一個操作數。
function chooseOperator(operator) {
if (currentOperator !== null) {
calculate();
}
firstOperand = displayValue;
currentOperator = operator;
shouldResetDisplay = true;
}
chooseOperator
函數接收一個運算符作為參數。currentOperator
不為null
,說明之前已經選擇了一個運算符,我們需要先執行計算。firstOperand
,并更新currentOperator
。shouldResetDisplay
設置為true
,以便在輸入下一個數字時重置顯示屏。當用戶點擊等號按鈕時,我們需要執行計算并顯示結果。
function calculate() {
if (currentOperator === null || shouldResetDisplay) {
return;
}
secondOperand = displayValue;
displayValue = operate(firstOperand, secondOperand, currentOperator);
updateDisplay();
currentOperator = null;
}
calculate
函數首先檢查currentOperator
是否為null
,或者是否需要重置顯示屏。如果是,則直接返回。secondOperand
,并調用operate
函數執行計算。currentOperator
重置為null
。當用戶點擊清除按鈕時,我們需要重置計算器的所有狀態。
function clear() {
displayValue = '0';
firstOperand = null;
secondOperand = null;
currentOperator = null;
shouldResetDisplay = false;
updateDisplay();
}
clear
函數將所有變量重置為初始狀態,并更新顯示屏。當用戶點擊小數點按鈕時,我們需要將小數點添加到當前顯示的值中。如果當前值已經包含小數點,則不進行任何操作。
function appendDecimal() {
if (shouldResetDisplay) {
displayValue = '0.';
shouldResetDisplay = false;
} else if (!displayValue.includes('.')) {
displayValue += '.';
}
updateDisplay();
}
appendDecimal
函數首先檢查是否需要重置顯示屏。如果是,則將displayValue
設置為'0.'
。displayValue
中。updateDisplay
函數來更新顯示屏。當用戶點擊退格按鈕時,我們需要刪除當前顯示值的最后一個字符。如果刪除后顯示值為空,則將其設置為0
。
function backspace() {
if (displayValue.length === 1) {
displayValue = '0';
} else {
displayValue = displayValue.slice(0, -1);
}
updateDisplay();
}
backspace
函數首先檢查displayValue
的長度。如果長度為1,則將其設置為'0'
。slice
方法刪除最后一個字符,并更新displayValue
。updateDisplay
函數來更新顯示屏。為了方便起見,我們定義一個updateDisplay
函數來更新顯示屏上的值。
function updateDisplay() {
display.textContent = displayValue;
}
updateDisplay
函數將displayValue
的值設置為顯示屏的文本內容。最后,我們需要定義一個operate
函數來執行實際的數學運算。
function operate(a, b, operator) {
a = parseFloat(a);
b = parseFloat(b);
switch (operator) {
case '+':
return a + b;
case '-':
return a - b;
case '×':
return a * b;
case '÷':
return a / b;
default:
return b;
}
}
operate
函數接收兩個操作數和一個運算符作為參數,并根據運算符執行相應的數學運算。parseFloat
將字符串轉換為浮點數,然后使用switch
語句根據運算符執行相應的操作。以下是完整的HTML、CSS和JavaScript代碼:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JavaScript計算器</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="calculator">
<div class="display" id="display">0</div>
<div class="buttons">
<button class="btn clear" id="clear">C</button>
<button class="btn backspace" id="backspace">←</button>
<button class="btn operator" id="divide">÷</button>
<button class="btn operator" id="multiply">×</button>
<button class="btn number" id="seven">7</button>
<button class="btn number" id="eight">8</button>
<button class="btn number" id="nine">9</button>
<button class="btn operator" id="subtract">-</button>
<button class="btn number" id="four">4</button>
<button class="btn number" id="five">5</button>
<button class="btn number" id="six">6</button>
<button class="btn operator" id="add">+</button>
<button class="btn number" id="one">1</button>
<button class="btn number" id="two">2</button>
<button class="btn number" id="three">3</button>
<button class="btn equals" id="equals">=</button>
<button class="btn number zero" id="zero">0</button>
<button class="btn decimal" id="decimal">.</button>
</div>
</div>
<script src="script.js"></script>
</body>
</html>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #f0f0f0;
font-family: Arial, sans-serif;
}
.calculator {
width: 300px;
background-color: #333;
border-radius: 10px;
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5);
overflow: hidden;
}
.display {
background-color: #222;
color: #fff;
font-size: 2.5em;
text-align: right;
padding: 20px;
box-sizing: border-box;
height: 80px;
display: flex;
align-items: center;
justify-content: flex-end;
}
.buttons {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 1px;
}
.btn {
background-color: #444;
color: #fff;
border: none;
font-size: 1.5em;
padding: 20px;
cursor: pointer;
transition: background-color 0.2s;
}
.btn:hover {
background-color: #555;
}
.btn:active {
background-color: #666;
}
.btn.operator {
background-color: #ff9500;
}
.btn.operator:hover {
background-color: #ffaa33;
}
.btn.operator:active {
background-color: #cc7700;
}
.btn.equals {
background-color: #ff2d55;
grid-column: span 2;
}
.btn.equals:hover {
background-color: #ff4d6a;
}
.btn.equals:active {
background-color: #cc2244;
}
.btn.clear {
background-color: #ff3b30;
}
.btn.clear:hover {
background-color: #ff5c52;
}
.btn.clear:active {
background-color: #cc3026;
}
.btn.backspace {
background-color: #ff9500;
}
.btn.backspace:hover {
background-color: #ffaa33;
}
.btn.backspace:active {
background-color: #cc7700;
}
.btn.zero {
grid-column: span 2;
}
”`javascript let displayValue = ‘0’; let firstOperand = null; let secondOperand = null; let currentOperator = null; let shouldResetDisplay = false;
const display = document.getElementById(‘display’); const numberButtons = document.querySelectorAll(‘.number’); const operatorButtons = document.querySelectorAll(‘.operator’); const clearButton = document.getElementById(‘clear’); const backspaceButton = document.getElementById(‘backspace’); const decimalButton = document.getElementById(‘decimal’); const equalsButton = document.getElementById(‘equals’);
numberButtons.forEach(button => { button.addEventListener(‘click’, () => { appendNumber(button.textContent); }); });
operatorButtons.forEach(button => { button.addEventListener(‘click’, () => { chooseOperator(button.textContent); }); });
clearButton.addEventListener(‘click’, clear); backspaceButton.addEventListener(‘click’, backspace); decimalButton.addEventListener(‘click’, appendDecimal); equalsButton.addEventListener(‘click’, calculate);
function appendNumber(number) { if (displayValue === ‘0’ || shouldResetDisplay) { displayValue = number; shouldResetDisplay = false; } else { displayValue += number; } updateDisplay(); }
function chooseOperator(operator) { if (currentOperator !== null) { calculate(); } firstOperand = displayValue; currentOperator = operator; shouldResetDisplay = true
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。