Выпей воды

Создание динамичных и отзывчивых веб-интерфейсов может быть сложной задачей, но современные фреймворки, такие как Vue.js, значительно упрощают этот процесс. Vue предлагает реактивность, декларативную разработку и компонентный подход, что позволяет превращать статичные макеты в живые, интерактивные приложения с минимальными усилиями.

Перед вами — наглядный пример того, как просто и элегантно можно создать полезный UI-компонент. Это трекер употребления воды, который визуализирует ваш прогресс. Интерактивность, вычисляемые значения и плавные анимации реализованы с помощью Vue буквально в несколько десятков строк кода.

Ниже вы можете не только протестировать готовый компонент, но и изучить его полный исходный код с подробными пояснениями.

Выпей воды

Цель: {{ total }} литра

{{remained}}л осталось
{{drinked}}%
Выберите количество стаканов, которые вы должны выпить

Внимание! Представленный код — это готовый компонент, но для его работы на странице должен быть установлен и подключен фреймворк Vue. Если вы начинающий разработчик, просто добавьте строку
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
в раздел <head> вашего HTML, и всё заработает.

Разбор кода: как работает этот компонент на Vue.js

Давайте подробно разберем, как устроен этот интерактивный трекер.

Структура и данные (Composition API)

В разделе script мы используем Composition API Vue 3. Функция ref создает реактивные переменные:

  1. total — общая цель в литрах (2л).
  2. glasses — общее количество стаканов для визуализации (8).
  3. drinked — процент выпитой воды (от 0 до 100).
  4. remained — оставшийся объем в литрах.
  5. ind — индекс последнего выбранного стакана.

Логика интерактивности

Ключевая функция handleClick(i) вызывается при клике на стакан:

  1. Она определяет, был ли стакан уже активен, позволяя «отменять» выбор.
  2. Вычисляет новый остаток: remained.value = total.value - ((i + 1) * (total.value / glasses.value)).
  3. На основе остатка вычисляет процент заполнения: drinked.value = 100 - (remained.value / total.value) * 100.

Реактивная связь с шаблоном (HTML)

В шаблоне используется директивы Vue:

  1. {{ total }}, {{ drinked }}% — вывод реактивных данных.
  2. :style="{height: drinked + '%'}" — динамическое изменение высоты столба воды через inline-стили. Vue автоматически обновляет DOM при изменении drinked.
  3. v-for="glass,i in glasses" — рендерим 8 стаканов на основе реактивного массива.
  4. :class="{active: i <= ind}" — условное применение класса active к стаканам, которые должны быть «заполнены».
  5. @click="handleClick(i)" — привязка функции-обработчика к клику.

Стилизация и анимация

В CSS заданы переменные --tr для времени анимации. Плавные переходы (transition) для высоты .app__vessel-top и .app__vessel-bottom создают эффект «переливания» воды при изменении реактивных переменных drinked и remained.

Итог: Этот компонент — отличная иллюстрация мощи Vue.js. Реактивность связывает данные и представление, а логика инкапсулирована в одном компоненте, что делает код чистым, понятным и легко поддерживаемым.

Вдохновились примером?

Мы готовы разработать креативный и функциональный интерфейс для вашего сайта.

Наша веб-студия специализируется на создании современных веб-приложений с использованием Vue.js и других передовых технологий. От сложных интерактивных виджетов и анимированных интерфейсов до полноценных бизнес-приложений — мы воплотим ваши идеи в цифровой реальности.

Напишите нам – и мы разработаем решение, которое будет не только работать безупречно, но и восхищать ваших пользователей.