Попробуйте себя в топовых IT-профессиях и соберите первое портфолио. Бесплатный курс Попробуйте себя в топовых IT-профессиях и соберите первое портфолио. Бесплатный курс Учиться
Код Справочник по фронтенду
#статьи

Пишем калькулятор ИМТ на HTML, CSS и JavaScript

Простой проект для начинающих фронтендеров.

Иллюстрация: Оля Ежак для Skillbox Media

Индекс массы тела (ИМТ) помогает оценить, соответствует ли вес росту. С его помощью легко понять, можно ли съесть ещё один пирожок или пора садиться на диету.

В этой статье создадим с нуля простой калькулятор ИМТ: сверстаем HTML-форму, напишем скрипт на JS и подключим CSS-стили. Всё будет работать прямо в браузере — достаточно открыть HTML-файл.

Содержание:


Что мы будем делать

Рассчитать ИМТ достаточно просто: нужно вес в килограммах разделить на квадрат роста в метрах. Этот индекс ещё называется индексом Кетле — по фамилии известного бельгийского математика, астронома, метеоролога и социолога Адольфа Кетле, который как раз и ввёл в обиход понятие индекса массы тела.

Калькулятор мы будем писать с применением HTML, JavaScript и CSS. На HTML напишем разметку интерфейса, то есть разместим как надо все необходимые компоненты. На JavaScript опишем всю логику приложения. Именно этот код и будет заниматься вычислением индекса Кетле и не только. С помощью CSS мы раскрасим приложение, чтобы оно выглядело красиво. Вот так будет выглядеть результат:

Скриншот: Visual Studio Code / Skillbox Media

Шаг первый


Подготавливаем среду разработки

Для работы с HTML, CSS и JavaScript подойдёт любой современный редактор кода, но мы будем использовать Visual Studio Code — один из самых популярных и удобных. Он бесплатный, работает на Windows, macOS и Linux и легко настраивается под разные задачи с помощью расширений.

Устанавливаем Live Preview

Чтобы было удобнее работать с HTML-файлами, можно установить расширение Live Preview. Оно позволяет открывать вашу страницу в браузере прямо из редактора и автоматически обновлять её при каждом изменении в коде.

После запуска редактора откройте вкладку Extensions (значок из четырёх квадратов на боковой панели).

Скриншот: Visual Studio Code / Skillbox Media

Введите в строке поиска Live Preview.

Выберите расширение от Microsoft и нажмите Install.

Скриншот: Visual Studio Code / Skillbox Media

После установки вы увидите кнопку запуска сервера — она появится на нижней панели редактора. При запуске расширение откроет HTML-страницу в браузере и будет отслеживать все изменения.

Дополнительные расширения для HTML, CSS и JavaScript устанавливать не нужно — VS Code уже по умолчанию поддерживает:

  • подсветку синтаксиса,
  • автодополнение кода,
  • навигацию по структуре документа,
  • встроенные подсказки и документацию.

Шаг второй


Создаём папку проекта

Сначала создадим необходимые файлы. Перед началом работы создайте папку с именем, например bmi-calculator, в любом удобном месте на компьютере.

Внутри неё разместите три пустых файла:

  • index.html — для разметки интерфейса приложения;
  • style.css — стили приложения, задающие его внешний вид;
  • script.js — для описания логики калькулятора на JavaScript.

Теперь всё готово к началу разработки приложения.

Шаг третий


Делаем разметку интерфейса

Среда разработки настроена, проектная папка создана — пора переходить к вёрстке. Но прежде чем писать HTML, давайте разберёмся, какие элементы понадобятся нашему калькулятору и зачем.

Для вычисления индекса массы тела (ИМТ) нужно ввести два значения: вес и рост. Эти данные пользователь вводит вручную, поэтому используем два поля ввода — <input>: одно для веса, другое для роста.

Чтобы интерфейс был понятным, рядом с каждым полем добавим подписи — теги <label>. Они подскажут, что именно нужно ввести.

Далее понадобится кнопка (<button>), которая запустит расчёт.

Результат расчёта отобразим на странице с помощью двух тегов <div>:

  • один выведет числовое значение ИМТ;
  • другой — текстовую категорию: например, «нормальный вес» или «избыточный».

Все эти элементы мы поместим внутрь контейнера <div class="calculator«>. Он поможет организовать структуру, стилизовать блок и работать с ним через CSS и JavaScript.

Также добавим заголовок страницы — <h1>, чтобы сразу было понятно, что перед нами калькулятор ИМТ, и подзаголовок — <h3> — как краткий призыв к действию: например, «Следи за своим весом!». Оба тега разместим вне основного контейнера, чтобы сохранить логическую структуру документа.

Теперь можно открыть редактор и приступить к работе:

  • Запустите Visual Studio Code.
  • В стартовом окне нажмите «Открыть папку...» и выберите созданную папку проекта.
  • В левой панели найдите файл index.html.
  • Откройте его и вставьте следующий HTML-код:

<!DOCTYPE html> <!-- Объявление типа документа: HTML5 -->
<html lang="ru"> <!-- Начало документа, язык -- русский -->
<head>
  <meta charset="UTF-8"> <!-- Устанавливает кодировку символов: UTF-8 -->
  <title>BMI Calculator</title> <!-- Название страницы на вкладке браузера -->
  <link href="style.css" rel="stylesheet"> <!-- Подключение внешнего CSS-файла -->
</head>

<body> <!-- Основное содержимое страницы -->

  <h1>Калькулятор ИМТ</h1> <!-- Главный заголовок страницы -->
  <h3>Следи за своим весом!</h3> <!-- Слоган -->

  <div class="calculator"> <!-- Контейнер для калькулятора ИМТ -->

    <label for="weight">Вес (кг):</label> <!-- Подпись к полю ввода веса -->
    <input type="number" class="weight" id="weight" placeholder="Введите ваш вес"> <!-- Поле ввода веса, принимает только числа -->

    <br> <!-- Перенос строки (используется для отступа между элементами) -->

    <label for="height">Рост (см):</label> <!-- Подпись к полю ввода роста -->
    <input type="number" class="height" id="height" placeholder="Введите ваш рост"> <!-- Поле ввода роста, принимает только числа -->

    <br> <!-- Перенос строки -->

    <button onclick="calculate()">Вычислить</button> <!-- Кнопка запуска расчёта ИМТ. Вызывает функцию calculate() из JS -->

    <div class="bmi"></div> <!-- Блок для вывода рассчитанного значения ИМТ -->
    <div class="category"></div> <!-- Блок для вывода текстовой категории ИМТ (например, "Норма") -->

  </div> <!-- Конец блока .calculator -->

  <script src="script.js"></script> <!-- Подключение внешнего JavaScript-файла с логикой расчёта -->
</body>
</html>

Откроем предварительный просмотр с помощью расширения Live Preview. Для этого найдём значок расширения в правом верхнем углу панели редактора. Нажмём на него — откроется новая вкладка браузера, где отобразится наше приложение.

Скриншот: Visual Studio Code / Skillbox Media

На этом этапе приложение выглядит минималистично — просто текст и поля ввода. Это нормально: HTML уже готов, CSS-файл подключён, но пока в нём нет стилей. Следующий шаг — добавить оформление и сделать интерфейс симпатичнее.

Скриншот: Visual Studio Code / Skillbox Media

Каждое поле ввода содержит подсказку, заданную через атрибут placeholder. Атрибут type="number« указывает, что поле предназначено для ввода числовых значений, — это исключает ввод текста.

Если нажать на кнопку <button>, вызывается функция calculate(), которая выполняет расчёт.

Результаты отображаются в двух блоках <div>, расположенных под кнопкой:

  • в элемент с классом .bmi выводится числовое значение ИМТ;
  • в элемент с классом .category — текстовая интерпретация (например, «Нормальный вес» или «Ожирение»).

Стили подключаются через тег <link>, а скрипт — с помощью тега <script>. В следующих шагах мы добавим CSS и JavaScript, чтобы калькулятор стал полноценным приложением.

Шаг четвёртый


Улучшаем внешний вид

