Conversation
| </div> | ||
| </div> | ||
| <div class="ltl_block"> | ||
| <form class="center" action="cv_2.html"> |
There was a problem hiding this comment.
Семантически верно будет обернуть тегом <form> не только кнопку сабмита, но и все остальные поля этой формы. Более того, от этого напрямую зависит работа нативной html-формы.
Сейчас получается так, что форма и её поля существуют отдельно друг от друга, и при отправке форма как будто бы пустая:
А вот так выглядит набор полей формы, если они находятся внутри тега <form>:
Конечно, можно и вручную собрать значения всех полей и отправить их запросом на сервер. Но если хочется использовать именно нативную html-форму, то нужно поддерживать семантику.
Вот здесь подробнее о FormData: https://learn.javascript.ru/formdata.
There was a problem hiding this comment.
Во второй домашке я и правда собрала все поля вручную. Что будет лучше с семантической стороны: исправить кнопку на просто или все же сделать все формой?
There was a problem hiding this comment.
С семантической стороны правильно будет сделать просто кнопку без формы, тем более, что функционал формы по сути не используется. Не использовать form для формы не будет ошибкой, в современных фреймворках часто так делается.
С практической (и с учебной, как мне кажется) стороны – лучше постараться максимально обойтись нативными средствами html и минимально использовать js. Поэтому я бы сразу обернул всё в форму. Тем более, при редактировании полей у формы тоже сработает событие change, через которое можно централизованно отслеживать изменения:
2025-11-02.20.07.59.mov
При этом, js кода потребуется меньше (не придётся вешать обработчик change на каждое поле), и читаться он будет проще.
| <section class="blocking main"> | ||
| <div class="input_line"> | ||
| <h2 class="h2">Желаемая должность:</h2> | ||
| <input class="input" placeholder="PR-менеджер"> |
There was a problem hiding this comment.
У полей формы должен быть атрибут "name", чтобы при отправке они попали в FormData:
| <input class="input" placeholder="PR-менеджер"> | |
| <input class="input" name="job_title" placeholder="PR-менеджер"> |
| margin-bottom: 15px; | ||
| } | ||
|
|
||
| .center{ |
There was a problem hiding this comment.
Это по сути утилитные классы. Если хочется привести названия в порядок, можно взять пример наименования из какой-нибудь либы вроде https://tailwindcss.com/.
Например, класс с text-align: center обычно называется .text-center, для цвета часто используют что-то вроде .color-main, для фона – .bg-color-secondary и т.д.
| </section> | ||
| <section class="blocking main"> | ||
| <div class="input_line"> | ||
| <h2 class="h2">Желаемая должность:</h2> |
There was a problem hiding this comment.
Семантически это <label>, но скринридер этого не поймёт. Если хочется поддержать доступность, но не хочется использовать <label>, то можно добавить инпуту атрибут aria-label.
| </section> | ||
| <section class="blocking pics"> | ||
| <div class="pics_1"> | ||
| <img class="imgS" src="./img/img1.jpg" alt="Картинка 1"> |
There was a problem hiding this comment.
Для скринридера важно корректное содержимое alt. Можно оставить alt пустым в некоторых случаях.
| <img class="imgS" src="./img/img1.jpg" alt="Картинка 1"> | |
| <img class="imgS" src="./img/img1.jpg" alt="Подробное описание картинки 1"> |
См. подробнее https://doka.guide/html/alt/
| <input class="input" id="name" placeholder="Константин"> | ||
| </div> | ||
| <div class="input_block"> | ||
| <label for="name" class="input_head">Фамилия</label> |
There was a problem hiding this comment.
Небольшая опечатка, из-за которой при клике на этот label фокус будет выставлен на другое поле – name.
| <label for="name" class="input_head">Фамилия</label> | |
| <label for="surname" class="input_head">Фамилия</label> |
| <div class="input_line"> | ||
| <div class="input_block"> | ||
| <label for="exp_start" class="input_head">Начало работы</label> | ||
| <input type="month" class="input" id="exp_start" placeholder="мм.гггг"> |
There was a problem hiding this comment.
Для вёрстки использовать input[type=month] можно, но в дальнейшем при реализации функциональности нужно помнить о его поддержке в разных браузерах.
Например, в Firefox и Safari отобразится обычный текстовый инпут. Нюанс в том, что значение даты в таких инпутах будет храниться по-разному: input[type=month] всегда будет хранить дату в формате YYYY-MM, а текстовый инпут – то, что введёт пользователь. Вот иллюстрация обоих вариантов:
Если поддержка разных браузеров не критична, то можно просто иметь в виду.
There was a problem hiding this comment.
А как такое можно исправить? Изменить на input[type=date], он вроде во всех браузерах поддерживается? Или есть какие-то дополнительные библиотеки?
There was a problem hiding this comment.
Да, можно переключиться на input[type=date] – там формат всегда будет yyyy-mm-dd.
Если оставить input month, то это тоже ок. Но я бы тогда в качестве минимальной защиты добавил валидацию поля через регулярное выражение. Для этого можно использовать атрибут pattern. В этом случае пользователь при попытке отправки формы с некорректной датой получит ошибку валидации:
Также для единообразия я бы поменял placeholder на YYYY-MM, т.к. этот формат по умолчанию используется в input month. Тогда независимо от браузера дата будет отправлена в формате YYYY-MM. Если хочется мм.гггг, то так тоже можно, но тогда придётся нормализовать дату перед сохранением в localStorage/отправкой на сервер и при получении её оттуда и заполнении поля.
Дальше надо смотреть, в каком формате дата ожидается на бэкенде и преобразовывать её к нужному формату, писать код для этого на фронте/бэке, возможно, подключать библиотеки – но это уже out of scope для текущего задания :)
P.S. К слову о валидации – это тоже нативная функциональность html-формы, ещё один аргумент "за" то, чтобы использовать форму. Например, можно легко предотвратить переход к следующему шагу конструктора, если пользователь не заполнил все поля:
| <p>Высшее</p> | ||
| <p class="input_years">09.2019 — 06.2023</p> | ||
| </div> | ||
| <svg class="delete_svg" viewBox="0 0 20 19" width="20" xmlns="http://www.w3.org/2000/svg"> |
There was a problem hiding this comment.
Мне кажется, лучше сразу использовать <button>, чтобы это были кнопки, доступные с клавиатуры.
|
Комментарии по указанным недочётам. - пока что нет адаптации под другие девайсы, так как мне просто не хватило времени. Для поддержки базовой адаптивности можно начать с добавления нескольких правил в блоке
Результат:
Пример правил, которые можно добавить в main.css: @media (max-width: 600px) {
.blocking_heading {
padding: 0;
}
.blocking_heading h1 {
padding: 50px 50px 0;
}
.blocking_heading nav {
overflow-y: auto;
}
.blocking_heading .menu_btn {
white-space: nowrap;
}
.blocking {
padding: 0 50px;
}
.input_line {
flex-direction: column;
}
}Можно добавить остальные нужные правила по аналогии. - я так и не разобралась, как стилизовать drop-down list. Это грустно. Уже хорошо стилизовано, но если хочется больше – то без JavaScript не обойтись. Причем, лучше сразу подключить скрипт/библиотеку (к примеру, select2), потому что поддержка доступности и разных устройств может оказаться весьма нетривиальной задачей, если писать такой скрипт самостоятельно. |
|
Общий комментарий – кода получилось много, по возможности лучше разбивать решение на шаги/подзадачи и создавать отдельные коммиты на каждом завершенном этапе. Это также помогает во время ревью проследить за мыслью автора и, возможно, что-нибудь подсказать :) |
|
Задание выполнено полностью. Комментарии, оставленные мной выше, являются скорее полезной информацией. Оценка по итогам кросс-проверки: зачет (2б). Чек-лист по требованиям к кросс-проверке и критериям задания:
|
|
Спасибо большое за такие подробные комментарии! |
Есть ссылка на вёрстку и исходные макеты [ok] |

В качестве своего проекта я решила сделать конструктор резюме. Это довольно straightforward сервис: человек заполняет информацию о себе и на выходе получает красиво сверстанное резюме в PDF формате.
Макеты сделаны мной исходя из конкурентов, брендбука Вышки и моей фантазии. Ссылка на Figma.
Брендбук влияет, так как основная ЦА данного сервиса - это студенты Вышки.
В данной домашке я постаралась максимально полно реализовать верстку, но есть недочеты: