Калькулятор, HTML+CSS+JS
Автор конспекта: Стогниева Виктория
1.Основная тема урока: События (Events) 🎯
Почему это важно?
- События — фундаментальная концепция для создания интерактивных веб-приложений
- Позволяют реагировать на действия пользователя (клики, ввод текста и др.)
- Превращают статические HTML-страницы в динамические интерфейсы
Без понимания событий невозможно создание современного фронтенда
2. Рекомендуемый подход к разработке 🏗️
Начинайте с вёрстки (HTML + CSS):
3. Проблема конфликтов стилей ⚠️
Конфликты стилей возникают, когда разные CSS-правила с одинаковой специфичностью применяются к одному элементу, что приводит к непредсказуемым результатам. Для предотвращения конфликтов стилей необходимо использовать вложенность селекторов. Вместо того, чтобы применять стили к общим элементам, следует указывать полный путь к элементу в контексте его родительских блоков. Этот подход, известный как использование "селекторов вложенности", делает CSS-правила более специфичными и уменьшает вероятность нежелательного переопределения стилей.
Ключевой принцип: Вложенность селекторов
❌ Плохой подход (риск конфликтов)
✅ Правильный подход (с вложенностью)
Использование вложенных селекторов позволяет создавать более специфичные и целенаправленные CSS-правила:
4. Привязка функций-обработчиков к событиям HTML-элементов в JavaScript
Основной метод: addEventListener()
Для привязки функций-обработчиков к событиям HTML-элементов используется метод
addEventListener().
Пошаговый процесс привязки📋
1. Получение ссылки на HTML-элемент
Сначала необходимо получить ссылку на нужный HTML-элемент:
2. Создание функций-обработчиков
3. Применение addEventListener()
Затем к элементу применяется метод addEventListener():
4. Правильная передача функции
✅ Правильно: передавать только название функции без скобок
❌ Неправильно: передавать функцию со скобками
Почему происходит конкатенация?❓
Значения, полученные из атрибутов HTML-элементов (например, value у input), всегда являются
строками, даже если пользователь вводит числа.
Механизм работы оператора +🧩
В JavaScript оператор + ведет себя по-разному в зависимости от типов операндов:
🏠 Домашнее задание
Калькулятор - подготовка
1. Напишите функцию суммирования чисел
Создайте функцию, которая
- суммирует 2 числа
- принимает 2 параметра
- ретурном (return) возвращает результат во внешний мир
Вот так я (представитель внешнего мира) хочу уметь вызывать эту функцию и не думать, что там у неё внутри:
2. Напишите аналогичные функции для multiply, minus, divide
Все эти 4 функции разместите в отдельном файле math.js, подключите этот файл перед вашим
calculator.js, в котором будет логика уже приложения.
А теперь погнали бомбить калькуляторы используя функции из нашей псевдо-библиотеки math.js 🚀
Калькулятор v1
Калькулятор должен иметь 2 поля ввода: по одному для каждого числа, с которыми будет производиться математическая операция.
Жмём на кнопку — в span-е РЕЗУЛЬТАТ видим результат.
Список операций:
- умножить
- разделить
- сложить
- вычесть
Примерный вид калькулятора:

Калькулятор v2
Кнопка Посчитать — одна. Операцию выбираем в select.

Если чувствуешь силу в себе и тебе это всё легко, то переходи сразу к Калькулятор v3
Микрозадачка 1

Имеется input (пустой) и 3 кнопки.
- Кликаем по кнопке 2 → в инпуте видим:
2 - Кликаем по кнопке 1 → в инпуте видим:
21(справа дописалась единица) - Кликаем опять по кнопке 2 → в инпуте видим:
212(дописали 2) - Кликаем по кнопке 3 → в инпуте видим:
2123
И так далее…
Калькулятор v3
Сделать ввод в поля с помощью кнопок. То есть примерно как в настоящем калькуляторе:

Вот так он должен себя вести: пример видео
Инструкции
Первым делом определяемся с алгоритмом.
Вопрос: что происходит, когда мы нажимаем на кнопку? Ответ: какую смотря кнопку.
Вопрос 1: на кнопку с числом
Ответ 1: берём и приплюсовываем (конкатенируем строки) справа цифру, отображающуюся в input.
Было, например: 3434 Нажимаем 8 Получается: 34348
Можно на этом остановиться и начать кодить: рисуем все ЧИСЛОВЫЕ кнопки и вешаем на них один обработчик события (листенер / подписчик / subscriber / handler).
Почему один? Потому что АЛГОРИТМИЧЕСКИ при нажатии на любую кнопку с ЦИФРОЙ происходит одно и то же:
мы дописываем справа к input значение кликнутой кнопки.
Примерный код:
Первый алгоритмический кусок — это содержимое функции numberButtonClickListener.
Вопрос 2: а когда кликаем на равно?
Ответ: рано думать про равно. Нужно идти логически последовательно.
Как работает калькулятор обычный?
- вводим число
- жмём кнопку операции
- вводим второе число
- жмём равно, проводим операцию и выполняем результат
Давайте свяжем каждое действие алгоритма с каким-то листенером (ведь в них у нас логика):
- вводим число →
numberButtonClickListener - жмём кнопку операции →
operationButtonClickListener - вводим второе число →
numberButtonClickListener - жмём равно →
resultButtonClickListener
Логически 3 группы
-
Нажатие на цифры (при нажатии на любую цифру мы делаем одно и то же, только цифра разная)
-
Нажатие на кнопки с операцией (при нажатии на любую операцию мы делаем одно и то же — после нажатия на равно производим операцию между двумя числами, просто операции разные)
-
Нажатие на равно (кнопка в одном экземпляре, действие одно: число1 — ОПЕРАЦИЯ — число2)
Первый пункт реализовали ✅
Второй пункт
Вопрос: что там происходит? Выполняем действие сразу? Нажали на плюс → значит начинаем плюсовать?
Ответ: нет, мы не знаем второго числа. Операцию, которую нажали, мы должны выполнить в будущем, когда кликнем на кнопку =.
Вопрос: мы нажали на кнопку, например +, сейчас. А это значение операции нам понадобится только потом, когда кликнем по =. Как сохранить?
Ответ: в глобальную переменную (зло, но пока что так), например:
Шаг 2 заключается в том, чтобы сохранить значение операции на будущее
Вспомним алгоритм:
- вводим число →
numberButtonClickListener - жмём кнопку операции →
operationButtonClickListener - вводим второе число → numberButtonClickListener
- жмём равно →
resultButtonClickListener
После нажатия на кнопку операции начинаем вводить второе число.
Но там же введено было первое число? Значит, нужно его очистить!
То есть шаг 2 = два действия:
- СОХРАНИТЬ ЗНАЧЕНИЕ ОПЕРАЦИИ НА БУДУЩЕЕ
- ОЧИСТИТЬ ПОЛЕ ВВОДА
Супер, почти работает. Переходим к пункту 4 — нажатие на равно.
Что делаем? Берём первое число, операцию, второе число и получаем результат.
Но… мы вытерли первое число на шаге 2! Значит, нужно перед вытиранием сохранить это значение.
Куда? В глобальную переменную, например firstNumber.
Итого: шаг 2 содержит 3 операции
- СОХРАНИТЬ ЗНАЧЕНИЕ ОПЕРАЦИИ НА БУДУЩЕЕ
- СОХРАНИТЬ ЧИСЛО1 НА БУДУЩЕЕ
- ОЧИСТИТЬ ПОЛЕ ВВОДА
Шаг 4 — кнопка равно
- Первое число → из переменной firstNumber
- Второе число → из
input - Операция → из переменной operation
Slider
Закрепляем темы, пытаясь сделать слайдер!
Версия 1
Кликаем вправо-влево и картинка меняется на следующую или предыдущую.
Какие есть варианты реализации?
- Одна базовая картинка (имеет класс
show), остальные — скрыты по умолчанию (в CSS прописано правило для картинок):
- Находим следующую картинку и показываем её, а предыдущую прячем.
Версия 2
У нас всего одна картинка. В JS хранится массив адресов. По кликам NEXT/BACK берём из массива
следующий/предыдущий URL и подставляем его в src нашей единственной картинки.


