目錄
- 效果展示
- 完整代碼
-
- HTML/PHP代碼:calculator.html
- css代碼:calculator.css
- js代碼:calculator.js
- 思考總結
-
- 關于html
- 關于js
- 關于css
效果展示
可以實作的計算功能包含:
All clear 、 clear 、百分比 、加 、 減 、乘 、除 、取負數 、小數
完整代碼
代碼結構
HTML/PHP代碼:calculator.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>php/html+css+js制作電腦</title>
<link rel="stylesheet" href="css/calculator.css">
</head>
<body>
<!-- 電腦 -->
<div id="calculator">
<table>
<!-- 顯示區 -->
<tr id="display">
<td align="center" colspan="4"><input type="text" readonly="readonly" value="0" id="note"></td>
</tr>
<!-- 按鈕區 -->
<tr class="func">
<td align="center" ;><input type="button" class="btno" value="AC" id="aclear" onclick="clearNote(this)"></td>
<td align="center" ;><input type="button" class="btno" value="+/-" onclick="negate(this)"></td>
<td align="center" ;><input type="button" class="btno" value="%" onclick="percent()"></td>
<td align="center" ;><input type="button" class="btno" value="÷" onclick="operationShow(this)"></td>
</tr>
<tr>
<td align="center" ;><input type="button" class="btn" value="7" onclick="countSHow(this)"></td>
<td align="center" ;><input type="button" class="btn" value="8" onclick="countSHow(this)"></td>
<td align="center" ;><input type="button" class="btn" value="9" onclick="countSHow(this)"></td>
<td align="center" class="func"><input type="button" class="btno" value="×" onclick="operationShow(this)"></td>
</tr>
<tr>
<td align="center" ;><input type="button" class="btn" value="4" onclick="countSHow(this)"></td>
<td align="center" ;><input type="button" class="btn" value="5" onclick="countSHow(this)"></td>
<td align="center" ;><input type="button" class="btn" value="6" onclick="countSHow(this)"></td>
<td align="center" class="func"><input type="button" class="btno" value="-" onclick="operationShow(this)"></td>
</tr>
<tr>
<td align="center" ;><input type="button" class="btn" value="1" onclick="countSHow(this)"></td>
<td align="center" ;><input type="button" class="btn" value="2" onclick="countSHow(this)"></td>
<td align="center" ;><input type="button" class="btn" value="3" onclick="countSHow(this)"></td>
<td align="center" class="func"><input type="button" class="btno" value="+" onclick="operationShow(this)"></td>
</tr>
<tr>
<td align="center" colspan="2"><input type="button" class="btn0" value="0" onclick="countSHow(this)"></td>
<td align="center" ;><input type="button" class="btn" value="." onclick="dot(this)"></td>
<td align="center" class="func"><input type="button" class="btno" value="=" onclick="result(this)"></td>
</tr>
</table>
</div><!-- calculator -->
<!-- 電腦的js代碼 -->
<script src="js/calculator.js"></script>
</body>
</html>
css代碼:calculator.css
* {
margin: 0px;
}
input {
width: 50px;
height: 50px;
border: 1px solid black;;
}
#calculator {
display: block;
width: 200px;
height: 300px;
position: relative;
top: 250px;
margin: auto;
}
/* td{
border: 1px solid black;
} */
#display {
width: 200px;
/* border: 1px solid black; */
background-color: #000000;
}
#note {
width: 190px;
height: 50px;
background-color: #000000;
color: white;
font-size: 18px;
text-align: right;
}
.btn {
background-color: rgb(92, 88, 88);
border-radius: 0px;
border: 1px solid black;
}
.btn0 {
width: 100px;
background-color: rgb(92, 88, 88);
border-radius: 0px;
/* border: 1px solid black; */
}
.btno {
border-radius: 0px;
/* border: 1px solid black; */
background-color: yellow;
}
js代碼:calculator.js
/*
* @Author: caesarding
* @Date: 2020-04-05 16:51:37
* @Last Modified by: dingtao
* @Last Modified time: 2020-04-08 19:10:25
*/
/*
簡易電腦--2.0:
1.限制最小數和最大數的長度。
2.實作添加小數點和去除小數點
3.數字鍵能累積顯示,結果可以累積運算(修複累加結果錯誤)
4.初次運算,運算符後沒有數字實行預設加0操作
6.禁止使用者使用非法違規操作
7.可以切換運算符(修複連續重複使用功能鍵導緻num1被清零的bug)
*/
num1 = 0; //儲存第一值
num2 = 0; //儲存第二值
op = ""; //儲存運算符
opresult = 0; //儲存結果,用于連續計算
// flag = false; //判斷是否為得出結果後的再次運算 用aclear.value的值進行簡化替代flag 太麻煩了 還是不變了
flag = false; //判斷是否重新開始運算 true為允許計算
isprotect = false; //判斷電腦是否處于保護狀态
// 螢幕顯示字元串
opScreen = document.getElementById("note");
aclear = document.getElementById("aclear");
//螢幕數字按鈕功能
function countSHow(n) {
//是否重新開始運算
if (flag) {
// alert("已經為您重新開始計算!正在清空所有儲存器!");
clearNote(AC); //清楚寄存器
flag = false; //切換繼續運算模式
}
// 輸入長度限制
if (opScreen.value.length > 12) {
alert("對不起!太長啦!我記不住啦!😣😣😣");
// opScreen.value = "0";
} else {
if (opScreen.value == "0") {
// opScreen.value == "除數不為0" ||
// opScreen.value == "超出運算範圍" ||
// opScreen.value == "非法輸入" 等結果隻允許AC操作
opScreen.value = n.value; //清楚螢幕,擷取第一個數字
isprotect = false;
} else {
opScreen.value += n.value; //追加數字
};
}
aclear.value = "C"; //改變ac到c
}
//點功能
function dot() {
if (isprotect) {
alert("你在幹嘛啊?你怎麼又欺負我呀?☹☹☹");
opScreen.value = "非法輸入";
} else{
var screenText = opScreen.value;
if (screenText.indexOf(".") < 0) {
opScreen.value += ".";
}
//實作重複按點取消點
var i = screenText.length;
if (screenText.substring(i-1)==".") {
opScreen.value = screenText.substring(0,i-1);
}
{
// opScreen.value -= ".";
// alert("你又點我幹嘛!😡😡😡");
}
}
}
//一按運算符,電腦頂部顯示運算過程,并更新num1和運算符
function operationShow(o) {
if (isprotect) {
alert("你在幹嘛啊?你怎麼又欺負我呀?☹☹☹");
opScreen.value = "非法輸入";
} else {
if(opScreen.value!=0){//保護num1,防止多次輸入運算符導緻資料丢失
num1 = parseFloat(opScreen.value);
//通過flag可以保證,不輸入時num1含有預設值0,而不是延用上次運算結果
}
flag = false;
op = o.value;
opScreen.value = "0";
}
}
/*等于,計算并在顯示屏輸出結果*/
function result() {
if (isprotect) {
clearNote(AC);
} else {
if (flag) { //解決電腦不能連續運算問題
num1 = parseFloat(opScreen.value);
} else {
num2 = parseFloat(opScreen.value); //計算num2的值
}
switch (op) {
case "÷":
opresult = divide(num1, num2);
break;
case "×":
opresult = times(num1, num2);
break;
case "+":
opresult = plus(num1, num2);
break;
case "-":
opresult = minus(num1, num2);
break;
default:
opresult = plus(num1, num2);
}
//輸出結果
flag = true; //允許重新運算
aclear.value = "AC";
if (opScreen.value.length > 10) {
alert("對不起,太大了!我手指不夠用啦😭😭😭");
opresult = "超出運算範圍";
isprotect = true; //保護電腦并中斷運算
}
opScreen.value = opresult;
console.log("opScreen.value.length=", opScreen.value.length);
}
}
/*加*/
function plus(x, y) {
return parseFloat(x) + parseFloat(y);
}
/*減*/
function minus(x, y) {
return x - y;
}
/*乘*/
function times(x, y) {
return x * y;
}
/*除*/
function divide(x, y) {
if (y == "0") {
alert("求你不要開除我好不好😢😢😢");
return "除數不能為0";
} else {
return x / y;
}
}
/*百分号*/
function percent() {
if (isprotect) {
alert("你在幹嘛啊?你怎麼又欺負我呀?☹☹☹");
opScreen.value = "非法輸入";
} else {
opScreen.value = opScreen.value / 100;
}
}
/*取負數*/
function negate() {
if (isprotect) {
alert("你在幹嘛啊?你怎麼又欺負我呀?☹☹☹");
opScreen.value = "非法輸入";
} else {
opScreen.value = -opScreen.value;
}
}
/*重置*/
// 重要!
// clear是js的内置函數,如果clearNote命名為clear時,則會出現沒有任和報錯的錯誤!!
function clearNote(c) {
if (c.value == "AC") {
opScreen.value = "0";
num1 = 0;
num2 = 0;
op = "";
opresult = 0;
flag = false;
isprotect = false;
} else {
opScreen.value = "0";
}
}
// function roundFun(value, n) {
// return Math.round(value * Math.pow(10, n)) / Math.pow(10, n);
// }
/*
* @Author: caesarding
* @Date: 2020-04-05 16:51:37
* @Last Modified by: dingtao
* @Last Modified time: 2020-04-05 16:51:37
*/
/*
簡易電腦--1.0:
*/
num1 = 0; //儲存第一值
num2 = 0; //儲存第二值
op = ""; //儲存運算符
opresult = 0; //儲存結果,用于連續計算
// flag = false; //判斷是否為得出結果後的再次運算 用aclear.value的值進行簡化替代flag 太麻煩了 還是不變了
flag = false;
// 螢幕顯示字元串
opScreen = document.getElementById("note");
aclear = document.getElementById("aclear")
/*按數字的螢幕顯示控制:如果螢幕顯示是0,按n替換為n,顯示不為0則追加字元 */
function countSHow(n) {
//是否重新開始運算
if (flag) {
clearNote(aclear.value);
flag = false;
}
// 字元串長度限制
if (opScreen.value.length > 20) {
alert("超過限制!請重新輸入");
opScreen.value = "0";
} else {
if (opScreen.value == "0" || opScreen.value == num1 || opScreen.value == "除數不為0") {
opScreen.value = n.value;
} else {
opScreen.value += n.value;
};
}
//改變ac到c
aclear.value = "C";
}
/*按點時的螢幕顯示控制:已存在'.',則不加'.',否則追加'.'*/
function dot() {
var screenText = opScreen.value;
if (screenText.indexOf(".") < 0) {
opScreen.value += ".";
} else {
alert("wrong input");
}
}
//一按運算符,電腦頂部顯示運算過程,并更新num1和運算符
function operationShow(o) {
flag = false;
num1 = parseFloat(opScreen.value);
op = o.value;
opScreen.value = "0";
}
/*等于,計算并在顯示屏輸出結果*/
function result() {
num2 = parseFloat(opScreen.value);
switch (op) {
case "÷":
opresult = divide(num1, num2);
break;
case "×":
opresult = times(num1, num2);
break;
case "+":
opresult = plus(num1, num2);
break;
case "-":
opresult = minus(num1, num2);
break;
default:
opresult = plus(num1, num2);
}
opScreen.value = opresult;
flag = true; //判斷是否繼續運算
aclear.value = "AC";
}
/*加*/
function plus(x, y) {
return parseFloat(x) + parseFloat(y);
}
/*減*/
function minus(x, y) {
return x - y;
}
/*乘*/
function times(x, y) {
return x * y;
}
/*除*/
function divide(x, y) {
if (y == "0") {
return "除數不為0";
} else {
return x / y;
}
}
/*百分号*/
function percent() {
opScreen.value = opScreen.value / 100;
}
/*取負數*/
function negate() {
opScreen.value = -opScreen.value;
}
/*重置*/
// 重要!
// clear是js的内置函數,如果clearNote命名為clear時,則會出現沒有任和報錯的錯誤!!
function clearNote(c) {
if (c.value == "AC") {
opScreen.value = "0";
num1 = 0;
num2 = 0;
op = "";
opresult = 0;
} else {
opScreen.value = "0";
}
}
思考總結
關于html
-
的位置一定要放在最後,否則可能會出現的錯誤如下<script src="../js/calculator.js"> </script>
Uncaught TypeError: Cannot read property ‘value’ of null
at countSHow (calculator.js:27)
at HTMLInputElement.onclick (main.php:42)
問題出在JS運作的時候你的頁面還沒有加載完成,是以你的JS代碼找不到你的頁面元素,就會抛出這個問題。解決辦法就是把JavaScript代碼放在body的最後。
- 标簽的align屬性
- 标簽的readonly屬性
- 标簽下面的colspan(跨列)和rowspan(跨行)屬性
關于js
- 注意函數命名不要使用内置函數!例如:clear。否則則會出現沒有任和報錯的錯誤現象,即函數無法正常調用。ps:clear函數作用是清除指定文檔的内容。
關于css
- 設定input内容的顔色
- 設定按鈕樣式