Откроем файл style.css и займёмся внешним видом приложения. Для начала зададим базовые стили для тега body: шрифт, выравнивание текста и цвет фона.

  • font-family определяет используемое семейство шрифтов;
  • text-align выравнивает содержимое по центру страницы;
  • background-color задаёт цвет фона.

Вот как это выглядит в коде:

body {
    font-family: Arial, Helvetica, sans-serif;
    text-align: center;
    background-color: #91bbbd;
    }

Зададим цвет для заголовка и подзаголовка с помощью свойства color:

    h1 {
    color: #504a4a;
    }
    
    h3 {
    color: #534f49;
    }

Получим такой вид:

Скриншот: Visual Studio Code / Skillbox Media

Теперь нам нужно оформить область, где будут располагаться все элементы калькулятора. Делается это так:

.calculator {
    background-color: #c8c98f;
    padding: 40px;
    border-radius: 10px;
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
    display: inline-block;
    }

Здесь мы задаём фоновый цвет (background-color), внутренние отступы (padding), скругление углов (border-radius) и добавляем лёгкую тень (box-shadow). Свойство display: inline-block указывает, что элемент должен вести себя как блочный, но занимать только ту ширину, которая нужна для его содержимого.

В результате получится аккуратный контейнер:

Скриншот: Visual Studio Code / Skillbox Media

Дальше определим расположение текстовых меток, полей ввода и кнопки:

label, input, button {
    display: table-cell;
    margin: 10px 0;
    }

Здесь снова используется свойство display, но с другим значением — table-cell. Оно заставляет элементы (label, input и button) выстраиваться по принципу таблицы: каждый занимает отдельную «ячейку» в строке. Дополнительно с помощью свойства margin задаются вертикальные отступы между элементами.

В результате элементы располагаются компактно и ровно:

Скриншот: Visual Studio Code / Skillbox Media

Осталось только стилизовать кнопку.

button {
    background-color: #546154;
    color: white;
    border: none;
    padding: 10px 20px;
    border-radius: 5px;
    cursor: pointer;
    }
    
    button:hover {
    background-color: #6e806f;
    }

Мы задаём для неё фоновый цвет, цвет текста, убираем рамку (border: none), добавляем отступы, скругляем углы и меняем курсор на «указатель» при наведении. Дополнительно с помощью button:hover задаём стиль кнопки при наведении — она будет слегка менять цвет.

В результате получим:

Скриншот: Visual Studio Code / Skillbox Media

Теперь всё выглядит как задумано.

Вот итоговый CSS-код:

body {
    font-family: Arial, Helvetica, sans-serif;
    text-align: center;
    background-color: #91bbbd;
    }
    
    h1 {
    color: #504a4a;
    }
    
    h3 {
    color: #534f49;
    }

    .calculator {
    background-color: #c8c98f;
    padding: 40px;
    border-radius: 10px;
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
    display: inline-block;
    }
    
    label, input, button {
    display: table-cell;
    margin: 10px 0;
    }
    
    button {
    background-color: #546154;
    color: white;
    border: none;
    padding: 10px 20px;
    border-radius: 5px;
    cursor: pointer;
    }
    
    button:hover {
    background-color: #6e806f;
    }

Дальше займёмся логикой калькулятора.

Шаг пятый


Добавляем логику

Научим наше приложение вычислять ИМТ и интерпретировать результаты.

Сначала напишем простую заготовку функции с именем calculate() — именно она будет запускаться, когда пользователь нажмёт кнопку «Вычислить».

function calculate() {
  // Здесь будет код
}

Чтобы JavaScript мог что-то изменить на странице — например, узнать, что ввёл пользователь, или показать результат, — ему нужно «дотянуться» до нужных элементов HTML. Например, до полей ввода, кнопки или блоков, куда мы хотим вывести результат.

Для этого используется специальная команда — document.querySelector.

  • document — это вся HTML-страница.
  • querySelector() — это команда, которая ищет элемент на странице по его классу, тегу, ID или любому другому селектору.

Допустим, у нас есть поле ввода с классом weight. Чтобы получить доступ к этому полю из JavaScript, пишем:

