Този калкулатор ще ви помогне да извършвате основни аритметични операции събиране, изваждане, умножение и деление. Демо на живо

Изходен код: Github

предпоставка:

Основното разбиране на HTML, CSS и javascript улеснява разбирането на логиката на този калкулатор.

Използвани технологии:

  • HTML (изграждане на структура)
  • CSS (Дизайн/Представяне)
  • JavaScript (Реализация на логиката)

Трябва да имате редактор, за да пишете код. Силно ще ви препоръчам да използвате Visual Studio Code за кодиране. VS Code е моят най-използван и любим редактор.

Да започваме:

  • index.html
  • Style.css
  • Script.js

Да разбием структурата

Ето графично представяне на структурата. Този калкулатор основно е проектиран с помощта на концепцията за flex и Grid оформления. Чрез използването на тези оформления става много лесно да реагирате много лесно на вашето уеб приложение.

Стъпка 1: Позволете да проектирате калкулатора с помощта на HTML и CSS

  • HTML (хипертекстов език за маркиране) е стандартният език за маркиране, използван за създаване на основната структура на уебсайта.
  • CSS (Cascading Style Sheets) описва как HTML елементите трябва да се показват на екрана. Може да контролира оформлението на множество уеб страници наведнъж.
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="style.css"  type="text/css">
    <title>Calculator</title>
</head>
  • Външен CSS с име style.css, свързан с HTML чрез използване на маркер <link> за проектиране на приложение за калкулатор.
  • Съдържанието в маркера <title> ще бъде показано в заглавната лента на браузъра или в раздела на страницата
<div class="container">
<!-- Heading  -->
<!-- Display Screen-->
<!-- Buttons-->
</div>

.Контейнер

Outer container conatins All elements of calculator like calculator headind, display screen and buttons.
.container{        
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;   
    max-width: 250px;    
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%,-50%);
    background-color: #4f9b9440;
    box-shadow: rgba(214, 238, 236, 0.25) 0px 30px 60px -12px inset, rgba(15, 161, 130, 0.3) 0px 18px 36px -18px inset;
  }
Display:flex;
flex-direction: column;
justify-content: center;
align-items: center;

Свойствата на дисплея се използват за задаване на посоката на елементите от вътрешната страна на контейнера и подравняването им в центъра на контейнера.

position: absolute;
 top: 50%;
 left: 50%;
 transform: translate(-50%,-50%);

свойствата на позицията се използват за поставяне на контейнера в центъра на медийния екран.

#дисплей

Екранът на дисплея представлява представяне на въведени числа, оператори и техните резултати

<input type="text" name="number" id="display" readonly>
#display{
position: relative;
width: 98%;
border: none;
outline: none;
text-align: right;
font-size: 1.5rem;
font-weight: bold;
background-color:white;
}

Свойството readonly ограничава използването на въвеждане на текст. Той ще показва стойности, вместо да приема директно въвеждане от потребителя. text-align:right свойството, използвано за подравняване на числа към дясната страна на екрана на дисплея.

.решетка-контейнер

Този контейнер се състои от всички бутони за въвеждане с числа и оператори

<div class="grid-container">       
<!-- grid Items -->
</div>
.grid-container {    
  display: grid;
  width: 100%;
  grid-template-columns: auto auto auto auto;
  justify-content: center;  
  padding: 3px;
}
.grid-item {
  padding: 5px 10px;  
  width:59px ;
  outline: none;
  margin: 0.5px;
  font-size: 1.5rem;
  text-align: center;
  border: none;
  box-shadow: rgba(182, 182, 211, 0.25) 0px 30px 60px -12px inset, rgba(0, 0, 0, 0.3) 0px 18px 36px -18px inset;
}

Контейнерът за мрежа се използва за фиксиране на бутони в редове и колони. За използване на мрежово оформление се използва свойството display: grid. grid-template-columns:auto auto auto auto ще реши, че ще има четири колони в един ред. Всеки бутон в контейнера на мрежата е проектиран и поддържан с помощта на клас grid-item.

Ред 1:

<!-- row 1 -->
            <button class="grid-item plus">+</button>
            <button class="grid-item minus">-</button>
            <button class="grid-item multiply">*</button>
            <button class="grid-item divide">/</button>
  • В ред 1 има четири бутона със стойности съответно +, -, *, /.
  • Това са основни аритметични оператори, използвани при изчислението.
.plus{
  background-color:#F79F1F;
}
.minus{
  background-color: #A3CB38;
}
.multiply{
background-color: #D980FA;
}
.divide{
  background-color: #FFC312;
}

.plus, .minus, .multiply и .divide класове, прилагащи различни цветове към бутоните. Различните цветови схеми правят този калкулатор по-привлекателен.

Ред 2:

<!-- row 2 -->
            <button class="grid-item">7</button>
            <button class="grid-item">8</button>
            <button class="grid-item">9</button>
            <button class="grid-item equal">=</button>

В ред 2 има четири бутона със стойности 7, 8, 9 и = оператор. .equal клас, използван за проектиране на равен бутон.

.equal{
 background-color: #29696b;
 color: white;
 grid-row: span 4; 
}

Свойството grid-row:span 4 разширява бутона за равенство до 4-те реда.

Ред 3:

<!-- row 3 -->
           <button class="grid-item">4</button>
           <button class="grid-item">5</button>
           <button class="grid-item">6</button>

Ред 4:

<!-- row 4 -->
           <button class="grid-item">1</button>
           <button class="grid-item">2</button>
           <button class="grid-item">3</button>

Ред 5:

<!-- row 5 -->
           <button class="grid-item">0</button>
           <button class="grid-item">.</button>
           <button class="grid-item">C</button>

Ред 3, 4 и 5 се състои съответно от стойността 4,5,6 , 1,2,3 , 0,.,C.

активен селектор:

.grid-item:active{
  background-color: #757474;
}

:active селекторът се използва за избиране и стилизиране на активния елемент. Елементът става активен, когато щракнете върху него. при щракване върху елементи от мрежата цветът на фона им става сив.

Стъпка 2: Нека внедрим javascript логика:

Методология:

Когато щракнете върху бутон

  • Ако е число (0–9) или оператор (+,-,*,/), то ще бъде свързано към екрана на дисплея.
  • Ако е равен (=), тогава изразът на екрана на дисплея ще бъде оценен и ще покаже резултата на екрана на дисплея.
  • Ако е ( C ), ще нулира калкулатора и ще зададе стойността на екрана на 0.
  • Ако е (.), той ще се свърже към екрана на дисплея веднъж в един операнд.

На първо място, трябва да поемете контрола над HTML елемента. Ще използвате селектори, за да извикате тези входове и да ги съхраните в променлива. querySelector() връща елемента в документа, който съответства на посочения селектор.

const screenValue = document.querySelector("#display")

Чрез използване на селектор на id екранът на дисплея ще бъде достъпен и ще бъде присвоен на променливата screenValue.

const buttonValue = document.querySelectorAll("button")

За достъп до всички бутони се използва document.querySelectorAll("button") и това се присвоява на променливата buttonValue. Както ние правим console.log(buttonValue), той показва NodeList на всички бутони

buttonValue.forEach(element => {
   element.addEventListener('click', e => {

       let buttonText = e.target.innerText;
       });
    });
  • Методът за обратно извикване forEach() се използва за достъп до всички възлови елементи и добавяне на слушател на събития при кликване.
  • let buttonText = e.target.innerText; достъп до стойността на кликнатия бутон и я съхранява в променливата buttonText.

ЗАБЕЛЕЖКА:

  • Изразът е комбинация от оператори и операнди.
  • Между два операнда има само един оператор.
  • Само операторите + и - могат да бъдат префикс на число.
  • Само едно . е разрешено в един операнд
function refreshCalculator() {
   isOperator = true;
   isdot = false;
   isNumber = true;
   screenValue.value = "0"
}
if (buttonText === "C") {
           refreshCalculator();
       }

ако потребителят щракне върху бутона C, това ще опресни настройката на калкулатора и ще нулира стойността на екрана до 0. isOperator=true и isNumber=true означава, че потребителят може да въведе число или оператор.isDot=false означава, че няма точност в операнд.

else if (buttonText === '.' && !isdot) {
            screenValue.value += buttonText;
            isdot = true;
        }

Ако потребителят щракне върху бутона ., isdot ще бъде отметнато. ако няма точност в стойността . ще се свърже и ще направи isdot=true. гарантира дублиране на точността в операнда, защото само едно . е разрешено в една стойност.

else if (buttonText === '+' && isOperator) {
            // checking if display screen vaule is not equal to zero operator will b concatenate like 23+
            if (screenValue.value != '0') {
                screenValue.value += buttonText;
            }
            //if display value is 0 then + will be add as prefix of the operand
            else {
                screenValue.value = buttonText;
            }
            isOperator = false;
            isNumber = true;
            isdot = false;
        }
  • ако потребителят щракне върху бутона +, isOperator ще бъде отметнато, ако вече има оператор, няма да бъде добавен повече оператор, в противен случай ще бъде добавен оператор.
  • ако стойността на екрана на дисплея е 0 и потребителят въвежда + оператор. Операторът ще бъде добавен като префикс от лявата страна на операнда, в противен случай ще бъде конкатениран от дясната страна на операнда.
  • Сега е време да зададете стойностите на boolean isOperator=false, което означава, че повече оператори няма да бъдат свързани, докато не бъде добавен друг операнд.
  • isNumber=true означава, че потребителят може да въведе друг операнд.
  • isdot=false означава, че потребителят може да добави . в друг операнд.
else if (buttonText === '-' && isOperator) {
            if (screenValue.value != '0') {
                screenValue.value += buttonText;
            }
            else {
                screenValue.value = buttonText;
            }
            isOperator = false;
            isNumber = true;
            isdot = false;
        }
  • ако потребителят щракне върху бутона - isOperator ще бъде отметнато, ако вече има оператор, няма да бъде добавен повече оператор, в противен случай ще бъде добавен оператор.
  • ако стойността на екрана на дисплея е 0 и потребителят въведе — оператор. Операторът ще бъде добавен като префикс от лявата страна на операнда, в противен случай ще бъде конкатениран от дясната страна на операнда.
  • Сега е време да зададете стойностите на boolean isOperator=false, което означава, че повече оператори няма да бъдат свързани, докато не бъде добавен друг операнд.
  • isNumber=true означава, че потребителят може да въведе друг операнд.
  • isdot=false означава, че потребителят може да добави . в друг операнд.
else if (buttonText === '*' && isOperator) {
            if (screenValue.value != '0') {
                screenValue.value += buttonText;
                isOperator = false;
                isNumber = true;
                isdot = false;
            }
  • ако потребителят щракне върху бутона *, isOperator ще бъде отметнато, ако вече има оператор, няма да бъде добавен повече оператор, в противен случай ще бъде добавен оператор.
  • * никога не може да се използва като префиксен оператор, така че ще бъде свързан само ако екранът на дисплея има стойност › 0
  • Сега е време да зададете стойностите на boolean isOperator=false, което означава, че повече оператори няма да бъдат свързани, докато не бъде добавен друг операнд.
  • isNumber=true означава, че потребителят може да въведе друг операнд.
  • isdot=false означава, че потребителят може да добави . в друг операнд.
else if (buttonText === '/' && isOperator) {
           if (screenValue.value != '0') {
               screenValue.value += buttonText;
               isOperator = false;
               isNumber = true;
               isdot = false;
           }
       }
  • Ако потребителят щракне върху бутона /, isOperator ще бъде отметнато, ако вече има оператор, няма да бъде добавен повече оператор, в противен случай ще бъде добавен оператор.
  • / никога не може да се използва като префиксен оператор, така че ще бъде свързан само ако екранът на дисплея има стойност › 0
  • Сега е време да зададете стойностите на boolean isOperator=false, което означава, че повече оператори няма да бъдат свързани, докато не бъде добавен друг операнд.
  • isNumber=true означава, че потребителят може да въведе друг операнд.
  • isdot=false означава, че потребителят може да добави . в друг операнд.
else if (buttonText >= '0' && buttonText <= 9 && isNumber) {
            if (buttonText === '0' && screenValue.value === '0') {
            //do nothing.
            }
            else if (screenValue.value === '0') {
            //conver the 0 to the button value
                screenValue.value = buttonText;
            }
            else {
            //append 0 into the value
                screenValue.value += buttonText;
            }
            // allow user to add operator after operand 
            isOperator = true;
        }
  • Стойностите от (0–9) ще бъдат вмъкнати и свързани.
  • Ако buttonText === '0' && screenValue.value === '0' it няма да направи нищо, това означава, че стойността на екрана на дисплея ще остане 0.
  • Ако screenValue.value === '0', но buttonText > 0, тогава стойността на дисплея на екрана ще бъде равна на стойността на бутонния текст.
  • В противен случай 0 ще бъде добавена стойност на екрана на дисплея.
else if (buttonText === '=') {
            screenValue.value = eval(screenValue.value)
            isNumber = false;
        }

Ако потребителят щракне върху бутона =, изразът на екрана на дисплея ще бъде оценен и резултатът ще бъде показан на екрана на дисплея.

Когато всички отделни компоненти се сглобят заедно, имаме напълно функционален калкулатор. Сега можете да играете с него. Ако сте готови да направите повече, тогава:

опитайте да добавите още бутони като backspace, който изчиства последния знак. или добавете още няколко оператора като оператора за остатък (%). Просто си поиграйте с него... Надявам се този урок да ви е харесал.

Ако имате някакви съмнения, моля, коментирайте ги по-долу. И ако ви е харесал този урок, моля, натиснете бутона за харесване по-долу. Благодаря ти ;)

Препоръка:

Независимо дали изграждате калкулатор в JavaScript или работите върху по-сложен проект, идеята е да разбиете съдържанието по логичен и изтълкуван начин. Това ще ви помогне да извлечете точния синтаксис и ще доведе до гладко уеб приложение. Вместо да започнете директно с кодиране, опитайте се да разберете каква е истинската цел на проекта, който ще изградите, как работи, какъв ще бъде входът и желаният изход, ще ви отведе до кода.