效果展示:
思路:
用html实现计算器的基本外观结构
用css设计每个部分的样式,颜色边框等
使用js实现计算的算法,DOM事件的反应。
知识点总结:
html部分:
- 结构分为上下两部分,上部分显示输出,下部分输入。
- 输出分为结果和记录。
- 表格的结构为table->tr->th
Js部分:
- 每次输入后都会有一次响应。
- 输入获取的当前字符。
- 有两个状态,状态1为输入第一个操作数和运算符,状态2为输入第二个操作数。
- 在状态1和状态2下输入数字,运算符,C,CE,小数点,负号,等于号,删除号等待分别该怎么响应?是否要切换状态,是否要清空记录。
- 小数和负数时遇到删除怎么操作。
- 合理使用全局变量和局部变量。
- 数组的使用:var I = new Array(); 它的方法有push(),pop(),length.
- 常用的一些静态方法:Math.floor(),Math.round(),Math.pow(),
- 把字符变成数字用Numeber()对象,它还有判断是否为整数,浮点数等静态方法。
- Document类下的获取id的方法,根据id来修改元素的属性和内容。
- 事件反应:点击,放上鼠标,移开鼠标等等。
- 在事件反应时用this传递id指针。
Css总结:
- 盒子的概念:一个元素由内容+内填充(透明的)+border(不透明)+外填充(透明)四部分构成。分别设计每个部分的属性。
- Table中让所有单元格合并border是,在在外面的border元素中设置border-collapse:collapse;
- 元素的width和height设置的是内部内容的大小,其他三部分默认设置。
- 颜色设置。
代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
table{
border-collapse:collapse;
}
th{
height: 80px;
width: 125px;
border: 1px solid #e6e6e6;
margin: 0px 0px 0px 0px;
padding:0px;
}
tr{
}
</style>
</head>
<body>
<div style="height:515px;width:500px;border:solid #dbdbdb;margin:auto;">
<div style="border: solid #dbdbdb; ">
<p id="output" style="height:30px;margin:0;width:480px;text-align:right;"></p>
<p id ="result" style="height:70px;margin:0;width:450px;font-size:400%;text-align:right;margin-bottom: 0px;">0</p>
</div>
<div style="height:400px;width:500px;">
<table style="height:400px width:500px">
<tr>
<th id="CE" onclick="i='CE';response();" onmouseover="style.background='#e6e6e6'" onmouseout="style.background='#ffffff'">CE</th><th id="C" onclick="i='C';response();"onmouseover="style.background='#e6e6e6'" onmouseout="style.background='#ffffff'">C</th><th id="#" onclick="i='#';response();"onmouseover="style.background='#e6e6e6'" onmouseout="style.background='#ffffff'"><img src="img/shanchu.png" alt=""></th><th id="/" onclick="i='/';response();"onmouseover="style.background='#e6e6e6'" onmouseout="style.background='#ffffff'"><img src="img/chuhao.png" alt=""></th>
</tr>
<tr>
<th id="i7" onclick="i='7';response();"onmouseover="style.background='#e6e6e6'" onmouseout="style.background='#ffffff'"><img src="img/icon-test_7.png" alt=""></th><th id="i8" onclick="i='8';response();"onmouseover="style.background='#e6e6e6'" onmouseout="style.background='#ffffff'"><img src="img/icon-test_8.png" alt=""></th><th id="i9" onclick="i='9';response();"onmouseover="style.background='#e6e6e6'" onmouseout="style.background='#ffffff'"><img src="img/icon-test_9.png" alt=""></th><th id="*" onclick="i='*';response();"onmouseover="style.background='#e6e6e6'" onmouseout="style.background='#ffffff'"><img src="img/chenghao.png" alt=""></th>
</tr>
<tr>
<th id="i4" onclick="i='4';response();"onmouseover="style.background='#e6e6e6'" onmouseout="style.background='#ffffff'"><img src="img/icon-test_4.png" alt=""></th><th id="i5" onclick="i='5';response();"onmouseover="style.background='#e6e6e6'" onmouseout="style.background='#ffffff'"><img src="img/icon-test_5.png" alt=""></th><th id="i6" onclick="i='6';response();"onmouseover="style.background='#e6e6e6'" onmouseout="style.background='#ffffff'"><img src="img/icon-test_6.png" alt=""></th><th id="-" onclick="i='-';response();"onmouseover="style.background='#e6e6e6'" onmouseout="style.background='#ffffff'"><img src="img/jianhao.png" alt=""></th>
</tr>
<tr>
<th id="i1" onclick="i='1';response();"onmouseover="style.background='#e6e6e6'" onmouseout="style.background='#ffffff'"><img src="img/icon-test.png" alt=""></th><th id="i2" onclick="i='2';response();"onmouseover="style.background='#e6e6e6'" onmouseout="style.background='#ffffff'"><img src="img/icon-test_2.png" alt=""></th><th id="i3" onclick="i='3';response();"onmouseover="style.background='#e6e6e6'" onmouseout="style.background='#ffffff'"><img src="img/icon-test_3.png" alt=""></th><th id="+" onclick="i='+';response();"onmouseover="style.background='#e6e6e6'" onmouseout="style.background='#ffffff'"><img src="img/jiahao.png" alt=""></th>
</tr>
<tr>
<th id="$" onclick="i='$';response();"onmouseover="style.background='#e6e6e6'" onmouseout="style.background='#ffffff'"><img src="img/jianhao.png" alt=""></th><th id="i0" onclick="i='0';response();"onmouseover="style.background='#e6e6e6'" onmouseout="style.background='#ffffff'"><img src="img/icon-test_1.png" alt=""></th><th id="." onclick="i='.';response();"onmouseover="style.background='#e6e6e6'" onmouseout="style.background='#ffffff'"><img src="img/xiaoshudian.png" alt=""></th><th id="=" onclick="i='=';response();"onmouseover="style.background='#e6e6e6'" onmouseout="style.background='#ffffff'"><img src="img/dengyu.png" alt=""></th>
</tr>
</table>
</div>
</div>
<script>
var i;
var opr1 = 0;
var opr2 = 0;
var sta=1;
var n1=1;
var tag1 = 0;
var n2=1;
var tag2 = 0;
var cache = new Array();
var s = 1;
function response(){
if(sta == 1){
if(i>='0' && i<='9'){
if(cache[0] == '='){
opr1 = 0;
cache.pop();
if(tag1 == 1 && opr1 >=0) opr1 = opr1 + Number(i) / Math.pow(10,n1++);
else if(tag1 == 1 && opr1 < 0)opr1 = opr1 - Number(i) / Math.pow(10,n1++);
else if(tag1 == 0 && opr1 >=0)opr1 = opr1 * 10 + Number(i);
else opr1 = opr1 * 10 - Number(i);
}
else {
if(tag1 == 1 && opr1 >=0) opr1 = opr1 + Number(i) / Math.pow(10,n1++);
else if(tag1 == 1 && opr1 < 0)opr1 = opr1 - Number(i) / Math.pow(10,n1++);
else if(tag1 == 0 && opr1 >=0)opr1 = opr1 * 10 + Number(i);
else opr1 = opr1 * 10 - Number(i);
}
document.getElementById("result").innerHTML = opr1;
}
else if(i == "$"){
opr1 = -opr1;
if(tag1 == 1 && Number.isInteger(opr1))document.getElementById("result").innerHTML = opr1.toString() + ".";
else document.getElementById("result").innerHTML = opr1;
}
else if(i == "#" && cache[0] != "="){
if(Number.isInteger(opr1)){
if(tag1 == 1)tag1=0;
else if(tag1==0 && opr1>=0)opr1 = Math.floor(opr1 / 10);
else if(tag1==0 && opr1 < 0)opr1 = Math.round(opr1 / 10);
}
else{
if(opr1 >= 0){
var a = (opr1 - Math.floor(opr1)) * Math.pow(10,n1-2);
opr1 = Math.floor(opr1) + (Math.floor(a) / Math.pow(10, n1-2));
n1--;
}
else{
opr1 = -1 * opr1;
var a = (opr1 - Math.floor(opr1)) * Math.pow(10,n1-2);
opr1 = Math.floor(opr1) + (Math.floor(a) / Math.pow(10, n1-2));
n1--;
opr1 = -1 * opr1;
}
}
if(tag1 == 1 && Number.isInteger(opr1))document.getElementById("result").innerHTML = opr1.toString() + ".";
else document.getElementById("result").innerHTML = opr1;
}
else if(i == '.'){
tag1 = 1;
if(Number.isInteger(opr1))document.getElementById("result").innerHTML = (opr1.toString() + ".");
}
else if(i=='+' || i=='-' || i=='*' || i=='/'){
if(cache[0] == '=')cache.pop();
op = i;
sta = 2;
n1 = 1;
tag1 = 0;
cache[cache.length] = opr1.toString();
cache[cache.length] = i;
var outputs ="";
for(j = 0;j<cache.length;j++){outputs = outputs + cache[j];}
document.getElementById("output").innerHTML = outputs;
}
else if(i == "="){
while(cache.length!=0)cache.pop();
document.getElementById("output").innerHTML = "";
document.getElementById("result").innerHTML = opr1;
cache.push('=');
n1=1;
tag1 = 0;
}
else if(i == 'C' || i == "CE"){
n1=1;
tag1 = 0;
while(cache.length!=0)cache.pop();
opr1=0;
document.getElementById("output").innerHTML = "";
document.getElementById("result").innerHTML = opr1;
}
}
else if(sta == 2){
if(i>='0' && i<='9'){
s = 0;
if(tag2 == 1 && opr2 >=0) opr2 = opr2 + Number(i) / Math.pow(10,n2++);
else if(tag2 == 1 && opr2 < 0)opr2 = opr2 - Number(i) / Math.pow(10,n2++);
else if(tag2 == 0 && opr2 >=0)opr2 = opr2 * 10 + Number(i);
else opr2 = opr2 * 10 - Number(i);
document.getElementById("result").innerHTML = opr2;
}
else if(i == "$"){
opr2 = -opr2;
if(tag2 == 1 && Number.isInteger(opr2))document.getElementById("result").innerHTML = opr2.toString() + ".";
else document.getElementById("result").innerHTML = opr2;
}
else if(i == "."){
tag2 = 1;
if(Number.isInteger(opr2))document.getElementById("result").innerHTML = opr2.toString() + ".";
}
else if(i == "#" && s==0){
if(Number.isInteger(opr2)){
if(tag2 == 1)tag2=0;
else if(tag2==0 && opr2>=0)opr2 = Math.floor(opr2 / 10);
else if(tag2==0 && opr2 < 0)opr2 = Math.round(opr2 / 10);
}
else{
if(opr2 >= 0){
var a = (opr2 - Math.floor(opr2)) * Math.pow(10,n2-2);
opr2 = Math.floor(opr2) + (Math.floor(a) / Math.pow(10, n2-2));
n2--;
}
else{
opr2 = -1 * opr2;
var a = (opr2 - Math.floor(opr2)) * Math.pow(10,n2-2);
opr2 = Math.floor(opr2) + (Math.floor(a) / Math.pow(10, n2-2));
n2--;
opr2 = -1 * opr2;
}
}
if(tag2 == 1 && Number.isInteger(opr2))document.getElementById("result").innerHTML = opr1.toString() + ".";
else document.getElementById("result").innerHTML = opr2;
}
else if(i=='+' || i=='-' || i=='*' || i=='/'){
if(s==1){
if(i == cache[cache.length-1]){}
else {
cache[cache.length-1] = i;
var outputs="";
for(j = 0;j<cache.length;j++){
outputs = outputs + cache[j];
}
document.getElementById("output").innerHTML = outputs;
}
}
else{
switch (cache[cache.length-1]) {
case '+':
opr1 = opr1 + opr2;
break;
case '*':
opr1 = opr1 * opr2;
break;
case '-':
opr1 = opr1 - opr2;
break;
case '/':
opr1 = opr1 / opr2;
break;
default:
break;
}
cache.push(opr2.toString());
cache.push(i);
var outputs ="";
for(j = 0;j<cache.length;j++){
outputs = outputs + cache[j];
}
document.getElementById("output").innerHTML = outputs;
document.getElementById("result").innerHTML = opr1;
opr2 = 0;
tag2 = 0;
n2 = 1;
s=1;
}
}
else if(i == "="){
switch (cache[cache.length-1]) {
case '+':
opr1 = opr1 + opr2;
break;
case '*':
opr1 = opr1 * opr2;
break;
case '-':
opr1 = opr1 - opr2;
break;
case '/':
opr1 = opr1 / opr2;
break;
default:
break;
}
while(cache.length!=0)cache.pop();
document.getElementById("output").innerHTML = "";
document.getElementById("result").innerHTML = opr1;
opr2 = 0;
sta = 1;
cache.push('=');
tag2 = 0;
n2 = 1;
}
else if(i == 'C'){
while(cache.length!=0)cache.pop();
opr1=0;
opr2=0;
document.getElementById("output").innerHTML = "";
document.getElementById("result").innerHTML = opr1;
sta = 1;
tag2 = 0;
n2 = 1;
}
else if(i == "CE"){
opr2 = 0;
tag2 = 0;
n2 = 1;
var outputs ="";
for(j = 0;j<cache.length;j++){
outputs = outputs + cache[j];
}
document.getElementById("output").innerHTML = outputs;
document.getElementById("result").innerHTML = opr2;
}
}
}
</script>
</body>
</html>