let weightInput = document.querySelector(".weight");
  • ".weight" — это CSS-селектор класса (точка означает, что ищем по классу).
  • weightInput — переменная, в которую сохраняем найденный элемент.

Аналогичным образом мы можем получить и другие элементы:

let heightInput = document.querySelector(".height"); // Поле ввода роста
let bmiDiv = document.querySelector(".bmi"); // Блок, в котором появится результат ИМТ
let categoryDiv = document.querySelector(".category"); // Блок с текстовым пояснением

Теперь давайте получим значения, которые пользователь ввёл в поля «Вес» и «Рост».

Когда человек вводит данные в поле, они сохраняются как обычный текст. Чтобы с этими данными можно было производить математические расчёты (а нам потребуется делить и возводить в степень), нужно сначала превратить этот текст в число. Для этого используем специальную команду parseFloat():

let weight = parseFloat(weightInput.value);
let height = parseFloat(heightInput.value);
  • weightInput.value — это то, что пользователь ввёл в поле «Вес».
  • heightInput.value — то, что он ввёл в поле «Рост».
  • parseFloat() — превращает текст в число, включая десятичные дроби.

Дальше мы проверим, ввёл ли пользователь вообще какие-то данные. Может быть, он случайно нажал кнопку «Вычислить», ничего не написав в поля. В этом случае показываем сообщение с просьбой ввести данные, а курсор ставим в нужное поле, чтобы человеку было удобнее его сразу заполнить:

if (isNaN(weight)) {
  bmiDiv.innerHTML = "Введите ваш вес!";
  categoryDiv.innerHTML = "";
  weightInput.focus(); // Ставим курсор в поле «Вес»
  return; // Останавливаем выполнение функции
}

isNaN() — это команда, которая проверяет, получилось ли число. Если нет — значит, пользователь ничего не ввёл или допустил ошибку.

Такая же проверка для роста:

if (isNaN(height)) {
  bmiDiv.innerHTML = "Введите ваш рост!";
  categoryDiv.innerHTML = "";
  heightInput.focus(); // Ставим курсор в поле «Рост»
  return;
}

Если данные введены правильно, рассчитываем индекс массы тела:

let bmi = weight / ((height / 100) ** 2);

Здесь:

  • делим вес в килограммах на квадрат роста в метрах;
  • height / 100 — превращаем сантиметры в метры;
  • ** 2 — возводим рост в квадрат.

Также создаём переменную category, в которую чуть позже запишем текст с расшифровкой результата:

let category = "";

Теперь задаём соответствующее значение для переменной category в зависимости от значения переменной bmi. Когда пользователь ввёл данные и мы рассчитали его ИМТ, нужно понять, в какую категорию он попадает: это может быть недостаточный вес, норма, избыточный вес или ожирение. Чтобы определить это, мы используем условную конструкцию if...else if...else — она помогает выполнять разные действия в зависимости от значения переменной bmi.

Вот как это работает:

if (bmi < 18.5) {
  category = "Недостаточный вес";
  calculator.style.backgroundColor = "#dd7979"; // Светло-красный -- недостаточный вес
} else if (bmi < 25) {
  category = "Нормальный вес";
  calculator.style.backgroundColor = "#6ecf66"; // Зелёный -- всё в порядке
} else if (bmi < 30) {
  category = "Избыточный вес";
  calculator.style.backgroundColor = "#da5050"; // Ярко-красный -- есть лишний вес
} else {
  category = "Ожирение";
  calculator.style.backgroundColor = "#d31c1c"; // Тёмно-красный -- ожирение, серьёзное превышение
}

Каждое условие сравнивает значение bmi с заданными порогами. Если оно подходит, присваивается текстовая интерпретация в переменную category, а фон калькулятора (.calculator) окрашивается в определённый цвет:

  • светло-красный — если вес недостаточный;
  • зелёный — если вес в норме;
  • ярко-красный — при избыточном весе;
  • тёмно-красный — при ожирении.

Вот итоговая функция:

