Примерные вопросы для зачета с оценкой по дисциплине «Основы разработки веб-сервисов»
Структура оценивания
- Вопрос 1-го типа — 20 баллов
- Вопрос 2-го типа — 20 баллов
- Вопрос 3-го типа — 60 баллов
Задание 1 (вопросы 1-го типа, 20 баллов)
Ответить на теоретические вопросы, дать определения, классификации, перечисления.
- В чём ключевое отличие HTML5 от ранних версий HTML (2.0 / 4.01)?
- Какова роль W3C в развитии HTML?
- Чем HTML отличается от XML и XHTML?
- Что такое DOM и почему его называют объектной моделью документа?
- Как браузер интерпретирует HTML-документ?
- Для чего используется
<!DOCTYPE html>? - Из каких обязательных частей состоит базовый HTML-документ?
- В чём различие блочных и строчных элементов?
- Что такое семантические элементы HTML5 и зачем они нужны?
- В чём различие
<div>и семантических элементов (<section>,<article>)? - Чем отличаются методы GET и POST?
- Для чего используются атрибуты
required,pattern,minlength,maxlength? - Чем отличаются
checkboxиradio? - Какую роль играют
<thead>,<tbody>,<tfoot>? - Что такое атрибуты
rowspanиcolspan? - Что такое каскадность в CSS?
- Что такое специфичность селекторов?
- Чем отличается Flexbox от Grid?
- Что входит в Box Model?
- Зачем используется
box-sizing: border-box? - Что делают
transitionиanimation? - В чём отличие псевдоклассов и псевдоэлементов?
- Какова роль JavaScript в архитектуре Web-приложения?
- В чём отличие
letиconst? - Какие существуют примитивные типы данных в JavaScript?
- Чем отличается
map()отforEach()? - Что делает метод
reduce()? - Чем
querySelectorотличается отgetElementById? - Что такое асинхронность в JavaScript и зачем она нужна?
- Почему нельзя доверять данным, полученным от пользователя?
Задание 2 (вопросы 2-го типа, 20 баллов)
Развёрнутые аналитические вопросы с пояснениями и примерами.
- Почему переход от
<div>-верстки к семантическим тегам улучшает SEO и доступность? - Что произойдёт, если не указать кодировку UTF-8?
- Почему важно соблюдать правильную иерархию заголовков (
h1–h6)? - В каких случаях таблица должна использоваться только для табличных данных, а не для верстки?
- Почему
<img>обязан иметь атрибутalt? - Чем опасно использование
target="_blank"безrel="noopener"? - Почему структура HTML-документа важнее его визуального оформления?
- Как HTML участвует в формировании Render Tree браузера?
- Почему селектор
#idимеет более высокий приоритет, чем.class? - Что произойдёт, если задать ширину 300px без
border-boxи добавитьpadding: 20px? - Почему чрезмерное использование
!importantразрушает архитектуру CSS? - В каких случаях Flexbox менее удобен, чем Grid?
- Почему подход Mobile-first считается предпочтительным?
- Как Media Queries влияют на производительность страницы?
- Почему inline-стили считаются плохой практикой?
- Чем опасны слишком сложные CSS-селекторы (например,
div > ul > li > span)? - Почему неправильное использование
position: absoluteможет нарушить layout? - Как некорректный
z-indexсоздаёт проблемы перекрытия элементов? - Почему метод
sort()может неожиданно изменить исходный массив? - В чём разница между мутацией объекта и созданием его копии?
- Почему необходимо использовать
event.preventDefault()при работе с формами? - Что произойдёт, если не проверить
res.okпри использованииfetch()? - Чем опасно использование
innerHTMLс пользовательскими данными? - Почему функции валидации рекомендуется делать “чистыми”?
- Как делегирование событий улучшает производительность интерфейса?
- Почему важно разделять UI-слой и бизнес-логику в JavaScript?
- Что произойдёт, если не обернуть
awaitвtry/catch? - Почему нельзя хранить чувствительные данные только на клиентской стороне?
- Чем отличается фильтрация массива от поиска элемента?
- Почему клиентская валидация не заменяет серверную проверку данных?
Задание 3 (вопросы 3-го типа, 60 баллов)
Практико-ориентированные задания, требующие анализа, проектирования и разработки кода.
Задание 1.
Кейс
В web-приложении отображается список товаров. Пользователь должен перейти к карточке товара по клику на ссылку (или кнопку), при этом навигация может быть как внутренней (якоря), так и через относительные/абсолютные пути. Важно обеспечить корректность ссылок и безопасность при открытии внешних ресурсов.
Задание
Разработайте фрагмент HTML + JS, который:
- содержит список ссылок на товары (минимум 5), где часть ссылок — относительные, часть — абсолютные, часть — якоря (
#id); - добавляет обработчик клика по всем ссылкам через делегирование событий;
- определяет тип ссылки (anchor / relative / absolute);
- для абсолютных ссылок автоматически добавляет
target="_blank"иrel="noopener noreferrer"; - для якорных ссылок выполняет плавную прокрутку к секции.
Результат
- в консоль выводится тип ссылки и её значение;
- внешние ссылки открываются безопасно;
- якоря корректно прокручивают страницу.
Задание 2.
Кейс
На странице присутствует блок <picture> для адаптивной выдачи изображений. В зависимости от ширины экрана браузер должен выбирать подходящий источник. Дополнительно требуется контролировать наличие alt и оптимизацию формата.
Задание
Разработайте HTML + JS, который:
- создаёт компонент изображения через
<picture> + <source> + <img>(минимум 2sourceпод разные условия); - задаёт корректный
altи размеры (для предотвращения layout shift); - на JS проверяет, что
img.altне пустой; - если
altпустой — выводит предупреждение и подставляет значение по умолчанию; - выводит в консоль текущий выбранный
currentSrc.
Результат
- изображение корректно отображается на разных ширинах;
altгарантированно заполнен;- в консоль выводится фактический источник
currentSrc.
Задание 3.
Кейс
Для SEO и корректного отображения в поиске необходимо автоматически контролировать наличие ключевых метатегов (title, description, charset, viewport). В проекте часть страниц может быть собрана из шаблонов и метатеги иногда пропадают.
Задание
Разработайте скрипт на JavaScript, который:
- проверяет наличие
<meta charset>,<meta name="viewport">,<title>,<meta name="description">; - если чего-то не хватает — добавляет недостающий тег в
<head>; - для description устанавливает длину не более 160 символов (обрезка с
…); - логирует список добавленных/исправленных тегов;
- корректно работает при повторном запуске (не дублирует теги).
Результат
- DOM в
<head>содержит полный набор базовых метаданных; - в консоль выводится отчёт: что было добавлено/исправлено.
Задание 4.
Кейс
В форме регистрации часть полей должна валидироваться встроенными средствами HTML (required, minlength, pattern, type=email), а часть — дополнительной логикой JS (например, запрет пробелов в начале/конце, проверка сложности пароля).
Задание
Разработайте HTML-форму + JS, которая:
- включает поля
name,email,password,confirmPassword; - использует HTML-валидацию:
required,minlength,type="email",pattern(для имени/пароля); - в обработчике
submitотменяет отправку и собирает ошибки; -
дополнительно проверяет:
-
trim для name/email;
- совпадение паролей;
- наличие цифры в пароле;
- выводит ошибки списком на страницу (
<ul class="errors">).
Результат
- при ошибках форма не отправляется и показывает список причин;
- при успехе выводится «Успех: данные приняты».
Задание 5.
Кейс
На странице выводится таблица заказов. Требуется обеспечить семантику таблицы (thead/tbody/tfoot), корректные заголовки и доступность. Данные приходят как массив объектов.
Задание
Разработайте JS, который:
- принимает массив заказов
{ id, customer, total, status }; - генерирует таблицу
<table>с<caption>,<thead>,<tbody>,<tfoot>; - рассчитывает итоговую сумму в
<tfoot>; - добавляет атрибуты доступности:
scope="col"для заголовков; - корректно обрабатывает пустой массив (показывает строку «Нет данных»).
Результат
- таблица создаётся динамически;
- итоговая сумма корректна;
- при пустых данных выводится понятное сообщение.
Задание 6.
Кейс
В проекте используется разметка с большим количеством div. Требуется перейти на семантическую структуру HTML5 (header/nav/main/section/article/footer) и одновременно сохранить “контракт” для JS через data-* и классы.
Задание
Разработайте HTML-шаблон страницы + JS, который:
- использует минимум:
<header> <nav> <main> <section> <article> <footer>; - помечает интерактивные элементы
data-action="..."; - на JS реализует обработчик кликов по
data-action(делегирование); - в зависимости от action меняет состояние UI (classList toggle);
- логирует событие: action, элемент, время.
Результат
- структура семантичная;
- JS работает через
data-*; - состояния переключаются без перезагрузки.
Задание 7.
Кейс
Нужно подключить CSS и JS корректно: стили — в <head>, скрипт — с defer, чтобы DOM был доступен. В проекте встречается ошибка, когда JS выполняется до загрузки DOM.
Задание
Разработайте минимальный пример HTML + JS, который:
- подключает внешний CSS и внешний JS;
- использует
deferдля скрипта; - на JS выполняет поиск элемента и изменяет текст/класс;
- подтверждает в консоли, что DOM доступен (например, выводит количество найденных узлов);
- дополнительно покажите пример неправильного подключения (комментарием) и поясните, чем оно плохо.
Результат
- код стабильно работает без
DOMContentLoaded; - видно, что
deferрешает проблему порядка загрузки.
Задание 8.
Кейс
В интерфейсе есть список задач (to-do). Пользователь добавляет задачу через форму, задача появляется в списке, и её можно отметить выполненной. Требуется связка: UI(HTML) → DOM → JS(events) → (псевдо)API.
Задание
Разработайте HTML + JS, который:
- содержит форму добавления задачи и список
<ul>; - по submit добавляет задачу как
<li>с кнопкой/чекбоксом; - использует делегирование событий для отметки выполненной (
.completed); - хранит состояние задач в массиве объектов
{ id, text, completed }; - имитирует API: функция
saveTask(task)возвращает Promise (setTimeout).
Результат
- задачи добавляются и отмечаются;
- в консоль выводится состояние массива;
- имитация асинхронного сохранения работает.
Задание 9.
Кейс
В форме загрузки файла (например, аватар) нужно проверить тип и размер файла до отправки. HTML даёт input type="file", но проверка должна быть на JS.
Задание
Разработайте HTML + JS, который:
- содержит
input type="file"и кнопку отправки; -
по выбору файла проверяет:
-
тип (только image/png, image/jpeg);
- размер (например, до 2MB);
- при ошибке блокирует кнопку submit и показывает сообщение;
- при успехе отображает имя файла и размер;
- корректно обрабатывает ситуацию, если файл не выбран.
Результат
- некорректные файлы не допускаются;
- UI показывает статус проверки;
- submit контролируется JS.
Задание 10.
Кейс
В карточке товара цена отображается в разных форматах. Нужно нормализовать ввод и вывод: пользователь вводит строку, система извлекает число, проверяет диапазон, форматирует.
Задание
Разработайте JS-функцию, которая:
- принимает строку (например,
" 1 299,50 ₽ "или"1299.50"); - нормализует строку и извлекает число;
- валидирует: число > 0 и < 1_000_000;
- форматирует вывод в
ru-RUчерезIntl.NumberFormat(валюта RUB); - при ошибке возвращает диагностическое сообщение.
Результат
- в консоль выводится либо отформатированная цена, либо ошибка;
- корректно обрабатываются пробелы, запятые и символы валюты.
Задание 11.
Кейс
На странице есть несколько полей ввода. Требуется подсветка ошибок доступным способом: aria-invalid, сообщение через aria-describedby, фокус на первом ошибочном поле.
Задание
Разработайте HTML + JS, который:
- содержит форму с минимум 3 полями (name/email/phone);
- по submit валидирует поля и ставит
aria-invalid="true"для неверных; - создаёт сообщения ошибок под полями и связывает их через
aria-describedby; - устанавливает фокус на первое неверное поле;
- при исправлении поля снимает ошибку на событие
input.
Результат
- ошибки отображаются доступно;
- фокус корректно направляется;
- исправление снимает ошибку динамически.
Задание 12.
Кейс
Необходимо построить навигацию по странице (оглавление) на основе заголовков <h2> в контенте. Это усиливает UX и влияет на структуру документа.
Задание
Разработайте JS, который:
- находит все
<h2>внутри<main>; - гарантирует, что у каждого заголовка есть
id(генерирует из текста); - строит список ссылок
<nav><ul>...</ul></nav>; - вставляет навигацию в начало страницы;
- реализует плавный scroll по клику.
Результат
- навигация строится автоматически;
- якоря работают;
- структура страницы становится удобнее.
Задание 13.
Кейс
Нужно продемонстрировать разницу блочных и строчных элементов и корректно управлять ими стилями. В учебном проекте важно увидеть влияние display.
Задание
Разработайте HTML + CSS + JS, который:
- содержит блоки и inline-элементы (div, p, span, a);
-
через кнопки переключает стиль элементов:
-
display: block/inline/inline-block; - выводит в консоль computed style (
getComputedStyle); - визуально показывает изменение размеров/переноса строк;
- корректно работает без перезагрузки.
Результат
- видно влияние display на layout;
- computed style логируется для проверки.
Задание 14.
Кейс
Для UI-карточек требуется сетка: на desktop — 3 колонки, на mobile — 1 колонка. Нужны практики responsive + Grid/Flex.
Задание
Разработайте CSS + HTML, где:
- карточки выводятся списком (минимум 6);
- на ширине > 1024px — 3 колонки (Grid);
- на ширине <= 1024px — 2 колонки;
- на ширине <= 600px — 1 колонка;
- JS дополнительно выводит текущий breakpoint в консоль при resize (throttle).
Результат
- сетка адаптивна;
- логика breakpoint подтверждается в консоли.
Задание 15.
Кейс
Есть кнопка “Показать/скрыть фильтры”. Требуется корректно переключать видимость панели и состояние кнопки, без inline-стилей, только через классы.
Задание
Разработайте HTML + CSS + JS, который:
- содержит панель фильтров и кнопку toggle;
- CSS реализует скрытие через класс (например,
.is-hidden); - JS использует
classList.toggle; - обновляет
aria-expandedна кнопке; - сохраняет состояние в
localStorageи восстанавливает при загрузке.
Результат
- панель управляется корректно и доступно;
- состояние переживает перезагрузку.
Задание 16.
Кейс
В интерфейсе есть “таблица прайса”, но часть данных более уместна как список определений (dl). Нужно показать правильный выбор структуры разметки.
Задание
Разработайте HTML + JS, который:
- получает массив характеристик товара
{ label, value }; - рендерит их как
<dl><dt>...</dt><dd>...</dd></dl>; - для некоторых характеристик добавляет подсказку (title);
- если значение отсутствует — выводит
—; - дополнительно генерирует JSON-объект из этих характеристик и выводит в консоль.
Результат
- разметка семантична;
- данные структурированы и в DOM, и в JSON.
Задание 17.
Кейс
Нужно обработать пользовательский ввод в поле поиска и фильтровать список карточек по названию. Важно: debounce, регистр, пустой ввод.
Задание
Разработайте HTML + JS, который:
- содержит input поиска и список карточек товаров;
- на событие
inputзапускает фильтрацию с debounce 300ms; - ищет по подстроке без учёта регистра;
- при пустом вводе показывает все карточки;
- выводит количество найденных результатов.
Результат
- фильтрация работает плавно;
- результаты и счётчик обновляются динамически.
Задание 18.
Кейс
Нужно показать работу специфичности CSS: конфликт селекторов (tag, class, id, !important). Пользователь должен увидеть, почему стиль “не применяется”.
Задание
Подготовьте HTML + CSS, где:
- один элемент получает конфликтующие стили минимум из 4 селекторов (tag/class/id/inline);
- выведите таблицу приоритетов (комментарием в CSS);
- JS по клику показывает “победившее” правило (через computed style) и источник (описать логикой);
- предложите исправление конфликта без
!important(перестроение селектора/структуры); - продемонстрируйте исправленный вариант.
Результат
- видно, какое правило победило;
- конфликт объяснён и исправлен корректно.
Задание 19.
Кейс
В проекте подключаются несколько CSS-файлов, и порядок подключения ломает тему. Нужно гарантировать, что theme.css подключается последним.
Задание
Разработайте JS, который:
- находит все
<link rel="stylesheet">в<head>; - проверяет наличие
theme.css; - если theme.css не последний — перемещает его в конец
<head>; - логирует порядок файлов до/после;
- не ломает работу при отсутствии theme.css (выводит предупреждение).
Результат
- theme.css всегда последним;
- порядок подтверждён логом.
Задание 20.
Кейс
Нужно создать интерактивную “hero section” с кнопкой CTA и простой анимацией hover, при этом соблюсти доступность фокуса и контраст.
Задание
Разработайте HTML + CSS + JS, который:
- создаёт hero-блок: заголовок, текст, CTA-кнопка;
- CSS делает transition/transform для hover;
- добавляет
:focus-visibleстиль (не хуже hover); - JS по клику на CTA имитирует запрос (Promise + setTimeout) и блокирует кнопку на время;
- по завершении показывает сообщение “Заявка отправлена”.
Результат
- анимация есть, UX корректен;
- кнопка блокируется во время “запроса”;
- сообщение появляется без перезагрузки.
Задание 21.
Кейс
Нужно загрузить список пользователей с API (Fetch), обработать ошибки, отрендерить в DOM. В учебной версии API можно заменить мок-данными.
Задание
Разработайте JS, который:
- делает
fetch("/api/users")(если нет — используйте мок через Promise); - обрабатывает статусы HTTP (не 2xx → ошибка);
- парсит JSON и рендерит список
<ul>; - показывает загрузку (loader) на время запроса;
- при ошибке выводит сообщение пользователю (в DOM) и логирует детали.
Результат
- список пользователей появляется;
- loader исчезает;
- ошибки отображаются корректно.
Задание 22.
Кейс
В форме оформления заказа нужно собрать данные в объект и отправить как JSON на API. При этом важно различать GET/POST и корректно выставлять headers.
Задание
Разработайте HTML + JS, который:
- содержит форму:
customerName,address,deliveryDate,comment; - по submit собирает данные в объект;
- валидирует обязательные поля;
- отправляет POST-запрос
fetch("/api/orders", { method:"POST", headers:{...}, body: JSON.stringify(...) }); - обрабатывает ответ: успех/ошибка, показывает статус пользователю.
Результат
- отправка без перезагрузки;
- JSON формируется корректно;
- UI сообщает результат.
Задание 23.
Кейс
Нужно показать работу data-* как контракта HTML → JS. На карточках товаров есть кнопки действий: add-to-cart, favorite, compare.
Задание
Разработайте HTML + JS, который:
- создаёт карточки товаров (минимум 4), где кнопки имеют
data-action; - одним обработчиком (делегирование) определяет действие;
- обновляет состояние карточки (класс + счетчик в шапке);
- сохраняет состояние (избранное/корзина) в
localStorage; - при загрузке восстанавливает состояния из
localStorage.
Результат
- действия работают;
- состояние сохраняется;
- HTML остаётся “контрактом” для логики.
Задание 24.
Кейс
Есть таблица с объединением ячеек (rowspan/colspan) и группировкой колонок (colgroup). Нужно построить её из данных и обеспечить семантику.
Задание
Создайте HTML-таблицу “Отчёт по продажам”, где:
- используется
<colgroup>для групп колонок (например, “Суммы”); - есть
<thead>,<tbody>,<tfoot>; - в заголовке применяются
rowspan/colspan; - JS заполняет
<tbody>из массива объектов; - итоговые суммы считаются в
<tfoot>.
Результат
- таблица сложная и корректная;
- суммы совпадают с данными;
- структура семантична.
Задание 25.
Кейс
Нужно проверить базовую защиту от XSS в пользовательском вводе комментария: нельзя вставлять HTML как разметку (только текст). Ошибка часто возникает при использовании innerHTML.
Задание
Разработайте HTML + JS, который:
- содержит textarea для комментария и кнопку “Добавить”;
- добавляет комментарии в список;
- вставляет текст только через
textContent(неinnerHTML); - демонстрирует тест: строка с
<script>не должна выполняться и не должна превращаться в DOM; - логирует предупреждение, если пользователь вводит подозрительные теги (простая RegExp-проверка).
Результат
- комментарии безопасно отображаются;
- XSS-вставки не исполняются;
- предупреждение выводится при попытке ввода HTML.
Задание 26.
Кейс
В приложении нужно различать “пустые” HTML-элементы (void) и обычные. Частая ошибка — закрывать void-элементы неправильно или пытаться вкладывать контент.
Задание
Разработайте мини-проверку на JS, которая:
- принимает строку HTML (шаблон) с элементами
img,input,br,meta; - парсит её в DOM (через template);
- проверяет, что void-элементы не содержат детей;
- если обнаружено нарушение (например,
imgс childNodes) — выводит ошибку; - дополнительно выводит список всех найденных void-элементов и их атрибутов.
Результат
- выявляются нарушения структуры;
- выводится отчёт по void-элементам.
Задание 27.
Кейс
Нужно создать компонент формы входа, где при вводе email автоматически приводится к нижнему регистру, а пробелы удаляются. Это снижает ошибки пользователей.
Задание
Разработайте HTML + JS, который:
- содержит поле email и пароль;
-
на событие
inputу email выполняет нормализацию: -
trim; - удаление пробелов внутри;
- приведение к lowerCase;
- валидирует email через RegExp;
- отображает статус “ok/ошибка” рядом с полем;
- блокирует submit при ошибке email.
Результат
- email нормализуется автоматически;
- статус отображается динамически;
- submit доступен только при корректном email.
Задание 28.
Кейс
Нужно показать практику “HTML как контракт для JS”: элементы должны иметь стабильные id/class, чтобы JS-логика не ломалась при изменении визуального оформления.
Задание
Разработайте небольшой UI “сервис заявок”, где:
- HTML содержит: фильтр статуса (select), список заявок, форму добавления;
- все ключевые элементы имеют
idиdata-*; -
JS реализует:
-
добавление заявки;
- фильтрацию по статусу;
- смену статуса заявки;
- данные хранятся в массиве объектов;
- DOM перерисовывается функцией
render().
Результат
- функционал работает полностью;
- структура HTML остаётся предсказуемой для JS;
- есть явная мини-архитектура UI → DOM → JS.
Задание 29.
Кейс
Нужно оптимизировать производительность UI: изображения должны лениво загружаться, а тяжелые элементы — подгружаться по мере необходимости.
Задание
Разработайте HTML + JS, который:
- выводит список карточек с изображениями (минимум 10);
- для
imgиспользуетloading="lazy"и фиксированные размеры; - дополнительно использует
IntersectionObserverдля добавления класса анимации при появлении на экране; - при отсутствии поддержки IntersectionObserver — использует fallback (без анимации);
- логирует в консоль элементы, которые “вошли” в viewport.
Результат
- lazy loading работает;
- карточки анимируются при появлении;
- есть fallback.
Задание 30.
Кейс
Нужно спроектировать клиентскую часть мини-приложения “Каталог курсов” (LMS): HTML задаёт layout и контракт, JS обрабатывает события, API отдаёт данные, UI рендерит карточки и фильтры.
Задание
Разработайте HTML + JS (можно с мок-API), который:
-
содержит:
-
поле поиска,
- фильтр категории,
- контейнер карточек курсов,
- индикатор загрузки;
- загружает курсы через функцию
fetchCourses()(Promise → массив объектов{id, title, category, level}); - рендерит карточки курсов в DOM (без
innerHTMLдля пользовательских данных); - реализует фильтрацию по поиску + категории (с debounce);
- показывает “нет результатов”, если фильтр ничего не нашёл, и корректно обрабатывает ошибки (try/catch + UI сообщение).
Результат
- каталог загружается и фильтруется без перезагрузки;
- UI показывает загрузку/ошибки/пустой результат;
- соблюдена архитектура: UI(HTML) → DOM → JS(events) → API → data.