Проекты
Pet projects
Counter
Описание: Этот проект представляет собой простой счетчик, который позволяет пользователям увеличивать и уменьшать числовое значение, отображаемое на экране. Кроме того, проект включает кнопку для сброса счетчика на ноль.
Концепции обучения:
- Манипулирование DOM: Работа с элементами HTML с помощью JavaScript, включая получение доступа к ним и их изменение.
- Обработка событий: Перехват пользовательских действий (например, кликов мыши) и выполнение соответствующих действий с помощью JavaScript.
- Основные функции JavaScript: Создание функций для выполнения различных задач, таких как увеличение, уменьшение и сброс значения счетчика.
|
|
|
HTML
HTML-код создает основную структуру страницы:
-
Основные элементы:
h2— заголовок “Counter”.h1сid="counter-value"— элемент, отображающий текущее значение счетчика. Значение по умолчанию установлено в0, и этот элемент может быть редактируемым пользователем (contenteditable="true").sectionс классомbtn-areaсодержит три кнопки:- Кнопка с классом
decrease(-) — для уменьшения значения. - Кнопка с классом
reset(↻) — для сброса значения. - Кнопка с классом
increase(+) — для увеличения значения.
- Кнопка с классом
-
Подключение JavaScript:
<script src="./script.js"></script>подключает файл JavaScript, который будет управлять логикой счетчика и обработкой событий.
CSS
CSS стилизует элементы страницы и улучшает внешний вид интерфейса:
- Основные стили:
- Основные стили для страницы (
body) задают фон, шрифт, и выравнивание элементов по центру. - Стили для контейнера
mainделают текст выровненным по центру и задают размер заголовкаh2и значения счетчикаh1. - Стили для кнопок (
.btn) определяют размеры, цвет фона, цвет текста, закругленные углы и анимацию при нажатии.
- Основные стили для страницы (
JavaScript
JavaScript отвечает за обработку событий и изменение значения счетчика. Рассмотрим код подробнее:
-
Получение элементов DOM:
const counterValue = document.getElementById("counter-value");— получает элементh1, отображающий текущее значение счетчика.const allBtn = document.querySelectorAll(".btn");— получает все кнопки с классомbtn(уменьшение, увеличение и сброс).
-
Обработка событий:
- Используется метод
forEachдля перебора всех кнопок и добавления обработчика событийclickдля каждой кнопки:allBtn.forEach((btn) => { btn.addEventListener("click", function (e) { ... }); }); - При нажатии на любую из кнопок вызывается функция, которая определяет, какая кнопка была нажата (используется
e.target.classList).
- Используется метод
-
Логика изменения значения:
- В зависимости от класса нажатой кнопки (
increase,decrease,reset), функция увеличивает, уменьшает или сбрасывает значение счетчика:if (btnClass.contains("increase")) { count++; } else if (btnClass.contains("decrease")) { count--; } else if (btnClass.contains("reset")) { count = 0; }
- В зависимости от класса нажатой кнопки (
-
Изменение цвета в зависимости от значения счетчика:
- Если значение счетчика положительное, его цвет устанавливается в зеленый. Если отрицательное — в красный. Если счетчик равен нулю, цвет остается черным:
if (count > 0) { counterValue.style.color = "green"; } else if (count < 0) { counterValue.style.color = "red"; } else { counterValue.style.color = "black"; }
- Если значение счетчика положительное, его цвет устанавливается в зеленый. Если отрицательное — в красный. Если счетчик равен нулю, цвет остается черным:
-
Обновление значения счетчика:
- После всех вычислений обновляется текст внутри элемента
h1с новым значением счетчика:counterValue.innerText = count;
- После всех вычислений обновляется текст внутри элемента
1. Добавление инкремента и декремента по шагу
- Описание: Введение возможности увеличения или уменьшения значения счетчика на заданное число (например, +5 или -5) вместо стандартного шага в 1.
- Цель: Практика работы с атрибутами HTML и их изменением с помощью JavaScript.
- Реализация: Добавить поле ввода, в котором пользователь сможет указать шаг изменения, и обновить логику обработки событий для использования этого значения.
2. Добавление функционала хранения данных в локальном хранилище (localStorage)
- Описание: Сохранение текущего значения счетчика в
localStorageбраузера, чтобы оно сохранялось между сессиями. - Цель: Изучение работы с локальным хранилищем браузера.
- Реализация: При изменении значения счетчика обновлять данные в
localStorage, а при загрузке страницы проверять наличие сохраненного значения и восстанавливать его.
3. Реализация ограничения на минимальное и максимальное значения счетчика
- Описание: Установить ограничения на минимальное и максимальное значения счетчика (например, от -10 до 10).
- Цель: Изучение использования условных операторов и логики для валидации ввода.
- Реализация: Добавить проверку в обработчик событий, чтобы не позволять пользователю превышать установленные пределы, и выводить предупреждающее сообщение.
4. Добавление анимаций при изменении значения
- Описание: Введение анимаций при изменении значения счетчика, например, плавное увеличение или уменьшение числа.
- Цель: Изучение работы с CSS-анимациями и их активацией с помощью JavaScript.
- Реализация: Добавить CSS-анимации для изменения цвета, размера текста или других стилей и запускать их в обработчиках событий.
5. Создание визуальной диаграммы изменений
- Описание: Добавление диаграммы или графика, который отображает изменения значений счетчика в реальном времени.
- Цель: Изучение работы с библиотеками для построения графиков, таких как Chart.js.
- Реализация: Использовать массив для хранения всех изменений значения счетчика и обновлять график при каждом изменении.
6. Добавление таймера для автоматического изменения значения счетчика
- Описание: Создать таймер, который будет автоматически увеличивать или уменьшать значение счетчика через заданный интервал времени.
- Цель: Практика работы с функцией
setIntervalиclearInterval. - Реализация: Добавить кнопку для запуска и остановки таймера, который будет автоматически изменять значение счетчика с определенной частотой.
7. Реализация звукового сопровождения
- Описание: Добавить звуковые эффекты при нажатии кнопок (увеличение, уменьшение, сброс).
- Цель: Изучение работы с аудио в браузере.
- Реализация: Использовать API Audio для воспроизведения звуков при каждом действии пользователя.
8. Поддержка горячих клавиш для управления счетчиком
- Описание: Реализовать управление счетчиком с помощью горячих клавиш (например, стрелки вверх/вниз для увеличения/уменьшения, клавиша
Rдля сброса). - Цель: Практика работы с обработчиками событий клавиатуры.
- Реализация: Добавить глобальный обработчик события
keydownи проверить, какая клавиша была нажата, чтобы выполнить соответствующее действие.
9. Создание пользовательского интерфейса с помощью CSS Grid или Flexbox
- Описание: Улучшение пользовательского интерфейса счетчика с использованием CSS Grid или Flexbox для лучшего расположения элементов.
- Цель: Закрепление навыков работы с современными методами создания макетов.
- Реализация: Переработать существующий макет, используя CSS Grid или Flexbox, чтобы сделать интерфейс более адаптивным и визуально приятным.
10. Добавление функции сброса по таймеру
- Описание: Реализовать возможность сброса счетчика через определенный промежуток времени.
- Цель: Практика работы с функциями
setTimeoutиclearTimeout. - Реализация: Добавить кнопку, которая запускает таймер для сброса значения через заданный промежуток времени.
DadJokes
Описание: Проект использует внешний API для получения случайных шуток про отца с использованием асинхронных методов на JavaScript. После получения данные отображаются на веб-странице в виде шутки для развлечения пользователей.
Концепции обучения:
- Асинхронное программирование: Работа с операциями, требующими времени для завершения (например, получение данных из API), без блокировки основного потока выполнения в JavaScript.
- Fetch API: Использование встроенных функций браузера для выполнения HTTP-запросов к API и получения данных.
- Работа с API: Взаимодействие с внешними API для доступа к данным или функциональным возможностям, предоставляемым этими сервисами.
|
|
|
HTML
HTML-код создает базовую структуру страницы:
-
Основные элементы:
h3— заголовок “Don’t Laugh Challenge”.divс классомjokesDiv— элемент, в котором отображается текст шутки. Изначально в нем отображается “Getting Jokes…”.buttonс классомjokesGeneratorBtn— кнопка для получения новой шутки.
-
Подключение JavaScript:
<script src="./script.js"></script>подключает файл JavaScript, который будет отвечать за получение и отображение шуток.
CSS
CSS оформляет элементы страницы для улучшения внешнего вида:
- Основные стили:
- Стили для всего тела (
body), чтобы разместить элементы по центру страницы и задать им фон. - Оформление контейнера
.container, где находятся заголовок, шутка и кнопка, с использованием тени, закругленных углов и внутреннего отступа. - Стили для
.jokesDivделают текст шутки крупным и хорошо читаемым. - Кнопка
.jokesGeneratorBtnимеет стили для изменения цвета, формы и анимации при нажатии.
- Стили для всего тела (
JavaScript
JavaScript отвечает за взаимодействие с API и обработку событий. Рассмотрим код подробнее:
-
Получение элементов DOM:
const jokesDiv = document.querySelector(".jokesDiv");— получает элементdiv, в котором будет отображаться шутка.const generatorBtn = document.querySelector(".jokesGeneratorBtn");— получает кнопку для генерации новой шутки.
-
Установка URL API и таймера:
const url = "https://icanhazdadjoke.com/";— URL API, который возвращает случайную шутку.let timer_on = 10000;— интервал в миллисекундах (10 секунд), через который будет автоматически генерироваться новая шутка.let interval;— переменная для хранения интервала таймера.
-
Функция для запуска интервала:
function startInterval() { interval = setInterval(generateJokes, timer_on); }— функция для запуска интервала, который вызываетgenerateJokesкаждые 10 секунд.
-
Асинхронная функция для получения шуток:
async function generateJokes()— асинхронная функция для получения данных шутки из API.- В начале функция отключает кнопку, чтобы предотвратить повторные нажатия во время выполнения запроса:
generatorBtn.setAttribute("disabled", "disabled"); - Функция выполняет HTTP-запрос с использованием
fetchи передает заголовок, чтобы получить данные в формате JSON:const response = await fetch(url, { headers: { Accept: "application/json", }, }); const joke = await response.json(); - Если запрос проходит успешно, текст шутки отображается в
jokesDiv. Если произошла ошибка, выводится сообщение об ошибке:jokesDiv.innerHTML = joke.joke; // или, в случае ошибки: jokesDiv.innerHTML = "Error getting jokes"; - В блоке
finallyкнопка снова активируется для пользователя:generatorBtn.removeAttribute("disabled");
-
Запуск первой шутки и интервала:
generateJokes();— вызывается для получения первой шутки при загрузке страницы.startInterval();— запускает интервал, чтобы автоматически получать новые шутки каждые 10 секунд.
-
Обработчик события для кнопки:
generatorBtn.addEventListener("click", function () { ... });— добавляет обработчик события для кнопки. При нажатии на кнопку:- Снова вызывается функция
generateJokes(). - Сбрасывается текущий интервал таймера и запускается новый, чтобы отсчет начинался заново после каждого нажатия.
- Снова вызывается функция
1. Добавление функции поиска шуток по ключевому слову
- Описание: Позволить пользователям искать шутки, используя ключевые слова.
- Цель: Практика работы с параметрами запросов в API и обработка пользовательского ввода.
- Реализация: Добавить поле ввода для ключевых слов и кнопку поиска. При нажатии кнопки отправлять запрос к API с ключевым словом и отображать результаты.
2. Добавление кнопки для сохранения избранных шуток
- Описание: Возможность сохранять любимые шутки в избранное.
- Цель: Закрепление навыков работы с
localStorageилиsessionStorageдля хранения данных на стороне клиента. - Реализация: Добавить кнопку “Добавить в избранное” рядом с каждой шуткой. При нажатии на кнопку шутка сохраняется в
localStorage, и пользователь может просмотреть все избранные шутки в отдельном разделе.
3. Реализация функции “Поделиться шуткой”
- Описание: Возможность поделиться шуткой через социальные сети или скопировать её в буфер обмена.
- Цель: Изучение работы с API социальных сетей и API буфера обмена.
- Реализация: Добавить кнопки “Поделиться” для каждой шутки с опциями для Twitter, Facebook и копирования текста в буфер обмена.
4. Добавление анимаций и визуальных эффектов
- Описание: Использование анимаций для отображения новой шутки или избранных шуток.
- Цель: Изучение CSS-анимаций и их динамического включения с помощью JavaScript.
- Реализация: Добавить анимацию при появлении новой шутки, используя CSS и JavaScript для управления классами и стилями.
5. Добавление таймера для автоматического обновления шуток
- Описание: Возможность включить таймер, который будет автоматически запрашивать новую шутку через заданный интервал времени.
- Цель: Практика работы с функциями
setIntervalиclearInterval. - Реализация: Добавить кнопку для включения/выключения таймера. При нажатии на кнопку шутки будут автоматически обновляться каждые несколько секунд или минут.
6. Реализация офлайн-режима
- Описание: Кэширование шуток для их отображения в офлайн-режиме.
- Цель: Изучение использования Service Workers и кэширования данных в браузере.
- Реализация: Настроить Service Worker для кэширования данных API, чтобы шутки были доступны, даже если пользователь потеряет подключение к интернету.
7. Добавление рейтинговой системы для шуток
- Описание: Возможность оценивать шутки (например, лайки или звезды).
- Цель: Изучение работы с элементами интерфейса и взаимодействие с сервером или локальным хранилищем для сохранения рейтингов.
- Реализация: Добавить кнопки для оценки каждой шутки и отобразить общий рейтинг рядом с каждой шуткой.
8. Добавление режима “Тёмная тема”
- Описание: Добавление переключателя между светлой и тёмной темами интерфейса.
- Цель: Практика работы с темами и изменением CSS-переменных или классов.
- Реализация: Добавить переключатель на странице, который изменяет тему с помощью CSS-переменных или добавления/удаления классов.
9. Поддержка мультиязычности
- Описание: Возможность выбирать язык интерфейса и шуток.
- Цель: Изучение работы с API, поддерживающими мультиязычность, и навыки интернационализации интерфейсов.
- Реализация: Добавить переключатель языка, который будет изменять язык интерфейса и отправлять запросы к API с параметром языка.
10. Добавление прогрессивного загрузчика
- Описание: Показать прогресс загрузки при получении новой шутки.
- Цель: Изучение управления асинхронными запросами и визуальной обратной связи.
- Реализация: Добавить индикатор загрузки (например, спиннер) для отображения прогресса загрузки данных из API.
11. Добавление голосового вывода шуток
- Описание: Возможность воспроизведения шуток голосом.
- Цель: Изучение работы с Web Speech API для текстового синтеза речи.
- Реализация: Использовать Web Speech API для чтения шутки вслух по нажатию кнопки.
Random Dog
Описание: Проект предназначен для получения случайных изображений собак из внешнего API с использованием асинхронных методов на JavaScript. Полученные изображения отображаются на веб-странице в качестве развлечения для пользователей.
Концепции обучения:
- Асинхронное программирование: Обработка операций, требующих времени для завершения (например, получение данных из API), без блокировки основного потока выполнения в JavaScript.
- Fetch API: Использование встроенных функций браузера для выполнения HTTP-запросов к API и получения данных.
- Работа с API: Взаимодействие с внешними API для доступа к данным или функциональным возможностям, предоставляемым этими сервисами.
|
|
|
HTML
-
Основные элементы:
h3— заголовок “Random Dog Image Generator”.divс классомimageDiv— элемент, содержащий изображение случайной собаки. Изначально в элементеimgустановлено пустое значениеsrc.buttonс классомimageGeneratorBtn— кнопка для получения нового изображения.
-
Подключение JavaScript:
<script src="./script.js"></script>подключает файл JavaScript, который будет отвечать за получение и отображение изображения.
CSS
- Основные стили:
- Стили для всего тела (
body), чтобы разместить элементы по центру страницы и задать им фон. - Оформление контейнера
.container, где находятся заголовок, изображение и кнопка, с использованием тени, закругленных углов и внутреннего отступа. - Стили для
.imageDivделают изображение адаптивным и ограничивают его размер. - Кнопка
.imageGeneratorBtnимеет стили для изменения цвета, формы и анимации при нажатии.
- Стили для всего тела (
JavaScript
-
Получение элементов DOM:
const imageDiv = document.querySelector(".imageDiv");— получает контейнер для изображения.const generatorBtn = document.querySelector(".imageGeneratorBtn");— получает кнопку для генерации нового изображения.const dogImage = document.getElementById("dogImage");— получает элементimgдля отображения изображения.
-
Установка URL API и таймера:
const url = "https://dog.ceo/api/breeds/image/random";— URL API, который возвращает случайное изображение собаки.let timer_on = 10000;— интервал в миллисекундах (10 секунд), через который будет автоматически генерироваться новое изображение.let interval;— переменная для хранения интервала таймера.
-
Функция для запуска интервала:
function startInterval() { interval = setInterval(generateImage, timer_on); }— функция для запуска интервала, который вызываетgenerateImageкаждые 10 секунд.
-
Асинхронная функция для получения изображения:
async function generateImage()— асинхронная функция для получения данных изображения из API.- В начале функция отключает кнопку, чтобы предотвратить повторные нажатия во время выполнения запроса:
generatorBtn.setAttribute("disabled", "disabled"); - Функция выполняет HTTP-запрос с использованием
fetchи получает данные в формате JSON:const response = await fetch(url); const data = await response.json(); - Если запрос проходит успешно, URL изображения устанавливается в качестве значения
srcдля элементаimg. Если произошла ошибка, выводится сообщение об ошибке:dogImage.src = data.message; // или, в случае ошибки: imageDiv.innerHTML = "Error getting image"; - В блоке
finallyкнопка снова активируется для пользователя:generatorBtn.removeAttribute("disabled");
-
Запуск первого изображения и интервала:
generateImage();— вызывается для получения первого изображения при загрузке страницы.startInterval();— запускает интервал, чтобы автоматически получать новые изображения каждые 10 секунд.
-
Обработчик события для кнопки:
generatorBtn.addEventListener("click", function () { ... });— добавляет обработчик события для кнопки. При нажатии на кнопку:- Снова вызывается функция
generateImage(). - Сбрасывается текущий интервал таймера и запускается новый, чтобы отсчет начинался заново после каждого нажатия.
- Снова вызывается функция
1. Создание галереи изображений собак
- Описание: Добавить возможность просматривать и сохранять несколько изображений собак в виде галереи.
- Цель: Закрепление навыков работы с массивами, циклами и манипуляцией DOM.
- Реализация: Создать галерею с миниатюрами изображений и кнопкой “Показать больше”, которая добавляет новые изображения по запросу к API.
2. Добавление функции сохранения изображений в избранное
- Описание: Позволить пользователям сохранять понравившиеся изображения в избранное.
- Цель: Практика работы с
localStorageилиsessionStorageдля хранения данных на стороне клиента. - Реализация: Добавить кнопку “Добавить в избранное” рядом с каждым изображением. При нажатии на кнопку изображение сохраняется в
localStorage, и пользователь может просмотреть все избранные изображения в отдельном разделе.
3. Реализация функции загрузки изображений
- Описание: Возможность загрузки понравившихся изображений собак на устройство пользователя.
- Цель: Изучение работы с атрибутами HTML и ссылками для загрузки файлов.
- Реализация: Добавить кнопку “Скачать”, которая создает ссылку на изображение и инициирует его загрузку на устройство пользователя.
4. Добавление автоматической смены изображений (слайд-шоу)
- Описание: Введение функции автоматической смены изображений собак через определенные промежутки времени.
- Цель: Практика работы с функциями
setIntervalиclearIntervalи взаимодействие с DOM. - Реализация: Добавить кнопку для включения/выключения слайд-шоу. При включении слайд-шоу изображения будут автоматически обновляться каждые несколько секунд.
5. Реализация адаптивного дизайна
- Описание: Сделать интерфейс приложения адаптивным для разных устройств, включая мобильные телефоны и планшеты.
- Цель: Закрепление навыков использования Flexbox, Grid и медиа-запросов в CSS.
- Реализация: Оптимизировать макет для разных размеров экранов, чтобы интерфейс оставался удобным и привлекательным на любом устройстве.
6. Добавление голосового управления
- Описание: Позволить пользователям запрашивать изображения собак голосовыми командами.
- Цель: Изучение использования Web Speech API для обработки голосовых команд.
- Реализация: Добавить кнопку для активации голосового ввода, использовать Web Speech API для распознавания команд, таких как “покажи другую собаку” или “покажи лабрадора”.
7. Добавление функции загрузки пользовательских изображений
- Описание: Возможность пользователям загружать свои фотографии собак и добавлять их в галерею.
- Цель: Практика работы с формами и загрузкой файлов в JavaScript.
- Реализация: Добавить элемент формы для загрузки изображения, а также превью и кнопки для сохранения и добавления в галерею.
8. Добавление темной и светлой темы
- Описание: Реализовать поддержку светлой и темной тем для пользовательского интерфейса.
- Цель: Закрепление навыков работы с темами и изменением CSS-переменных или классов.
- Реализация: Добавить переключатель темы на странице, который будет изменять тему с помощью CSS-переменных или добавления/удаления классов.
9. Поддержка мультиязычности
- Описание: Возможность переключения языка интерфейса.
- Цель: Изучение принципов интернационализации (i18n) и работы с различными языковыми наборами.
- Реализация: Добавить переключатель языка, который будет изменять текст интерфейса в зависимости от выбранного языка.
10. Интеграция с социальными сетями
- Описание: Возможность делиться изображениями собак через социальные сети.
- Цель: Изучение взаимодействия с API социальных сетей и создания ссылок для публикации контента.
- Реализация: Добавить кнопки для публикации изображений в социальных сетях.
11. Реализация офлайн-режима
- Описание: Кэшировать изображения собак для их отображения в офлайн-режиме.
- Цель: Изучение использования Service Workers и кэширования данных в браузере.
- Реализация: Настроить Service Worker для кэширования изображений и основных данных, чтобы они были доступны, даже если пользователь потеряет подключение к интернету.
Form Validation
Описание: Проект демонстрирует проверку формы на стороне клиента с использованием JavaScript. В процессе выполнения проверяются данные, введенные пользователем в форму, перед отправкой. При успешной проверке отображается сообщение об успехе, а введенные данные становятся доступными для просмотра в режиме только для чтения.
Концепции обучения:
- Валидация формы: Использование JavaScript для проверки данных, вводимых пользователем в форму, перед их отправкой. Это позволяет обеспечить целостность данных и предотвратить обработку недействительных значений.
- Манипулирование DOM: Получение доступа к элементам формы и их изменение (например, вывод сообщений об ошибках или отключение полей ввода) на основе результатов проверки.
- Обработка событий: Перехват события отправки формы и выполнение логики проверки с помощью JavaScript.
|
|
|
HTML
HTML-код создает структуру страницы и форму для ввода данных:
-
Основные элементы:
divс классомcontainerиid="main-page"содержит форму регистрации.formс классомformиid="form"— сама форма с несколькими полями ввода: “Имя пользователя”, “Email”, “Пароль”, “Повторите пароль”.- В каждом
divс классомform-groupсодержатся элементы ввода (input), иконки для индикации статуса (успех или ошибка), иsmallдля отображения сообщений об ошибках.
-
Сообщение об успехе:
divсid="submitted-msg"содержит сообщение об успешной регистрации и кнопку для предварительного просмотра введенных данных.
-
Подключение JavaScript:
<script src="script.js"></script>подключает файл JavaScript для обработки проверки формы и отображения сообщений.
CSS
CSS стилизует элементы страницы, обеспечивая удобство использования и привлекательный внешний вид:
-
Основные стили:
- Основные стили для страницы, включая фон, шрифт и размещение контейнера формы по центру.
- Стили для контейнера
.container, формы, заголовков, иконок и сообщений об ошибках. - Стили для кнопок с различными эффектами при наведении курсора и нажатии.
-
Респонсивность:
- Использование медиа-запросов для адаптации формы под разные размеры экранов.
JavaScript
JavaScript отвечает за логику проверки данных, обработку событий и отображение сообщений. Рассмотрим код подробнее:
-
Получение элементов формы:
const form = document.getElementById("form");— получает форму поid.const userName,email,password,cpassword— получают поля ввода формы поid.
-
Обработка события отправки формы:
form.addEventListener("submit", (event) => { ... });— добавляет обработчик событияsubmitдля формы. При попытке отправки формы выполняется логика проверки:event.preventDefault();предотвращает стандартное поведение отправки формы.- Вызывается функция
validate()для проверки введенных данных.
-
Проверка правильности данных:
- Функция
isEmail(emailVal)— проверяет, является ли введенное значение корректным email-адресом. - Функция
validate()— выполняет проверку данных для каждого поля формы:- Проверяет, не пустое ли поле, соответствует ли длина минимальным требованиям, и совпадают ли пароли.
- В случае ошибки вызывает
setErrorMsg(input, message), чтобы указать на ошибку. - В случае успеха вызывает
setSuccessmsg(input)для отображения статуса “успех”.
- Функция
-
Отображение сообщений:
- Функция
setErrorMsg(input, errormsg)— добавляет классerrorкform-groupи выводит сообщение об ошибке. - Функция
setSuccessmsg(input)— добавляет классsuccessкform-group, чтобы показать успешное прохождение проверки. - Функция
showSubmittedMsg()— скрывает форму и отображает сообщение об успешной регистрации.
- Функция
-
Предпросмотр данных:
- Функция
previewForm()— отображает введенные данные в форме в режиме только для чтения. Кнопка “Отправить” блокируется и стилизуется как неактивная.
- Функция
1. Добавление асинхронной валидации через API
- Описание: Проверка введенных данных, таких как имя пользователя или email, в реальном времени через запросы к серверу или API.
- Цель: Изучение асинхронного программирования и работы с Fetch API для выполнения запросов.
- Реализация: Добавить обработчик событий для ввода в поле email или имя пользователя, который будет отправлять запрос к API для проверки доступности и корректности введенных данных.
2. Реализация динамического отображения ошибок
- Описание: Динамическое отображение сообщений об ошибках, которые появляются или исчезают в зависимости от правильности ввода данных.
- Цель: Практика работы с DOM и управлением элементами интерфейса.
- Реализация: Создать функции, которые динамически добавляют или удаляют сообщения об ошибках и применяют стили к полям формы при вводе данных.
3. Создание пользовательского интерфейса с использованием CSS-анимаций
- Описание: Использование анимаций для плавного появления и исчезновения сообщений об ошибках или успешной валидации.
- Цель: Закрепление навыков работы с CSS-анимациями и переходами.
- Реализация: Добавить CSS-анимации для элементов формы, таких как сообщения об ошибках или всплывающие подсказки, чтобы сделать интерфейс более интерактивным и дружелюбным.
4. Добавление проверки на стороне клиента с регулярными выражениями (RegEx)
- Описание: Использование регулярных выражений для проверки вводимых данных (например, формата email, номера телефона или пароля).
- Цель: Изучение работы с регулярными выражениями в JavaScript.
- Реализация: Создать функции для проверки различных полей формы с использованием регулярных выражений и выводить сообщения об ошибках при некорректном вводе.
5. Реализация функции “Показать/Скрыть пароль”
- Описание: Добавить возможность отображать или скрывать введенный пароль.
- Цель: Практика работы с элементами интерфейса и обработкой событий.
- Реализация: Добавить иконку “глаза” рядом с полем ввода пароля. При клике на иконку переключать атрибут
typeполя ввода междуpasswordиtext.
6. Добавление индикатора надежности пароля
- Описание: Показать уровень надежности пароля с использованием графического индикатора.
- Цель: Закрепление навыков работы с CSS и JavaScript для динамического обновления интерфейса.
- Реализация: Реализовать индикатор, который будет изменять цвет и длину в зависимости от сложности пароля (например, длины, наличия специальных символов, цифр и заглавных букв).
7. Добавление сохранения состояния формы
- Описание: Автоматическое сохранение данных формы в
localStorage, чтобы пользователи не потеряли введенные данные при случайной перезагрузке страницы. - Цель: Изучение работы с
localStorageдля хранения данных на стороне клиента. - Реализация: При каждом вводе данных сохранять текущее состояние формы в
localStorage, а при загрузке страницы восстанавливать данные изlocalStorage.
8. Добавление валидации на стороне сервера
- Описание: Реализовать валидацию на стороне сервера с использованием API.
- Цель: Закрепление навыков асинхронного взаимодействия с сервером и работы с JSON.
- Реализация: Отправлять данные формы на сервер для дополнительной проверки через Fetch API и отображать результаты валидации на клиентской стороне.
9. Добавление многошаговой формы (Wizard Form)
- Описание: Разделение формы на несколько шагов с динамическим управлением переходами между шагами.
- Цель: Практика работы с динамическими элементами интерфейса и управлением состоянием формы.
- Реализация: Создать несколько шагов формы с кнопками “Далее” и “Назад”, чтобы пользователь мог последовательно вводить данные. Добавить индикатор прогресса для визуализации этапов.
10. Реализация мультиязычности
- Описание: Возможность переключения языка интерфейса.
- Цель: Закрепление навыков работы с интернационализацией (i18n).
- Реализация: Добавить переключатель языка, который будет изменять текст всех сообщений и подсказок в форме.
11. Создание адаптивного дизайна формы
- Описание: Обеспечить корректное отображение формы на устройствах с различными размерами экрана.
- Цель: Закрепление навыков работы с CSS Grid, Flexbox и медиа-запросами.
- Реализация: Оптимизировать макет формы для мобильных устройств, планшетов и настольных компьютеров.
12. Добавление проверки по капче или reCAPTCHA
- Описание: Добавить защиту формы от спама с помощью CAPTCHA или reCAPTCHA.
- Цель: Изучение работы с внешними сервисами и интеграция API в проект.
- Реализация: Внедрить Google reCAPTCHA или другую проверку CAPTCHA перед отправкой формы.
13. Создание пользовательских всплывающих сообщений об ошибках
- Описание: Использовать модальные окна или всплывающие уведомления для отображения сообщений об ошибках.
- Цель: Практика работы с модальными окнами, их открытием и закрытием.
- Реализация: Создать кастомные уведомления об ошибках, которые будут появляться в центре экрана и исчезать автоматически через несколько секунд.
14. Добавление анимации переходов между шагами
- Описание: Создать плавные анимации при переходе между шагами многошаговой формы.
- Цель: Закрепление навыков работы с CSS-анимациями и управлением состоянием элементов с помощью JavaScript.
- Реализация: Добавить CSS-анимации, которые будут активироваться при переходе между шагами.
15. Внедрение валидации на основе правил для различных типов полей
- Описание: Использование заранее заданных правил для валидации полей разных типов (например, текст, email, телефон).
- Цель: Закрепление знаний о валидации данных и оптимизация кода.
- Реализация: Создать функции для валидации различных типов полей и применить их ко всем соответствующим полям формы.
Random User
Описание: Проект использует API для генерации случайной информации о пользователе. В процессе работы с API получаются данные, такие как имя, электронная почта, аватар и другие, которые отображаются на веб-странице в виде профиля случайного пользователя.
Концепции обучения:
- Асинхронное программирование: Закрепление навыков выполнения асинхронных операций в JavaScript.
- Fetch API: Практика использования встроенных функций для выполнения HTTP-запросов к API и получения данных.
- Работа с API: Изучение взаимодействия с внешними API для доступа к различным функциям или данным.
|
|
|
HTML
HTML-код создает основную структуру страницы:
-
Основные элементы:
mainс классомmain-section— основной контейнер для элементов.divс классомcard— карточка для отображения данных о случайном пользователе.- Внутри карточки находятся:
divсid="user-image"— контейнер для изображения пользователя.- Несколько
divс классомuser-info-innerи соответствующимиid(например,user-name-div,user-email-div), которые содержат информацию о пользователе (имя, email, телефон и адрес). divс классомicon-area— блок с иконками, которые при клике отображают определенную информацию о пользователе (имя, email, телефон, адрес).
-
Подключение JavaScript:
<script src="script.js"></script>подключает файл JavaScript, который отвечает за получение и отображение данных о пользователе.
CSS
CSS стилизует элементы страницы, делая интерфейс привлекательным и удобным для пользователя:
-
Основные стили:
- Основные стили для страницы (
body), включая шрифт, фон и размещение контейнера по центру. - Стили для карточки (
.card), которая содержит данные о пользователе. Карточка имеет закругленные углы, тени и делится на верхнюю (top-section) и нижнюю (bottom-section) части. - Стили для иконок (
.icon-area), которые позволяют пользователю выбирать, какую информацию отображать на карточке.
- Основные стили для страницы (
-
Адаптивный дизайн:
- Использование медиа-запросов для адаптации карточки под разные размеры экранов, обеспечивая корректное отображение на мобильных устройствах.
JavaScript
JavaScript отвечает за взаимодействие с API, обработку данных и отображение их на странице. Рассмотрим код подробнее:
-
Определение URL API и функция
apiFetch():const url = "https://randomuser.me/api/";— URL для получения случайной информации о пользователе с помощью API.function apiFetch()— функция для выполнения запроса к API и получения данных о пользователе:- Используется метод
fetchдля отправки запроса к API. - Полученный ответ преобразуется в формат JSON, и данные передаются в функцию
showDataOnUi(data)для отображения на странице.
- Используется метод
-
Функция
showDataOnUi(data):- Получает данные о пользователе и отображает их на странице:
- Извлекает имя, email, телефон, местоположение и изображение пользователя из полученных данных:
const userName = `${data.results[0].name.first + " " + data.results[0].name.last}`; const userEmail = `${data.results[0].email}`; const userPhone = `${data.results[0].phone}`; const location = `${data.results[0].location.city + ", " + data.results[0].location.country}`; const image = `<img src="${data.results[0].picture.large}" alt=""/>`; - Устанавливает соответствующие значения в элементы DOM:
document.getElementById("user-name").innerText = userName; document.getElementById("user-email").innerText = userEmail; document.getElementById("user-phone").innerText = userPhone; document.getElementById("user-address").innerText = location; document.getElementById("user-image").innerHTML = image;
-
Функции для отображения выбранной информации:
- Функция
displayCurrentInfo(id1, id2, id3, id4)— отображает выбранную информацию и скрывает остальные:function displayCurrentInfo(id1, id2, id3, id4) { document.getElementById(id1).style.display = "block"; document.getElementById(id2).style.display = "none"; document.getElementById(id3).style.display = "none"; document.getElementById(id4).style.display = "none"; } - Функции
showUserName(),showUserEmail(),showUserPhone(),showUserLocation()— используютdisplayCurrentInfoдля отображения конкретной информации (например, имени, email и т.д.) при клике на соответствующую иконку.
- Функция
-
Инициализация и обновление данных:
apiFetch()— вызывается при загрузке страницы, чтобы сразу отобразить данные о случайном пользователе.function genrateNewUser()— вызывается при клике на кнопку “Generate New User” для получения новых данных о пользователе.
-
Дополнительные функции:
- Функция
setTimeout()используется для скрытия водяного знака через 2.5 секунды после загрузки страницы:setTimeout(() => { document.getElementById("watermark").style.display = "none"; }, 2500);
- Функция
1. Добавление функции поиска и фильтрации пользователей
- Описание: Возможность фильтровать пользователей по определенным критериям (например, по полу, возрасту, стране и т.д.).
- Цель: Практика работы с параметрами запросов API и фильтрацией данных.
- Реализация: Добавить поля выбора или фильтры, которые будут отправлять соответствующие параметры в запрос к API и отображать результаты на основе выбранных критериев.
2. Реализация функции сохранения избранных пользователей
- Описание: Позволить пользователям сохранять информацию о понравившихся пользователях в избранное.
- Цель: Закрепление навыков работы с
localStorageилиsessionStorageдля хранения данных на стороне клиента. - Реализация: Добавить кнопку “Добавить в избранное” рядом с каждым пользователем. При нажатии на кнопку информация о пользователе сохраняется в
localStorage, и пользователь может просмотреть всех избранных пользователей в отдельном разделе.
3. Создание карточек с пользователями в виде сетки или списка
- Описание: Отображение информации о пользователях в виде карточек, размещенных в сетке или списке.
- Цель: Закрепление навыков работы с CSS Grid или Flexbox для создания адаптивных макетов.
- Реализация: Разместить информацию о каждом пользователе в карточке с использованием CSS Grid или Flexbox для создания привлекательного и адаптивного дизайна.
4. Реализация функции поиска по имени пользователя
- Описание: Возможность поиска пользователей по имени.
- Цель: Практика работы с фильтрацией данных и обработкой пользовательского ввода.
- Реализация: Добавить поле поиска, которое будет фильтровать отображаемых пользователей в реальном времени по введенному имени.
5. Добавление анимации при загрузке данных
- Описание: Показать индикатор загрузки или анимацию во время запроса к API.
- Цель: Изучение управления асинхронными запросами и визуальная обратная связь пользователю.
- Реализация: Добавить индикатор загрузки (например, спиннер) и скрывать его при получении данных из API.
6. Добавление функции сортировки пользователей
- Описание: Возможность сортировки пользователей по различным критериям, таким как имя, возраст, страна и т.д.
- Цель: Закрепление навыков работы с массивами и методами сортировки.
- Реализация: Добавить элементы управления для выбора сортировки и реализовать соответствующую логику сортировки при нажатии на элементы управления.
7. Добавление возможности редактирования и сохранения информации о пользователях
- Описание: Возможность редактировать информацию о пользователях и сохранять изменения в
localStorage. - Цель: Практика работы с формами, обработкой событий и
localStorage. - Реализация: Добавить кнопку “Редактировать” на карточках пользователей, при нажатии на которую отображаются поля ввода для редактирования информации.
8. Реализация темной и светлой темы интерфейса
- Описание: Возможность переключения между светлой и темной темами интерфейса.
- Цель: Закрепление навыков работы с темами и изменением CSS-переменных или классов.
- Реализация: Добавить переключатель темы на странице, который будет изменять тему с помощью CSS-переменных или добавления/удаления классов.
9. Добавление функции экспорта данных в различные форматы
- Описание: Возможность экспорта данных пользователей в файлы разных форматов (например, CSV, JSON).
- Цель: Изучение работы с данными в различных форматах и API для скачивания файлов.
- Реализация: Добавить кнопку “Экспорт”, которая будет генерировать файл с данными о пользователях и предоставлять возможность скачать его.
10. Реализация многоязычной поддержки интерфейса
- Описание: Возможность переключения языка интерфейса.
- Цель: Закрепление навыков интернационализации (i18n).
- Реализация: Добавить переключатель языка, который будет изменять текст всех элементов интерфейса в зависимости от выбранного языка.
11. Создание функции автоматического обновления списка пользователей
- Описание: Введение таймера, который автоматически обновляет список пользователей через заданные интервалы времени.
- Цель: Практика работы с функциями
setIntervalиclearInterval. - Реализация: Добавить кнопку для включения/выключения автоматического обновления и реализацию соответствующего таймера.
12. Добавление поддержки загрузки пользовательских аватаров
- Описание: Возможность пользователям загружать свои собственные изображения для профиля.
- Цель: Закрепление навыков работы с формами и загрузкой файлов в JavaScript.
- Реализация: Добавить элемент формы для загрузки изображения и реализовать предварительный просмотр перед сохранением.
13. Интеграция с картами для отображения местоположения пользователя
- Описание: Отображение местоположения пользователя на карте (например, с использованием Google Maps API).
- Цель: Изучение работы с внешними API и отображением географических данных.
- Реализация: Добавить кнопку “Показать на карте” рядом с адресом пользователя, которая открывает карту с указанием местоположения.
14. Реализация функции уведомлений
- Описание: Отправка уведомлений пользователю, когда появляется новый пользователь или информация обновляется.
- Цель: Изучение работы с уведомлениями браузера.
- Реализация: Использовать Web Notifications API для отображения уведомлений на рабочем столе при обновлении данных.
15. Добавление функции “Сравнение пользователей”
- Описание: Возможность выбрать нескольких пользователей для сравнения их данных.
- Цель: Закрепление навыков работы с массивами и объектами, а также манипуляций с DOM.
- Реализация: Добавить флажки для выбора пользователей и кнопку “Сравнить”, которая будет отображать таблицу или модальное окно с сравнением выбранных пользователей.
Morse Code Translator
Описание: Проект позволяет пользователям переводить текст в азбуку Морзе и обратно. Пользователь может ввести текст и получить соответствующий перевод в азбуку Морзе или ввести код Морзе и получить его перевод в текст.
Концепции обучения:
- Манипулирование строками: Работа с строками в JavaScript, включая функции для разбиения, объединения и обработки символов, которые необходимы для перевода азбуки Морзе.
- Условные операторы: Использование условных операторов (if/else) в JavaScript для реализации логики перевода в зависимости от пользовательского ввода (текста или кода Морзе).
|
|
|
HTML
HTML-код создает структуру страницы с элементами управления и информационными разделами:
-
Навигация:
<nav>содержит ссылки на главную страницу и репозиторий проекта на GitHub.
-
Основные элементы:
- Раздел с заголовком и описанием переводчика азбуки Морзе.
- Два текстовых поля для ввода текста и кода Морзе. При вводе текста или кода срабатывают функции
onTextInput(this)иonMorseInput(this)соответственно. - Секция с часто задаваемыми вопросами (FAQ) об азбуке Морзе, представленная в виде аккордеона.
- Таблица с кодами Морзе для различных символов (букв и цифр).
- Подвал страницы с указанием автора проекта.
CSS
CSS стилизует элементы страницы, улучшая их внешний вид и делая интерфейс удобным для пользователя:
-
Основные стили:
- Установка шрифта, базовых отступов и размера текста.
- Стилизация навигации, заголовка и текстовых полей.
- Стилизация аккордеона для секции FAQ, таблицы кодов Морзе и других элементов.
-
Медиа-запросы:
- Используются для обеспечения адаптивного дизайна на различных устройствах, таких как мобильные телефоны и планшеты.
JavaScript
JavaScript реализует логику перевода текста в азбуку Морзе и наоборот, а также добавляет дополнительные функции для взаимодействия пользователя с приложением. Рассмотрим основные части кода:
-
Определение элементов DOM:
const textAreaInputиconst morseAreaInput— получают доступ к полям ввода текста и кода Морзе.const MORSE_CODE— объект, содержащий соответствие между символами и их представлением в азбуке Морзе.
-
Функции перевода:
textToMorseOrMorseToText— универсальная функция, которая обрабатывает перевод текста в код Морзе и обратно, используя соответствия символов и кода Морзе из объектаMORSE_CODE.onTextInput— функция, которая вызывается при вводе текста. Преобразует введенный текст в код Морзе и отображает результат.onMorseInput— функция, вызываемая при вводе кода Морзе. Преобразует введенный код в текст и отображает результат.
-
Функции проверки ввода:
checkInputValidation— проверяет правильность ввода данных в текстовые поля и визуально выделяет ошибки красным цветом.showOutput— отображает результат перевода в соответствующем поле.
-
Копирование текста в буфер обмена:
copyClipboard— функция для копирования текста или кода Морзе в буфер обмена при нажатии на соответствующую кнопку.
-
Отображение таблицы с символами Морзе:
Object.entries(MORSE_CODE).forEach()— заполняет таблицу кодов Морзе в HTML, используя данные из объектаMORSE_CODE.
-
Реализация аккордеона:
- Обработчики событий для каждого аккордеона (
accordion) добавляют или убирают классis-openи изменяют максимальную высоту контента для анимации раскрытия/скрытия FAQ.
- Обработчики событий для каждого аккордеона (
1. Реализация поддержки различных языков
- Описание: Добавить возможность перевода текста на разных языках в азбуку Морзе и обратно.
- Цель: Изучение работы с различными языковыми наборами и их соответствием азбуке Морзе.
- Реализация: Добавить переключатель языка и расширить логику преобразования, чтобы поддерживать различные алфавиты (например, кириллицу, латиницу).
2. Добавление функции аудиовоспроизведения кода Морзе
- Описание: Возможность воспроизведения кода Морзе с помощью звуковых сигналов (точек и тире).
- Цель: Изучение работы с Web Audio API для создания и управления аудиосигналами.
- Реализация: Создать функцию, которая преобразует текст в звуковые сигналы, используя
OscillatorNodeдля воспроизведения коротких и длинных сигналов.
3. Поддержка визуального воспроизведения кода Морзе (световой сигнал)
- Описание: Реализовать функцию, которая использует визуальные индикаторы (например, мигающий свет) для отображения кода Морзе.
- Цель: Закрепление навыков работы с CSS-анимациями и JavaScript для управления анимацией.
- Реализация: Создать элемент (например, кружок), который будет менять цвет или яркость в зависимости от длины сигнала.
4. Добавление функции обучения азбуке Морзе
- Описание: Реализовать режим обучения, который помогает пользователю запомнить символы азбуки Морзе.
- Цель: Изучение работы с динамическим созданием элементов и обработкой событий.
- Реализация: Добавить режим, где пользователю показывается случайный символ в Морзе, и он должен ввести соответствующую букву или символ.
5. Создание клавиатуры для ввода кода Морзе
- Описание: Создать виртуальную клавиатуру для ввода кода Морзе с помощью точек и тире.
- Цель: Закрепление навыков работы с событиями мыши и клавиатуры, а также взаимодействием с DOM.
- Реализация: Добавить виртуальную клавиатуру с кнопками для ввода точек и тире, а также кнопкой для удаления символов и разделителей.
6. Добавление функции перевода текстовых файлов в азбуку Морзе и обратно
- Описание: Возможность загружать текстовые файлы и преобразовывать их содержимое в азбуку Морзе или наоборот.
- Цель: Изучение работы с файловыми API, чтением файлов и их содержимого в JavaScript.
- Реализация: Добавить элемент
<input type="file">для загрузки файлов и функцию для их чтения с использованиемFileReader.
7. Интеграция с браузерными уведомлениями
- Описание: Использовать уведомления для отправки переведенного текста или напоминаний пользователю.
- Цель: Изучение работы с Web Notifications API.
- Реализация: Отправлять уведомление с результатом перевода, например, когда пользователь завершает ввод.
8. Добавление кнопки “Скопировать/Очистить” для удобства пользователя
- Описание: Добавить кнопки для копирования переведенного текста в буфер обмена и очистки всех полей ввода.
- Цель: Закрепление навыков работы с буфером обмена и манипуляцией DOM.
- Реализация: Создать кнопки “Скопировать” и “Очистить” с соответствующими обработчиками событий для выполнения этих действий.
9. Реализация функции сохранения истории переводов
- Описание: Хранить историю всех переводов, чтобы пользователь мог вернуться к предыдущим переводам.
- Цель: Практика работы с
localStorageилиsessionStorageдля сохранения данных на стороне клиента. - Реализация: Сохранять каждый перевод в
localStorageи предоставлять пользователю интерфейс для просмотра или удаления истории переводов.
10. Реализация поддержки темной и светлой темы интерфейса
- Описание: Возможность переключения между светлой и темной темами интерфейса.
- Цель: Закрепление навыков работы с темами и изменением CSS-переменных или классов.
- Реализация: Добавить переключатель темы на странице, который будет изменять тему с помощью CSS-переменных или добавления/удаления классов.
11. Добавление функции “Перевод из аудиовхода”
- Описание: Возможность записи аудиосигналов с микрофона и их расшифровки в текст.
- Цель: Изучение работы с Web Audio API и распознаванием звуковых сигналов.
- Реализация: Использовать API для записи аудио и алгоритмы для распознавания частоты звуковых сигналов (точек и тире).
12. Поддержка морзе-чатов
- Описание: Создание функции обмена сообщениями в реальном времени, где текст автоматически переводится в код Морзе.
- Цель: Практика работы с WebSockets или Firebase для создания реального чата.
- Реализация: Реализовать интерфейс чата, где пользователи могут отправлять сообщения, которые будут автоматически переводиться в Морзе.
13. Добавление режима тестирования на скорость перевода
- Описание: Добавить режим тестирования, где пользователи могут соревноваться, кто быстрее переведет текст в код Морзе или наоборот.
- Цель: Практика работы с таймерами, управлением состоянием игры и манипуляцией DOM.
- Реализация: Создать режим игры, где пользователь видит таймер и случайный текст или код Морзе для перевода.
14. Добавление функции преобразования текста в изображения для визуального кода Морзе
- Описание: Возможность преобразования текста в изображения кода Морзе для сохранения или отправки.
- Цель: Закрепление навыков работы с HTML5 Canvas API.
- Реализация: Создать изображение кода Морзе, используя Canvas API, и позволить пользователю скачать его.
15. Реализация адаптивного дизайна
- Описание: Сделать интерфейс приложения адаптивным для разных устройств, включая мобильные телефоны и планшеты.
- Цель: Закрепление навыков работы с Flexbox, Grid и медиа-запросами в CSS.
- Реализация: Оптимизировать макет для разных размеров экранов, чтобы интерфейс оставался удобным и функциональным на любом устройстве.