Простий веб-калькулятор у стилі Fallout / Pip-Boy.
Написаний на HTML, CSS та JavaScript — без фреймворків і складних бібліотек.
Щоб відкрити проєкт: двічі клацни по файлу index.html або відкрий його у браузері (Chrome, Firefox, Edge).
| Файл | Призначення |
|---|---|
index.html |
Каркас сторінки: заголовок, екран калькулятора та всі кнопки |
style.css |
Зовнішній вигляд: кольори, шрифти, світіння, анімації |
script.js |
Логіка калькулятора: що відбувається при натисканні кнопок |
README.md |
Цей файл — пояснення, як усе влаштовано |
HTML — це «скелет» сторінки. Він каже браузеру, що показувати.
<body>
└── <div class="pip-boy"> ← головний корпус калькулятора
├── <header> ← назва «ROBCO INDUSTRIES»
├── <div class="screen"> ← екран з виразом
│ └── <div id="display"> ← сюди JavaScript пише цифри
├── <div class="buttons"> ← сітка з кнопками
└── <footer> ← рядок внизу «Система готова»
Кожна кнопка має два важливі атрибути:
data-action— що робить кнопка:number— додає цифруoperator— додає знак (+, -, *, /)equals— обчислює результатclear— очищає екран
data-value— яке саме значення (наприклад,7або+)
Приклад:
<button class="btn btn-number" data-action="number" data-value="7">7</button>JavaScript читає ці атрибути і розуміє, що робити при кліку.
У <head> підключено CSS і шрифт. Перед закриваючим </body> — JavaScript:
<link rel="stylesheet" href="style.css">
<script src="script.js"></script>CSS відповідає за вигляд сторінки: кольори, розміри, ефекти.
body {
background-color: #0a0a0a;
}#0a0a0a — дуже темний колір (майже чорний).
Колір #39ff14 — яскраво-зелений, як на старих терміналах.
Він використовується для тексту, рамок і світіння (text-shadow, box-shadow).
У класі .pip-boy є box-shadow — тінь навколо блоку. Кілька тіней разом створюють ефект світіння:
box-shadow: 0 0 20px rgba(57, 255, 20, 0.3);Підключено шрифт Share Tech Mono з Google Fonts. Якщо він не завантажиться — браузер використає Courier New.
Анімація screenFlicker на короткий момент зменшує прозорість екрана — імітація старого монітора:
@keyframes screenFlicker {
93% { opacity: 0.85; }
...
}Кнопки мають:
- темний градієнт (
linear-gradient) — виглядають об'ємними; - товсту нижню тінь — ніби кнопка виступає;
- при натисканні (
:active) зсуваються вниз — ефект натискання.
display: grid з grid-template-columns: repeat(4, 1fr) розкладає кнопки в 4 стовпці однакової ширини.
JavaScript — це «мозок» калькулятора. Він реагує на кліки і змінює те, що написано на екрані.
На початку файлу зберігаємо:
| Змінна | Що зберігає |
|---|---|
display |
Посилання на елемент екрану в HTML |
currentExpression |
Поточний вираз (наприклад "12+5") |
hasError |
Чи зараз показується помилка |
Користувач натискає кнопку
↓
JavaScript читає data-action і data-value
↓
Викликається потрібна функція
↓
Змінюється currentExpression
↓
Екран оновлюється через updateDisplay()
Показує текст на екрані. Всі інші функції викликають її, щоб оновити відображення.
Скидає все: вираз стає порожнім, помилка зникає, на екрані знову 0.
Показує червоний текст помилки (наприклад ПОМИЛКА) і вмикає прапорець hasError.
Додає цифру до виразу. Якщо на екрані був 0, замінює його новою цифрою замість 05.
Додає знак +, -, * або /. Якщо останній символ уже оператор — замінює його (щоб не було 5++).
Обчислює результат виразу і показує його на екрані. Якщо щось не так — показує помилку.
У кінці script.js:
var buttons = document.querySelectorAll('.btn');
for (var i = 0; i < buttons.length; i++) {
buttons[i].addEventListener('click', function() {
var action = this.getAttribute('data-action');
var value = this.getAttribute('data-value');
// ... виклик потрібної функції
});
}Крок за кроком:
querySelectorAll('.btn')— знаходить усі кнопки з класомbtn.- Цикл
forпроходить по кожній кнопці. addEventListener('click', ...)— «слухає» клік миші.- При кліку читаємо
data-actionіdata-value. - Залежно від
actionвикликаємо:addNumber— для цифрaddOperator— для знаківcalculateResult— для=clearAll— дляC
Коли натискають =, викликається calculateResult():
- Перевірка виразу — чи не порожній, чи не закінчується на
+чи-. - Перевірка безпеки — у виразі дозволені лише цифри та
+ - * / . - Обчислення —
eval(currentExpression)рахує результат. - Перевірка результату — чи це нормальне число (не
Infinityпри діленні на нуль). - Округлення — щоб не показувати
0.30000000000000004. - Показ — результат з'являється на екрані.
Користувач вводить: 5 + 3 =
currentExpression = "5+3"
eval("5+3") → 8
На екрані: 8
| Ситуація | Що бачить користувач |
|---|---|
Ділення на нуль (5/0) |
ПОМИЛКА |
Вираз закінчується на + |
ПОМИЛКА |
| Некоректні символи | ПОМИЛКА |
Після помилки наступна цифра або C скидає стан.
У style.css знайди body і зміни background-color:
body {
background-color: #1a0a2e; /* фіолетовий фон */
}Заміни #39ff14 на інший колір у файлі style.css. Наприклад, блакитний термінал:
color: #00d4ff;Шукай цей колір у .display-text, .btn, .screen та інших місцях.
У .pip-boy зміни числа в box-shadow:
box-shadow: 0 0 40px rgba(57, 255, 20, 0.5); /* сильніше світіння */- У
index.htmlдодай кнопку з потрібнимиdata-actionіdata-value. - Якщо потрібна нова дія — додай
else ifу обробник кліків уscript.js.
У index.html зміни вміст тегів <h1> та <p class="subtitle">.
Видали або закоментуй рядок у .screen:
/* animation: screenFlicker 4s infinite; */Ось 5 простих покращень, які можна зробити самостійно:
-
Кнопка крапки (.) — додай кнопку для десяткових дробів, щоб можна було рахувати
3.14 + 2. -
Кнопка видалення (⌫) — одне натискання стирає останній символ, не весь вираз як
C. -
Звук кліку — додай короткий звук при натисканні кнопки через HTML-елемент
<audio>або Web Audio API. -
Історія обчислень — під екраном показуй останні 3–5 прикладів і їхні результати.
-
Темна / світла тема — додай кнопку перемикання, яка змінює клас на
<body>(наприкладbody.amberз жовтим кольором замість зеленого).
Успіхів у навчанні веброзробки!