function calculate() {
    let calculator = document.querySelector(".calculator");
    let weightInput = document.querySelector(".weight");
    let heightInput = document.querySelector(".height");
    let bmiDiv = document.querySelector(".bmi");
    let categoryDiv = document.querySelector(".category");
  
    let weight = parseFloat(weightInput.value);
    let height = parseFloat(heightInput.value);
  
    if (isNaN(weight)) {
      bmiDiv.innerHTML = "Введите ваш вес!";
      categoryDiv.innerHTML = "";
      weightInput.focus();
      return;
    }

    if (isNaN(height)) {
      bmiDiv.innerHTML = "Введите ваш рост!"
      categoryDiv.innerHTML = "";
      heightInput.focus();
      return;
    }
  
    let bmi = weight / ((height / 100) ** 2);
    let category = "";
  
    if (bmi < 18.5) {
      category = "Недостаточный вес";
      calculator.style.backgroundColor = "#dd7979"
    } else if (bmi < 25) {
      category = "Нормальный вес";
      calculator.style.backgroundColor = "#6ecf66"
    } else if (bmi < 30) {
      category = "Избыточный вес";
      calculator.style.backgroundColor = "#da5050"
    } else {
      category = "Ожирение";
      calculator.style.backgroundColor = "#d31c1c"
    }
  
    bmiDiv.innerHTML = "Ваш ИМТ: " + bmi.toFixed(2);
    categoryDiv.innerHTML = category;
  }

Разбиваем большую функцию на части

Функция calculate() работает корректно, но получилась довольно объёмной — она и получает данные, и проверяет их, и вычисляет ИМТ, и оформляет результат. Это не ошибка, но такой код сложнее читать и поддерживать. Поэтому мы разобьём его на отдельные небольшие функции — так будет проще ориентироваться и вносить изменения при необходимости.

Получаем и проверяем данные: getUserData()

Эта функция находит поля ввода веса и роста, получает введённые значения и проверяет, что они корректны. Если что-то не так, показываем сообщение об ошибке и возвращаем null.

function getUserData() {
  let weightInput = document.querySelector(".weight");
  let heightInput = document.querySelector(".height");
  let bmiDiv = document.querySelector(".bmi");
  let categoryDiv = document.querySelector(".category");

  let weight = parseFloat(weightInput.value);
  let height = parseFloat(heightInput.value);

  if (isNaN(weight)) {
    bmiDiv.innerHTML = "Введите ваш вес!";
    categoryDiv.innerHTML = "";
    weightInput.focus();
    return null;
  }

  if (isNaN(height)) {
    bmiDiv.innerHTML = "Введите ваш рост!";
    categoryDiv.innerHTML = "";
    heightInput.focus();
    return null;
  }

  return { weight, height };
}

Вычисляем ИМТ: calculateBMI(weight, height)

Функция принимает вес и рост и возвращает результат по формуле расчёта ИМТ.

function calculateBMI(weight, height) {
  return weight / ((height / 100) ** 2);
}

Определяем категорию: getCategory(bmi)

В зависимости от значения ИМТ функция возвращает объект с категорией и цветом фона.

function getCategory(bmi) {
  if (bmi < 18.5) {
    return { category: "Недостаточный вес", color: "#dd7979" };
  } else if (bmi < 25) {
    return { category: "Нормальный вес", color: "#6ecf66" };
  } else if (bmi < 30) {
    return { category: "Избыточный вес", color: "#da5050" };
  } else {
    return { category: "Ожирение", color: "#d31c1c" };
  }
}

Основная функция: calculate()

Теперь основная функция стала проще и понятнее. Она просто вызывает вспомогательные функции, собирает результат и отображает его на странице.

function calculate() {
  const calculator = document.querySelector(".calculator");
  const bmiDiv = document.querySelector(".bmi");
  const categoryDiv = document.querySelector(".category");

  const userData = getUserData();
  if (!userData) return;

  const bmi = calculateBMI(userData.weight, userData.height);
  const result = getCategory(bmi);

  calculator.style.backgroundColor = result.color;
  bmiDiv.innerHTML = "Ваш ИМТ: " + bmi.toFixed(2);
  categoryDiv.innerHTML = result.category;
}

Полный код будет выглядеть вот так:

// Получаем данные от пользователя и проверяем, что они корректны
function getUserData() {
  let weightInput = document.querySelector(".weight");
  let heightInput = document.querySelector(".height");
  let bmiDiv = document.querySelector(".bmi");
  let categoryDiv = document.querySelector(".category");

  let weight = parseFloat(weightInput.value);
  let height = parseFloat(heightInput.value);

  if (isNaN(weight)) {
    bmiDiv.innerHTML = "Введите ваш вес!";
    categoryDiv.innerHTML = "";
    weightInput.focus();
    return null;
  }

  if (isNaN(height)) {
    bmiDiv.innerHTML = "Введите ваш рост!";
    categoryDiv.innerHTML = "";
    heightInput.focus();
    return null;
  }

  return { weight, height };
}

// Вычисляем ИМТ по формуле: вес / (рост в метрах)^2
function calculateBMI(weight, height) {
  return weight / ((height / 100) ** 2);
}

// Определяем категорию по значению ИМТ и цвет фона
function getCategory(bmi) {
  if (bmi < 18.5) {
    return { category: "Недостаточный вес", color: "#dd7979" };
  } else if (bmi < 25) {
    return { category: "Нормальный вес", color: "#6ecf66" };
  } else if (bmi < 30) {
    return { category: "Избыточный вес", color: "#da5050" };
  } else {
    return { category: "Ожирение", color: "#d31c1c" };
  }
}

// Основная функция: запускает расчёт и выводит результат
function calculate() {
  const calculator = document.querySelector(".calculator");
  const bmiDiv = document.querySelector(".bmi");
  const categoryDiv = document.querySelector(".category");

  const userData = getUserData();
  if (!userData) return;

  const bmi = calculateBMI(userData.weight, userData.height);
  const result = getCategory(bmi);

  calculator.style.backgroundColor = result.color;
  bmiDiv.innerHTML = "Ваш ИМТ: " + bmi.toFixed(2);
  categoryDiv.innerHTML = result.category;
}

Шаг шестой


Тестируем приложение

Теперь, когда код готов, можно протестировать калькулятор прямо во встроенном браузере через расширение Live Preview.

Начнём с самого простого случая: оставим оба поля пустыми и нажмём кнопку. Приложение сразу подскажет, что нужно ввести вес. Курсор автоматически переместится в поле ввода веса.

Скриншот: Visual Studio Code / Skillbox Media

Сценарий второй: вводим вес, но поле с ростом оставляем пустым.

Скриншот: Visual Studio Code / Skillbox Media

После нажатия кнопки появится сообщение: «Введите ваш рост!». Курсор снова окажется в нужном поле. Вводим рост и жмём на кнопку:

Скриншот: Visual Studio Code / Skillbox Media

Теперь введём оба значения — вес и рост — и снова нажмём кнопку. Приложение рассчитает индекс массы тела и отобразит результат. Если значение ИМТ попадает в норму, фон калькулятора станет зелёным, а надпись сообщит, что вес нормальный.

Попробуем изменить данные, например уменьшим рост.

Скриншот: Visual Studio Code / Skillbox Media

ИМТ станет выше, и фон сменится на красный. Текст подскажет, что у пользователя ожирение.

Это значит, что калькулятор работает правильно: проверяет данные, рассчитывает ИМТ и корректно реагирует на результаты.

Как открыть калькулятор в браузере

Калькулятор можно запускать не только через Live Preview, но и напрямую в браузере. Для этого:

  • Найдите файл index.html в папке проекта.
  • Дважды кликните по нему — по умолчанию он откроется в браузере.
  • Если открылся не браузер, а, например, текстовый редактор, кликните правой кнопкой по файлу и выберите «Открыть с помощью», затем укажите нужный браузер (например, Google Chrome или Firefox).

Вот так, например, выглядит работающий калькулятор в браузере Firefox:

Скриншот: Firefox / Skillbox Media

Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!



Курс с помощью в трудоустройстве

Профессия Фронтенд-разработчик

Освойте фронтенд без опыта в IT. Практикуйтесь на реальных задачах и находите первых заказчиков в комьюнити Skillbox.

Узнать о курсе →

Курс с трудоустройством: «Профессия Фронтенд-разработчик» Узнать о курсе
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована