
Эта серия упражнений посвящена свойству CSS Scroll Snap. Вы попрактикуетесь в создании прокручиваемых контейнеров, содержимое которых \"прилипает\" к определенным точкам при завершении прокрутки пользователем. Задания охватывают как вертикальную, так и горизонтальную прокрутку, различные типы выравнивания и уровни строгости прилипания. Вам будет предоставлен готовый HTML и частично заполненный CSS. Ваша задача — вписать недостающие свойства или значения в указанные места, чтобы добиться нужного эффекта прокрутки.
- Модуль 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, чтобы активировать базовый функционал Scroll Snap для вертикальной оси.
.container {
height: 300px;
overflow-y: scroll;
border: 1px solid #ccc;
/* Включите Scroll Snap для вертикальной оси */
input1: input2 input3;
}
.item {
height: 300px;
border-bottom: 1px dashed #eee;
display: flex;
align-items: center;
justify-content: center;
font-size: 2em;
/* Укажите, что элемент должен выравниваться по началу */
scroll-snap-align: start;
}
.item:nth-child(odd) {
background-color: #f0f8ff;
}
.item:nth-child(even) {
background-color: #e6f2ff;
}
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
Горизонтальная прокрутка с выравниванием по центру
Создайте контейнер с горизонтальной прокруткой. Элементы внутри должны располагаться в ряд. Настройте Scroll Snap так, чтобы при прокрутке каждый элемент прилипал к центру видимой области контейнера.
.container {
display: flex;
overflow-x: scroll;
width: 370px; /* Ширина соответствует iframe */
border: 1px solid #ccc;
/* Включите Scroll Snap для горизонтальной оси */
input1: x proximity;
}
.item {
flex: 0 0 250px; /* Ширина элемента */
height: 280px;
margin-right: 10px;
background-color: #f0f8ff;
border-right: 1px dashed #eee;
display: flex;
align-items: center;
justify-content: center;
font-size: 2em;
/* Укажите, что элемент должен выравниваться по центру */
input2: input3;
}
.item:last-child {
margin-right: 0;
}
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
Обязательное прилипание (Mandatory)
Настройте вертикальный контейнер так, чтобы прокрутка всегда завершалась на одном из дочерних элементов. Не должно быть возможности остановиться между элементами. Используйте соответствующее значение строгости для `scroll-snap-type`.
.container {
height: 300px;
overflow-y: scroll;
border: 1px solid #ccc;
/* Включите обязательное прилипание по вертикальной оси */
scroll-snap-type: y input1;
}
.item {
height: 300px;
border-bottom: 1px dashed #eee;
display: flex;
align-items: center;
justify-content: center;
font-size: 2em;
scroll-snap-align: start;
}
.item:nth-child(odd) {
background-color: #f0f8ff;
}
.item:nth-child(even) {
background-color: #e6f2ff;
}
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
Галерея изображений с прилипанием
Создайте простую горизонтальную галерею изображений. При прокрутке каждое изображение должно плавно прилипать к началу контейнера. Используйте предоставленные URL изображений.
.gallery {
display: flex;
overflow-x: scroll;
width: 370px;
height: 250px;
border: 1px solid #ccc;
/* Включите горизонтальное прилипание */
input1: input2 proximity;
}
.gallery img {
width: 350px; /* Ширина чуть меньше контейнера */
height: 248px;
object-fit: cover;
margin-right: 10px;
/* Выравнивание по началу */
input3: start;
}
.gallery img:last-child {
margin-right: 0;
}
<div class="gallery">
<img src="https://naytikurs.ru/img/1.png" alt="Image 1">
<img src="https://naytikurs.ru/img/2.png" alt="Image 2">
<img src="https://naytikurs.ru/img/4.png" alt="Image 4">
<img src="https://naytikurs.ru/img/5.png" alt="Image 5">
</div>
Прилипание к концу элемента
Настройте горизонтальный контейнер так, чтобы каждый дочерний элемент прилипал своим правым краем к правому краю контейнера при остановке прокрутки.
.container {
display: flex;
overflow-x: scroll;
width: 370px;
border: 1px solid #ccc;
scroll-snap-type: x proximity;
}
.item {
flex: 0 0 250px;
height: 280px;
margin-right: 10px;
background-color: #f0f8ff;
border-right: 1px dashed #eee;
display: flex;
align-items: center;
justify-content: center;
font-size: 2em;
/* Укажите, что элемент должен выравниваться по своему концу */
input1: input2;
}
.item:last-child {
margin-right: 0;
}
<div class="container">
<div class="item">Item 1</div>
<div class="item">Item 2</div>
<div class="item">Item 3</div>
<div class="item">Item 4</div>
</div>
Отступ прилипания сверху (Scroll Padding)
Представьте, что у вас есть фиксированный заголовок высотой 40px над контейнером прокрутки. Настройте контейнер так, чтобы при прилипании верхняя часть дочернего элемента не скрывалась под этим воображаемым заголовком. Добавьте необходимый отступ сверху для области прилипания.
.container {
height: 300px;
overflow-y: scroll;
border: 1px solid #ccc;
scroll-snap-type: y mandatory;
/* Добавьте отступ сверху для области прилипания, равный 40px */
input1: 40px;
}
.item {
height: 300px;
border-bottom: 1px dashed #eee;
display: flex;
align-items: center;
justify-content: center;
font-size: 2em;
scroll-snap-align: start;
background-color: #e6f2ff;
}
.item:nth-child(odd) {
background-color: #f0f8ff;
}
<div style="height: 40px; background: lightcoral; text-align: center; line-height: 40px; position: sticky; top: 0; z-index: 1;">Фикс. Заголовок</div>
<div class="container">
<div class="item">Секция 1</div>
<div class="item">Секция 2</div>
<div class="item">Секция 3</div>
</div>
Отступ элемента перед прилипанием (Scroll Margin)
Настройте вертикальный контейнер с прилипанием. Сделайте так, чтобы второй элемент прилипал не своим верхним краем, а немного ниже, создавая отступ в 30px перед точкой прилипания именно для этого элемента.
.container {
height: 300px;
overflow-y: scroll;
border: 1px solid #ccc;
scroll-snap-type: y mandatory;
}
.item {
height: 300px;
border-bottom: 1px dashed #eee;
display: flex;
align-items: center;
justify-content: center;
font-size: 2em;
scroll-snap-align: start;
background-color: #f0f8ff;
}
.item:nth-child(even) {
background-color: #e6f2ff;
}
.offset-item {
/* Добавьте отступ сверху для этого элемента перед точкой прилипания, равный 30px */
input1: 30px;
}
<div class="container">
<div class="item">Секция 1</div>
<div class="item offset-item">Секция 2 (с отступом)</div>
<div class="item">Секция 3</div>
<div class="item">Секция 4</div>
</div>