Revision:
<div class="wrapper">
<section class="screen">
<div class="previous" data-operand-previous></div>
<div class="current" data-operand-current></div>
</section>
<section class="calc-btn_row">
<div class="calc_btn_row">
<button class="calc_btn double" data-all-clear>C</button>
<button class="calc_btn" data-delete>←</button>
<button class="calc_btn" data-operation>÷</button>
</div>
<div class="calc_btn_row">
<button class="calc_btn" data-number>7</button>
<button class="calc_btn" data-number>8</button>
<button class="calc_btn" data-number>9</button>
<button class="calc_btn" data-operation>×</button>
</div>
<div class="calc_btn_row">
<button class="calc_btn" data-number>4</button>
<button class="calc_btn" data-number>5</button>
<button class="calc_btn" data-number>6</button>
<button class="calc_btn" data-operation>-</button>
</div>
<div class="calc_btn_row">
<button class="calc_btn" data-number>1</button>
<button class="calc_btn" data-number>2</button>
<button class="calc_btn" data-number>3</button>
<button class="calc_btn" data-operation>+</button>
</div>
<div class="calc_btn_row">
<button class="calc_btn" data-number>.</button>
<button class="calc_btn double" data-number>0</button>
<button class="calc_btn" data-equals>=</button>
</div>
</section>
</div>
<style>
.wrapper {max-width: 30vw; margin: 0 4vw; padding: 0 0; background-color: black; height:35vw;}
.screen { display: flex; flex-flow: column nowrap; background-color: darkgrey; min-height: 4vw; padding: 1vw; font-size: 2.5vw;
font-weight: bold; font-family: "Roboto", sans-serif; text-align: left;}
.screen .previous {font-size: 1.5vw; color: blue; word-wrap: break-word; word-break: break-all;}
.screen .current { font-size: 2.5vw; color: darkgreen; word-wrap: break-word; word-break: break-all;}
.calc_btn_row { display: flex; align-content: stretch; justify-content: space-between; margin-bottom: 0.5%;}
.calc_btn {background-color: orangered; color: black; font-family: "Roboto", sans-serif; font-weight: bold; font-size: 2.5vw;
border: none; height: 5vw; flex-basis: 24.5%; cursor: pointer; margin-left:0.1vw; }
.calc_btn:hover { background-color: #af4646;}
.calc_btn:active { background-color: #bbbcbe;}
.calc_btn:last-child { background-color: burlywood; color: brown;}
.calc_btn:last-child:hover {background-color: lightgrey;}
.double { flex-basis: 49.7%; }
</style>
<script>
const numberButtons = document.querySelectorAll("[data-number]");
const operationButtons = document.querySelectorAll("[data-operation]");
const equalsButton = document.querySelector("[data-equals]");
const deleteButton = document.querySelector("[data-delete]");
const allClearButton = document.querySelector("[data-all-clear]");
const currentScreenTextElement = document.querySelector( "[data-operand-current]");
const previousScreenTextElement = document.querySelector("[data-operand-previous]");
class Calculator {
constructor(currentScreenTextElement, previousScreenTextElement) {
this.currentScreenTextElement = currentScreenTextElement;
this.previousScreenTextElement = previousScreenTextElement;
this.clear();
}
clear() {
this.currentOperand = "";
this.previousOperand = "";
this.operation = null;
}
delete() {
this.currentOperand = this.currentOperand.toString().slice(0, -1);
}
appendNumber(number) {
if (number === "." && this.currentOperand.includes(".")) return;
this.currentOperand = this.currentOperand.toString() + number.toString();
}
flushOperator(operation) {
if (this.currentOperand === "") return;
if (this.previousOperand !== "") {
this.compute();
}
this.operation = operation;
this.previousOperand = this.currentOperand;
this.currentOperand = "";
}
compute() {
let computation;
const previous = parseFloat(this.previousOperand);
const current = parseFloat(this.currentOperand);
if (isNaN(previous) || isNaN(current)) return;
switch (this.operation) {
case "+":
computation = previous + current;
break;
case "-":
computation = previous - current;
break;
case "×":
computation = previous * current;
break;
case "÷":
computation = previous / current;
break;
default:
return;
}
this.currentOperand = computation;
this.previousOperand = "";
this.operation = undefined;
}
updateDisplay() {
this.currentScreenTextElement.innerText = this.currentOperand;
if (this.operation != null) {
this.previousScreenTextElement.innerText = `${this.previousOperand} ${this.operation}`;
}
}
}
const calculator = new Calculator(currentScreenTextElement, previousScreenTextElement );
numberButtons.forEach((button) => {
button.addEventListener("click", () => {
calculator.appendNumber(button.innerText);
calculator.updateDisplay();
});
});
operationButtons.forEach((button) => {
button.addEventListener("click", () => {
calculator.flushOperator(button.innerText);
calculator.updateDisplay();
});
});
equalsButton.addEventListener("click", () => {
calculator.compute();
calculator.updateDisplay();
});
allClearButton.addEventListener("click", () => {
calculator.clear();
calculator.updateDisplay();
});
deleteButton.addEventListener("click", () => {
calculator.delete();
calculator.updateDisplay();
});
</script>
code:
<div class="formstyle">
<form name = "form1">
<!-- This input box shows the button pressed by the user in calculator. -->
<input id = "calc" type ="text" name = "answer"> <br> <br>
<!-- Display the calculator button on the screen. -->
<!-- onclick() function display the number prsses by the user. -->
<input type = "button" value = "1" onclick = "form1.answer.value += '1' ">
<input type = "button" value = "2" onclick = "form1.answer.value += '2' ">
<input type = "button" value = "3" onclick = "form1.answer.value += '3' ">
<input type = "button" value = "+" onclick = "form1.answer.value += '+' ">
<br> <br>
<input type = "button" value = "4" onclick = "form1.answer.value += '4' ">
<input type = "button" value = "5" onclick = "form1.answer.value += '5' ">
<input type = "button" value = "6" onclick = "form1.answer.value += '6' ">
<input type = "button" value = "-" onclick = "form1.answer.value += '-' ">
<br> <br>
<input type = "button" value = "7" onclick = "form1.answer.value += '7' ">
<input type = "button" value = "8" onclick = "form1.answer.value += '8' ">
<input type = "button" value = "9" onclick = "form1.answer.value += '9' ">
<input type = "button" value = "*" onclick = "form1.answer.value += '*' ">
<br> <br>
<input type = "button" value = "/" onclick = "form1.answer.value += '/' ">
<input type = "button" value = "0" onclick = "form1.answer.value += '0' ">
<input type = "button" value = "." onclick = "form1.answer.value += '.' ">
<!-- When we click on the '=' button, the onclick() shows the sum results on the calculator screen. -->
<input type = "button" value = "=" onclick = "form1.answer.value = eval(form1.answer.value) ">
<br>
<!-- Display the Cancel button and erase all data entered by the user. -->
<input type = "button" value = "Clear All" onclick = "form1.answer.value = ' ' " id= "clear1" >
<br>
</form>
</div>
<style>
#clear1{width: 20vw; border: 0.2vw solid gray; border-radius: 0.3vw; padding: 0.5vw; background-color: orangered;cursor:pointer;}
.formstyle{width: 22vw; height: 36vw; margin: auto; border: 0.3vw outset dodgerblue; border-radius: 0.5vw; padding: 2vw;}
input {width: 4.25vw; background-color: burlywood;
color: black; border: 0.3vw solid black; border-radius: .5vw; padding: 1.5vw; margin: 0.4vw; font-size: 1.5vw;}
#calc{width: 17.5vw; border: .5vw solid black; border-radius: .3vw; padding: 1vw; margin: auto;}
</style>
example: calculator
0
<div class="container">
<div class="calculator-a">
<div class="output">
<pre id="upper"></pre>
<pre id="lower">0</pre>
</div>
<div class="input">
<button onclick="pressAllClear()">AC</button>
<button onclick="pressNum(this)">0</button>
<button onclick="pressClear()">Clear<i class="fas fa-backspace"></i></button>
<button onclick="pressOperator(this)">+</button>
<button onclick="pressNum(this)">1</button>
<button onclick="pressNum(this)">2</button>
<button onclick="pressNum(this)">3</button>
<button onclick="pressOperator(this)">-</button>
<button onclick="pressNum(this)">4</button>
<button onclick="pressNum(this)">5</button>
<button onclick="pressNum(this)">6</button>
<button onclick="pressOperator(this)">×</button>
<button onclick="pressNum(this)">7</button>
<button onclick="pressNum(this)">8</button>
<button onclick="pressNum(this)">9</button>
<button onclick="pressOperator(this)">÷</button>
<button onclick="pressDot()">.</button>
<button onclick="pressBracket(this)">(</button>
<button onclick="pressBracket(this)">)</button>
<button onclick="pressEqual()">=</button>
</div>
</div>
</div>
<style>
.container {display: flex; justify-content: center; align-items: center; height: 55vh; width: 30vw;background-color: #4e4e4e;}
.calculator-a {background: burlywood; border-radius: .5vw; padding: .5vw; width: 25vw; min-width: 15vw;
box-shadow: inset .2vw .2vw .5vw rgba(255, 255, 255, 0.4), .4vw .4vw 1vw rgba(0, 0, 0, 0.7);}
.output { display: flex; flex-direction: column; align-items: flex-end; position: relative; background: aliceblue;
min-height: 3vw; padding: .3vw; margin: 0 .1vw 1vw; border-radius: 0.25vw; box-shadow: inset .1vw .1vw .5vw rgba(0, 0, 0, 0.5);}
.output pre {text-align: right; font-size: 1.5vw; margin: 0; font-family: 'Orbitron', sans-serif; width: 24vw; overflow-x: auto;
-ms-overflow-style: none; scrollbar-width: none;}
.output pre::-webkit-scrollbar {display: none;}
.output #upper {color: #424242; font-size: 1.8vw;}
.input {display: flex; flex-wrap: wrap; justify-content: space-between;}
.input button {width: calc(25% - 2vw); height: 2.5vw; margin: .4vw 0.8vw; border-radius: 50%; background-color: #c05d5d;
box-shadow: inset .1vw .1vw .2vw rgba(255, 255, 255, 0.3), .1vw .1vw .5vw rgba(94, 31, 31, 0.7); color: white;
font-size: 1vw; font-weight: bold; cursor: pointer; outline: none; border: none;}
.input button:hover {background-color: orangered;}
.input button:active {box-shadow: inset .1vw .1vw 1vw blue, inset -.1vw -.1vw .2vw rgba(255, 255, 255, 0.3); color: green; }
</style>
<script>
// upper output is for showing the expression
let outputUpper = document.querySelector('#upper');
// lower output is for showing the result
let outputLower = document.querySelector('#lower');
// function to get number input
function pressNum(e) {
if (outputLower.innerHTML === '0') {
outputLower.innerHTML = e.innerHTML;
} else {
outputLower.innerHTML += e.innerHTML;
}
}
// clear all
function pressAllClear() {
outputUpper.innerHTML = '';
outputLower.innerHTML = '0';
}
// clear one
function pressClear() {
outputLower.innerHTML = outputLower.innerHTML.slice(0, -1);
}
// calculate button
function pressEqual() {
let exp = outputLower.innerHTML;
outputUpper.innerHTML = exp;
exp = exp.replace(/×/g, '*').replace(/÷/g, '/');
let result;
try {
result = eval(exp);
// if decimal number more than 4 decimal places
if (result.toString().indexOf('.') !== -1) {
result = result.toFixed(4);
}
} catch (e) {
result = 'Error';
}
outputLower.innerHTML = result;
}
function pressOperator(e) {
// check last operator
let lastOperator = outputLower.innerHTML.slice(-1);
if (lastOperator.includes('+', '-', '×', '÷')) {
output.innerHTML = outputLower.innerHTML.slice(0, -1) + e.innerHTML;
} else {
outputLower.innerHTML += e.innerHTML;
}
}
function pressDot() {
outputLower.innerHTML += '.';
}
function pressBracket(e) {
outputLower.innerHTML += e.innerHTML;
}
// attach keyboard event
document.addEventListener('keydown', function (e) {
switch (e.key) {
case '0':
pressNum(document.querySelector('button:nth-child(2)'));
break;
case '1':
pressNum(document.querySelector('button:nth-child(5)'));
break;
case '2':
pressNum(document.querySelector('button:nth-child(6)'));
break;
case '3':
pressNum(document.querySelector('button:nth-child(7)'));
break;
case '4':
pressNum(document.querySelector('button:nth-child(9)'));
break;
case '5':
pressNum(document.querySelector('button:nth-child(10)'));
break;
case '6':
pressNum(document.querySelector('button:nth-child(11)'));
break;
case '7':
pressNum(document.querySelector('button:nth-child(13)'));
break;
case '8':
pressNum(document.querySelector('button:nth-child(14)'));
break;
case '9':
pressNum(document.querySelector('button:nth-child(15)'));
break;
case '+':
pressOperator(document.querySelector('button:nth-child(4)'));
break;
case '-':
pressOperator(document.querySelector('button:nth-child(8)'));
break;
case '*':
pressOperator(document.querySelector('button:nth-child(12)'));
break;
case '/':
pressOperator(document.querySelector('button:nth-child(16)'));
break;
case '.':
pressDot();
break;
case '(':
pressBracket(document.querySelector('button:nth-child(18)'));
break;
case ')':
pressBracket(document.querySelector('button:nth-child(19)'));
break;
case 'Enter':
// prevent default action
e.preventDefault();
pressEqual();
break;
case 'Backspace':
pressClear();
break;
case 'Escape':
pressAllClear();
break;
}
});
</script>
Don't divide by zero
<div class="format">
<p class="warning">Don't divide by zero</p>
<div id="calculator4" class="calculator4">
<div id="viewer" class="viewer">0</div>
<button class="btn4 num" data-num="7">7</button>
<button class="btn4 num" data-num="8">8</button>
<button class="btn4 num" data-num="9">9</button>
<button data-ops="plus" class="btn4 ops">+</button>
<button class="btn4 num" data-num="4">4</button>
<button class="btn4 num" data-num="5">5</button>
<button class="btn4 num" data-num="6">6</button>
<button data-ops="minus" class="btn4 ops">-</button>
<button class="btn4 num" data-num="1">1</button>
<button class="btn4 num" data-num="2">2</button>
<button class="btn4 num" data-num="3">3</button>
<button data-ops="divided by" class="btn4 ops">/</button>
<button data-ops="times" class="btn4 ops">*</button>
<button class="btn4 num" data-num="0">0</button>
<button class="btn4 num" data-num=".">.</button>
<button id="equals" class="btn4 equals" data-result="">=</button>
<button id="clear4" class="btn4 clear4">C</button>
</div>
<button id="reset" class="btn4 reset">Reset Universe?</button>
</div>
<style>
.format{height: 80vh;}
/* Gradient text only on Webkit */
.warning {background: -webkit-linear-gradient(45deg, grey 10%, red 90%); background: linear-gradient(45deg, grey 10%, red 90%);
-webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; color: #8c5059;
font-weight: 600; font-size: 1.25vw; margin: 0 auto 3vw; max-width: 15vw;}
/* Calculator after dividing by zero */
.broken {-webkit-animation: broken 2s; animation: broken 2s; transform: translate3d(0, -200vw, 0); opacity: 0;}
/* viewer and keyboard */
#viewer {padding-left:1vw; color: blue; float: left; line-height: 3vw; text-align: left; text-overflow: ellipsis; border: 0.2vw solid green;
overflow: hidden; width: 23vw; height: 3vw;}
.calculator4 {font-size: 1.25vw; margin: 0 auto; width: 25vw;}
.calculator4::before, .calculator4::after {content: " "; display: table;}
.calculator4::after {clear: both; }
#clear4{width: 23vw; height: 3vw; background: red;}
.btn4 {border: 0; background: rgba(42, 50, 113, 0.28); color: darkblue; cursor: pointer; float: left; font: inherit; margin: 0.25vw; width: 5vw;
height: 5vw; transition: all 0.5s;}
.btn4:hover {background: green;}
.btn4:focus {outline: 0; /* The value fade-ins that appear */}
.btn4:focus::after {-webkit-animation: zoom 1s; animation: zoom 1s;-webkit-animation-iteration-count: 1; animation-iteration-count: 1;
-webkit-animation-fill-mode: both; animation-fill-mode: both; content: attr(data-num); cursor: default; font-size: 10vw;
position: absolute; top: 1.5vw; left: 50%; text-align: center; margin-left: -2.4vw; opacity: 0; width: 4.8vw; }
/* Same as above, modified for operators */
.ops:focus::after {content: attr(data-ops); margin-left: -21vw; width: 42vw;}
/* Same as above, modified for result */
.equals:focus::after {content: attr(data-result); margin-left: -30vw; width: 60vw;}
/* Reset button */
#reset { background: blue; color: orangered; font-weight: 400; padding: 0.5vw 1vw; position: relative; width: auto; height: auto; }
#reset:hover {background: green; color: white;}
#reset.show {top: 499vw; -webkit-animation: fadein 4s; animation: fadein 4s;}
/* Animations */
/* Values that appear onclick */
@-webkit-keyframes zoom {
0% {transform: scale(0.2); opacity: 1; }
70% {transform: scale(1);}
100% {opacity: 0;}
}
@keyframes zoom {
0% {transform: scale(0.2); opacity: 1; }
70% {transform: scale(1);}
100% {opacity: 0;}
}
/* Division by zero animation */
@-webkit-keyframes broken {
0% {transform: translate3d(0, 0, 0); opacity: 1;}
5% {transform: rotate(5deg);}
15% {transform: rotate(-5deg);}
20% {transform: rotate(5deg);}
25% {transform: rotate(-5deg);}
50% {transform: rotate(45deg);}
70% {transform: translate3d(0, 2000px, 0); opacity: 1;}
75% {opacity: 0;}
100% {transform: translate3d(0, -2000px, 0);}
}
@keyframes broken {
0% {transform: translate3d(0, 0, 0); opacity: 1;}
5% {transform: rotate(5deg);}
15% {transform: rotate(-5deg);}
20% {transform: rotate(5deg);}
25% {transform: rotate(-5deg);}
50% {transform: rotate(45deg);}
70% {transform: translate3d(0, 2000px, 0); opacity: 1;}
75% {opacity: 0;}
100% {transform: translate3d(0, -2000px, 0);}
}
/* Reset button fadein */
@-webkit-keyframes fadein {
0% {top: 499vw; opacity: 0;}
50% {opacity: 0;}
100% {opacity: 1;}
}
@keyframes fadein {
0% {top: 499vw; opacity: 0;}
50% {opacity: 0;}
100% {opacity: 1;}
}
@media (min-width: 420px) {
.calculator {width: 12vw;}
.viewer {width: 8.5vw;}
.btn4 {margin: 0.5vw;}
}
</style>
<script>
(function() {
"use strict";
// Shortcut to get elements
var el = function(element) {
if (element.charAt(0) === "#") { // If passed an ID...
return document.querySelector(element); // ... returns single element
}
return document.querySelectorAll(element); // Otherwise, returns a nodelist
};
// Variables
var viewer = el("#viewer"), equals = el("#equals"), nums = el(".num"), ops = el(".ops"), theNum = "", oldNum = "", resultNum, operator;
// When number is clicked, get the current number selected
var setNum = function() {
if (resultNum) {
theNum = this.getAttribute("data-num");
resultNum = "";
} else {
theNum += this.getAttribute("data-num");
}
viewer.innerHTML = theNum;
};
// When an operator is clicked, pass number to oldNum and save operator
var moveNum = function() {
oldNum = theNum;
theNum = "";
operator = this.getAttribute("data-ops");
equals.setAttribute("data-result", "");
};
// When equals is clicked, calculate result
var displayNum = function() {
// Convert string input to numbers
oldNum = parseFloat(oldNum);
theNum = parseFloat(theNum);
// Perform operation
switch (operator) {
case "plus":
resultNum = oldNum + theNum;
break;
case "minus":
resultNum = oldNum - theNum;
break;
case "times":
resultNum = oldNum * theNum;
break;
case "divided by":
resultNum = oldNum / theNum;
break;
// If equal is pressed without an operator, keep number and continue
default:
resultNum = theNum;
}
// If NaN or Infinity returned
if (!isFinite(resultNum)) {
if (isNaN(resultNum)) {
resultNum = "You broke it!";
} else {
resultNum = "Look at what you've done";
el('#calculator4').classList.add("broken");
el('#reset').classList.add("show");
}
}
// Display result, finally!
viewer.innerHTML = resultNum;
equals.setAttribute("data-result", resultNum);
// Now reset oldNum & keep result
oldNum = 0;
theNum = resultNum;
};
// When: Clear button is pressed. Clear everything
var clearAll = function() {
oldNum = "";
theNum = "";
viewer.innerHTML = "0";
equals.setAttribute("data-result", resultNum);
};
/* The click events */
// Add click event to numbers
for (var i = 0, l = nums.length; i < l; i++) {
nums[i].onclick = setNum;
}
// Add click event to operators
for (var i = 0, l = ops.length; i < l; i++) {
ops[i].onclick = moveNum;
}
// Add click event to equal sign
equals.onclick = displayNum;
// Add click event to clear button
el("#clear4").onclick = clearAll;
// Add click event to reset button
el("#reset").onclick = function() {
window.location = window.location;
};
}());
</script>