
Эта серия заданий поможет вам научиться оживлять веб-формы с помощью CSS. Вы попрактикуетесь в использовании псевдоклассов для отслеживания состояний элементов формы (:focus, :hover, :valid, :invalid), а также примените CSS переходы (transitions) и анимации (animations) для создания плавных и привлекательных эффектов при взаимодействии пользователя с формой. Задания построены от простого к сложному: начнем с базовых эффектов при наведении и фокусе, а затем перейдем к более сложным анимациям для меток, кнопок и индикации валидации.
- Модуль 1: Основы CSS
- Селекторы элементов.
- Селекторы классов и идентификаторов.
- Цвет текста и фона.
- Размеры и единицы измерения в CSS.
- Семейство шрифта и базовые свойства текста.
- Стилизация текста (жирный, курсив, подчеркивание).
- Выравнивание и интервалы текста.
- Комбинированные селекторы.
- Псевдоклассы для ссылок.
- Приоритеты стилей и каскадность.
- Наследование в CSS.
- Модуль 2: Блочная модель и позиционирование
- Блочная модель CSS (box model).
- Внутренние отступы (padding).
- Внешние отступы (margin).
- Границы элементов (border).
- Сокращенная запись свойств границ.
- Радиус скругления углов (border-radius).
- Свойство display и его значения.
- Блочные элементы (display: block).
- Строчные элементы (display: inline).
- Строчно-блочные элементы (display: inline-block).
- Скрытие элементов (display: none, visibility: hidden).
- Статичное позиционирование (position: static).
- Относительное позиционирование (position: relative).
- Абсолютное позиционирование (position: absolute).
- Фиксированное позиционирование (position: fixed).
- Липкое позиционирование (position: sticky).
- Свойство z-index и порядок наложения элементов.
- Свойство float и его применение.
- Свойство clear для обтекания.
- Центрирование элементов различными способами.
- Модуль 3: Селекторы CSS продвинутый уровень
- Групповые селекторы.
- Селекторы потомков (descendant selectors).
- Дочерние селекторы (child selectors).
- Соседние селекторы (adjacent sibling selectors).
- Общие сиблинги (general sibling selectors).
- Селекторы атрибутов: точное совпадение.
- Селекторы атрибутов: частичное совпадение.
- Псевдоклассы состояний (:hover, :active, :focus, :visited).
- Псевдоклассы для форм (:checked, :disabled, :required).
- Структурные псевдоклассы (:first-child, :last-child).
- Псевдоклассы :nth-child() и :nth-of-type().
- Псевдоклассы :not() и :empty.
- Псевдоэлементы ::before и ::after.
- Псевдоэлементы ::first-letter и ::first-line.
- Псевдоэлемент ::selection.
- Псевдоэлемент ::placeholder.
- Комбинирование псевдоклассов и псевдоэлементов.
- Создание декоративных элементов с помощью псевдоэлементов.
- Модуль 4: Работа с фоном и визуальными эффектами
- Фоновый цвет (background-color).
- Фоновое изображение (background-image).
- Повторение фона (background-repeat).
- Позиционирование фона (background-position).
- Размер фона (background-size).
- Фиксация фона (background-attachment).
- Сокращенная запись свойств фона.
- Множественные фоновые изображения.
- Линейные градиенты (linear-gradient).
- Радиальные градиенты (radial-gradient).
- Конические градиенты (conic-gradient).
- Тень блока (box-shadow).
- Тень текста (text-shadow).
- Прозрачность (opacity).
- Фильтры (filter: blur, grayscale, etc.).
- Режимы смешивания (mix-blend-mode, background-blend-mode).
- Маски с mask-image.
- Формы с clip-path.
- Модуль 5: Типографика продвинутый уровень
- Межстрочное расстояние (line-height).
- Интервалы между буквами (letter-spacing).
- Интервалы между словами (word-spacing).
- Трансформация текста (text-transform).
- Декорирование текста (text-decoration).
- Перенос слов (word-break, overflow-wrap).
- Управление пробелами (white-space).
- Многоколоночный текст (columns).
- Обрезка текста (text-overflow, ellipsis).
- Вертикальное выравнивание текста (vertical-align).
- Направление текста (direction, writing-mode).
- Веб-шрифты и @font-face.
- Модуль 6: Flexbox
- Введение в Flexbox.
- Включение Flexbox (display: flex).
- Flex-контейнер и flex-direction.
- Выравнивание с justify-content.
- Выравнивание с align-items.
- Выравнивание с align-content.
- Свойство align-self для отдельных элементов.
- Свойство flex-wrap.
- Свойство flex-flow (сокращение для direction и wrap).
- Свойство flex-grow.
- Свойство flex-shrink.
- Свойство flex-basis.
- Сокращенное свойство flex.
- Порядок элементов с order.
- Сложные макеты на Flexbox.
- Вложенные flex-контейнеры.
- Создание адаптивной навигационной панели с Flexbox.
- Модуль 7: CSS Grid Layout
- Введение в Grid Layout.
- Включение Grid Layout (display: grid).
- Создание сетки: grid-template-columns.
- Создание сетки: grid-template-rows.
- Единица измерения fr.
- Функция repeat().
- Промежутки с gap, row-gap, column-gap.
- Размещение элементов: grid-column.
- Размещение элементов: grid-row.
- Сокращенная запись grid-area.
- Именованные линии и области.
- Свойство grid-template-areas.
- Автоматическое размещение элементов.
- Автоматические треки (grid-auto-rows, grid-auto-columns).
- Управление потоком элементов (grid-auto-flow).
- Выравнивание в Grid: justify-items и align-items.
- Выравнивание в Grid: justify-content и align-content.
- Выравнивание отдельного элемента (justify-self, align-self).
- Сложные макеты на Grid.
- Комбинирование Grid и Flexbox.
- Модуль 8: Трансформации и переходы
- Трансформации: translate.
- Трансформации: scale.
- Трансформации: rotate.
- Трансформации: skew.
- Комбинирование трансформаций.
- Точка трансформации с transform-origin.
- 3D-трансформации и перспектива.
- Переходы с transition-property.
- Длительность перехода с transition-duration.
- Функции плавности с transition-timing-function.
- Задержка с transition-delay.
- Сокращенное свойство transition.
- Переходы для нескольких свойств.
- Создание интерактивных элементов с переходами.
- Производительность трансформаций и переходов.
- Модуль 9: Анимации
- Создание keyframes.
- Свойство animation-name.
- Свойство animation-duration.
- Свойство animation-timing-function.
- Свойство animation-delay.
- Свойство animation-iteration-count.
- Свойство animation-direction.
- Свойство animation-fill-mode.
- Свойство animation-play-state.
- Сокращенное свойство animation.
- Множественные анимации.
- Создание сложных анимаций.
- Анимации с использованием переменных.
- Оптимизация производительности анимаций.
- Анимации и доступность.
- Модуль 10: Адаптивный дизайн
- Относительные единицы измерения (%, em, rem).
- Единицы vh и vw.
- Медиа-запросы: основы.
- Медиа-запросы: max-width и min-width.
- Медиа-запросы: ориентация устройства.
- Медиа-запросы: типы устройств и медиа-функции.
- Mobile-first подход.
- Адаптивные изображения.
- Элемент picture и атрибуты srcset/sizes.
- Адаптивная типографика.
- Адаптивная навигация.
- Адаптивные таблицы.
- Адаптивные формы.
- Отзывчивые медиа (видео, iframe).
- Тестирование адаптивности.
- Модуль 11: Формы и CSS
- Базовая стилизация input и button.
- Стилизация textarea.
- Стилизация состояний форм (:focus, :valid, :invalid).
- Стилизация placeholder.
- Кастомизация radio и checkbox с помощью CSS.
- Стилизация select и option.
- Создание кастомных выпадающих списков.
- Стилизация range input.
- Стилизация file input.
- Валидация форм и стилизация сообщений об ошибках.
- Модуль 12: Современные возможности CSS
- Переменные CSS (Custom Properties).
- Область видимости переменных.
- Функция calc().
- Свойство object-fit для изображений.
- Свойство object-position.
- Scroll Snap.
- Контейнерные запросы (Container Queries).
- Подсеточные элементы (Subgrid).
- Логические свойства (logical properties).
- CSS Houdini (введение).
- Feature Queries (@supports).
- Новые селекторы CSS (is(), where(), has()).
- Модуль 13: Практические проекты
- Создание адаптивной навигационной панели.
- Создание карточек товаров.
- Создание слайдера изображений на CSS.
- Создание табов.
- Создание дропдаун-меню.
- Создание галереи изображений с фильтрами.
- Создание анимированных иконок.
- Создание адаптивного лендинга.
- Создание тёмной темы с CSS-переменными.
- Создание анимированных кнопок.
- Создание анимированных форм.
- Создание сетки изображений с hover-эффектами.
- Создание адаптивного футера.
- Создание макета блога на CSS Grid.
- Создание адаптивного дашборда.
- Создание интерактивной формы с анимациями.
- Создание CSS-арта.
Эффект фокуса на поле ввода
Сделайте так, чтобы при получении фокуса (клике или переходе табом) поле ввода плавно меняло цвет своей рамки. Используйте CSS переходы для создания плавности.
.styled-input {
padding: 10px;
border: 2px solid #ccc;
border-radius: 4px;
font-size: 16px;
/* Добавьте плавный переход для цвета рамки */
input1: border-color 0.3s ease;
}
/* Стиль для поля ввода при получении фокуса */
.styled-input:input2 {
border-color: #007bff;
outline: none; /* Убираем стандартную обводку браузера */
}
<form>
<label for="name">Имя:</label>
<input type="text" id="name" class="styled-input" placeholder="Введите ваше имя">
</form>
Анимация кнопки при наведении
Добавьте эффект для кнопки отправки формы: при наведении курсора мыши кнопка должна плавно изменять свой фоновый цвет и немного смещаться вверх.
.submit-button {
padding: 10px 20px;
background-color: #28a745;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
/* Добавьте переход для фона и трансформации */
input1: background-color 0.3s ease, input2 0.3s ease;
}
.submit-button:input3 {
background-color: #218838;
/* Смещение кнопки вверх */
transform: translateY(-3px);
}
<form>
<button type="submit" class="submit-button">Отправить</button>
</form>
Анимация метки (placeholder) при фокусе
Создайте эффект, при котором метка поля ввода (label), изначально расположенная поверх поля, при получении полем фокуса или при наличии в нем текста, плавно перемещается вверх и уменьшается в размере.
.form-group {
position: relative;
margin-top: 30px;
}
.form-input {
width: calc(100% - 20px);
padding: 10px;
border: 1px solid #ccc;
border-radius: 4px;
font-size: 16px;
}
.form-label {
position: absolute;
left: 10px;
top: 10px;
color: #999;
pointer-events: none;
/* Плавный переход для свойств top, font-size, color */
input1: all 0.2s ease-out;
}
/* Когда инпут в фокусе ИЛИ не пустой, применяем стиль к соседней метке */
.form-input:input2 + .form-label,
.form-input:not(:placeholder-shown) + .form-label {
top: -20px;
font-size: 12px;
color: #007bff;
}
/* Добавляем плейсхолдер, но делаем его прозрачным, чтобы не мешал метке */
.form-input::placeholder {
color: transparent;
}
<div class="form-group">
<input type="text" id="email" class="form-input" placeholder="Email">
<label for="email" class="form-label">Email</label>
</div>
Индикация обязательных полей
Стилизуйте обязательные для заполнения поля. Добавьте красную рамку для пустых обязательных полей и зеленую для заполненных и валидных. Используйте псевдоклассы для отслеживания состояния полей.
input {
padding: 8px;
margin-bottom: 10px;
border: 1px solid #ccc;
border-radius: 4px;
input1: border-color 0.3s ease;
}
/* Стиль для обязательных полей, которые невалидны (например, пустые) */
input:input2:invalid {
border-color: #dc3545; /* Красный */
}
/* Стиль для обязательных полей, которые валидны */
input:input3:valid {
border-color: #28a745; /* Зеленый */
}
/* Убираем стандартную обводку при фокусе */
input:focus {
outline: none;
}
<form>
<label for="req-field">Обязательное поле:</label>
<input type="text" id="req-field" required placeholder="Нужно заполнить">
<label for="email-field">Email (обязательно):</label>
<input type="email" id="email-field" required placeholder="Введите email">
<label for="opt-field">Необязательное поле:</label>
<input type="text" id="opt-field" placeholder="Можно оставить пустым">
</form>
Анимация 'встряхивания' при невалидном вводе
Добавьте анимацию 'встряхивания' для поля ввода, когда оно является обязательным, но остается пустым или содержит невалидные данные (например, неверный формат email). Анимация должна срабатывать при потере фокуса или попытке отправки формы.
/* Определяем анимацию встряхивания */
input1 shake {
10%, 90% { transform: translateX(-2px); }
20%, 80% { transform: translateX(2px); }
30%, 50%, 70% { transform: translateX(-3px); }
40%, 60% { transform: translateX(3px); }
}
input {
padding: 8px;
margin-bottom: 10px;
border: 1px solid #ccc;
border-radius: 4px;
transition: border-color 0.3s ease;
}
input:focus {
outline: none;
}
/* Применяем анимацию к невалидным обязательным полям */
input:required:invalid {
border-color: #dc3545;
/* Укажите имя анимации, длительность и способ воспроизведения */
input2: shake 0.5s ease-in-out;
}
input:required:valid {
border-color: #28a745;
}
<form>
<label for="shaky-email">Email (обязательно):</label>
<input type="email" id="shaky-email" required placeholder="Попробуйте ввести неверный email">
<button type="submit">Отправить</button>
</form>
Стилизация и анимация кастомного чекбокса
Скройте стандартный чекбокс и создайте собственный с помощью псевдоэлементов `::before` и `::after` для элемента `label`. Добавьте плавную анимацию появления 'галочки' при выборе чекбокса.
.custom-checkbox-container {
display: block;
position: relative;
padding-left: 35px;
margin-bottom: 12px;
cursor: pointer;
font-size: 18px;
user-select: none; /* Запретить выделение текста метки */
}
/* Скрываем стандартный чекбокс */
.custom-checkbox-container input[type="checkbox"] {
position: absolute;
opacity: 0;
cursor: pointer;
height: 0;
width: 0;
}
/* Создаем рамку кастомного чекбокса */
.checkmark {
position: absolute;
top: 0;
left: 0;
height: 25px;
width: 25px;
background-color: #eee;
border: 1px solid #ccc;
border-radius: 4px;
input1: background-color 0.2s ease;
}
/* Стилизуем рамку при наведении */
.custom-checkbox-container:hover input[type="checkbox"] ~ .checkmark {
background-color: #ddd;
}
/* Меняем фон рамки при выборе чекбокса */
.custom-checkbox-container input[type="checkbox"]:checked ~ .checkmark {
background-color: #007bff;
border-color: #007bff;
}
/* Создаем галочку (скрыта по умолчанию) */
.checkmark::after {
content: "";
position: absolute;
display: none; /* Будет изменено при :checked */
left: 9px;
top: 5px;
width: 5px;
height: 10px;
border: solid white;
border-width: 0 3px 3px 0;
transform: rotate(45deg) scale(0);
opacity: 0;
/* Анимация появления галочки */
input2: all 0.2s ease-in-out;
}
/* Показываем и анимируем галочку при выборе чекбокса */
.custom-checkbox-container input[type="checkbox"]:input3 ~ .checkmark::after {
display: block;
transform: rotate(45deg) scale(1);
opacity: 1;
}
<label class="custom-checkbox-container">Согласен с условиями
<input type="checkbox">
<span class="checkmark"></span>
</label>
<label class="custom-checkbox-container">Подписаться на рассылку
<input type="checkbox" checked="checked">
<span class="checkmark"></span>
</label>