用css3和javascript做的一个简单的计算器

这个计算器的算法比较简单,主要是为每一个键添加单击事件,然后根据单击的键来进行相应的判断和处理就可以了。在css3方面,主要用的是box-shadow和border-radius和线性渐变等效果.

在这里还用到了一个比较陌生的user-select,表示文本不能被选中,就是说下面的数字文本不能被选中。

效果演示

下面贴出代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>caculator</title>
<style>
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
    font: bold 14px Arial, sans-serif;
}

html {
    height: 100%;
    background: white;
    background: radial-gradient(circle, #fff 20%, #ccc);
    background-size: cover;
}

#calculator {
    width: 325px;
    height: auto;
    margin: 100px auto;
    padding: 20px 20px 9px;
    background: #9dd2ea;
    background: linear-gradient(#9dd2ea, #8bceec);
    border-radius: 3px;
    box-shadow: 0px 4px #009de4, 0px 10px 15px rgba(0, 0, 0, 0.2);
}

.top span.clear {
    float: left;
}

.top .screen {
    height: 40px;
    width: 212px;
    float: right;
    padding: 0 10px;
    background: rgba(0, 0, 0, 0.2);
    border-radius: 3px;
    box-shadow: inset 0px 4px rgba(0, 0, 0, 0.2);
    font-size: 17px;
    line-height: 40px;
    color: white;
    text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
    text-align: right;
    letter-spacing: 1px;
}

.keys, .top {overflow: hidden;}

.keys span, .top span.clear {
    float: left;
    position: relative;
    top: 0;
    cursor: pointer;
    width: 66px;
    height: 36px;
    background: white;
    border-radius: 3px;
    box-shadow: 0px 4px rgba(0, 0, 0, 0.2);
    margin: 0 7px 11px 0;
    color: #888;
    line-height: 36px;
    text-align: center;
    -moz-user-select:  none;   
    -webkit-user-select:  none;     
    -ms-user-select:  none; 
    transition: all 0.2s ease;
}

.keys span.operator {
    background: #FFF0F5;
    margin-right: 0;
}

.keys span.eval {
    background: #f1ff92;
    box-shadow: 0px 4px #9da853;
    color: #888e5f;
}

.top span.clear {
    background: #ff9fa8;
    box-shadow: 0px 4px #ff7c87;
    color: white;
}

.keys span:hover {
    background: #9c89f6;
    box-shadow: 0px 4px #6b54d3;
    color: white;
}

.keys span.eval:hover {
    background: #abb850;
    box-shadow: 0px 4px #717a33;
    color: #ffffff;
}

.top span.clear:hover {
    background: #f68991;
    box-shadow: 0px 4px #d3545d;
    color: white;
}

.keys span:active {
    box-shadow: 0px 0px #6b54d3;
    top: 4px;
}

.keys span.eval:active {
    box-shadow: 0px 0px #717a33;
    top: 4px;
}

.top span.clear:active {
    top: 4px;
    box-shadow: 0px 0px #d3545d;
}

</style>

</head>

<body>
<div id="calculator">
    <div class="top">
        <span class="clear">C</span>
        <div class="screen"></div>
    </div>
    
    <div class="keys">
        <span>7</span>
        <span>8</span>
        <span>9</span>
        <span class="operator">+</span>
        <span>4</span>
        <span>5</span>
        <span>6</span>
        <span class="operator">-</span>
        <span>1</span>
        <span>2</span>
        <span>3</span>
        <span class="operator">÷</span>
        <span>0</span>
        <span>.</span>
        <span class="eval">=</span>
        <span class="operator">x</span>
    </div>
</div>
<script>
// 获取所有的键盘元素
var keys = document.querySelectorAll('#calculator span');
var operators = ['+', '-', 'x', '÷'];
var decimalAdded = false;//用来判断是否有非法的小数点

//为每个键添加单击事件
for(var i = 0; i < keys.length; i++) {
    keys[i].onclick = function(e) {
        var input = document.querySelector('.screen');
        var inputVal = input.innerHTML;
        var btnVal = this.innerHTML;
        //清空屏幕
        if(btnVal == 'C') {
            input.innerHTML = '';
            decimalAdded = false;
        }
        
        // 按下'='号,输出计数结果
        else if(btnVal == '=') {
            var equation = inputVal;
            var lastChar = equation[equation.length - 1];
            //把已输入字符中的乘号和除号换成程序可识别的'*'和'/'
            equation = equation.replace(/x/g, '*').replace(/÷/g, '/');
            //检查最后一个字符,如果是小数点则移除或者运算符,则移除
            if(operators.indexOf(lastChar) > -1 || lastChar == '.')
                equation = equation.replace(/.$/, '');
            //通过上面过滤了已输入的字符串后,计算结果
            if(equation)
                input.innerHTML = eval(equation);
                
            decimalAdded = false;
        }
        else if(operators.indexOf(btnVal) > -1) {//此时按下的是运算符
            var lastChar = inputVal[inputVal.length - 1];
            if(inputVal != '' && operators.indexOf(lastChar) == -1) //已输入的字符串都是数值
                input.innerHTML += btnVal;

            else if(inputVal == '' && btnVal == '-') 
                input.innerHTML += btnVal;//负数运算
            
            if(operators.indexOf(lastChar) > -1 && inputVal.length > 1) {
                //已输入的字符串中最后一个字符是运算符,则用新的运算符代替这个运算符
                input.innerHTML = inputVal.replace(/.$/, btnVal);
            }
            
            decimalAdded =false;
        }
        else if(btnVal == '.') {//按下了小数点符号
            if(!decimalAdded) {
                input.innerHTML += btnVal;
                decimalAdded = true;
            }
        }
        else {
            input.innerHTML += btnVal;
        }

        e.preventDefault();
    } 
}

</script>
</body>
</html>

 

posted @ 2013-03-13 21:32  Joy Ho  阅读(402)  评论(0编辑  收藏  举报