Что такое переходы CSS и как их использовать
Опубликовано: 2022-02-16В предыдущей статье вы узнали об основных понятиях CSS-анимации и о том, как их использовать. Можно сказать, что переходы — это упрощенная форма анимации с некоторыми различиями между ними, причем форма запуска анимации является наиболее подходящей.
Еще одно отличие состоит в том, что переходы имеют только два состояния (начальное и конечное состояние), в то время как для анимированного элемента можно определить несколько состояний с помощью правила @keyframes . Переходы запускаются при действии, например при наведении курсора на элемент, но анимация может происходить и без определенного действия, например с задержкой анимации после загрузки страницы.
В этом уроке мы изучим основные понятия переходов CSS на практическом примере. Кроме того, вы также узнаете, как использовать спрайт изображения с помощью CSS.
Давайте начнем!
Шаг 1. - Предлагаемый макет
У нас есть 4 карты, рекламирующие обычные услуги веб-агентства. При наведении на них каждый из элементов внутри карты будет иметь различный переход для достижения желаемого эффекта.
Шаг № 2. - HTML
- Откройте предпочитаемый редактор кода
- Создайте файл HTML с именем index.html .
- Скопируйте и вставьте этот код:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>CSS Transitions</title>
<link href="https://fonts.googleapis.com/css?family=Oswald|Quattrocento&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/style.css">
</head>
<body>
<div class="experts">
<h2>What We Do</h2>
<div class="service-card-container">
<div class="service-card">
<div class="front">
<span class="icon-strategy"></span>
<h3>Strategy</h3>
</div>
<div class="hidden">
<p>The main strategy of a web site is to make visitors convert.</p>
<a href="#">Read more</a>
</div>
</div>
<div class="service-card">
<div class="front">
<span class="icon-ui-ux-design"></span>
<h3>UI / UX Design</h3>
</div>
<div class="hidden">
<p>The design of your site Lorem ipsum dolor sit amet consectetur, adipisicing elit. Voluptate, error.</p>
<a href="#">Read more</a>
</div>
</div>
<div class="service-card">
<div class="front">
<span class="icon-development"></span>
<h3>Development</h3>
</div>
<div class="hidden">
<p>Our team of developers Lorem ipsum dolor sit amet, consectetur adipisicing.</p>
<a href="#">Read more</a>
</div>
</div>
<div class="service-card">
<div class="front">
<span class="icon-digital-marketing"></span>
<h3>Digital Marketing</h3>
</div>
<div class="hidden">
<p>Marketing experts Lorem ipsum dolor sit amet consectetur adipisicing elit.</p>
<a href="#">Read more</a>
</div>
</div>
</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>CSS Transitions</title>
<link href="https://fonts.googleapis.com/css?family=Oswald|Quattrocento&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/style.css">
</head>
<body>
<div class="experts">
<h2>What We Do</h2>
<div class="service-card-container">
<div class="service-card">
<div class="front">
<span class="icon-strategy"></span>
<h3>Strategy</h3>
</div>
<div class="hidden">
<p>The main strategy of a web site is to make visitors convert.</p>
<a href="#">Read more</a>
</div>
</div>
<div class="service-card">
<div class="front">
<span class="icon-ui-ux-design"></span>
<h3>UI / UX Design</h3>
</div>
<div class="hidden">
<p>The design of your site Lorem ipsum dolor sit amet consectetur, adipisicing elit. Voluptate, error.</p>
<a href="#">Read more</a>
</div>
</div>
<div class="service-card">
<div class="front">
<span class="icon-development"></span>
<h3>Development</h3>
</div>
<div class="hidden">
<p>Our team of developers Lorem ipsum dolor sit amet, consectetur adipisicing.</p>
<a href="#">Read more</a>
</div>
</div>
<div class="service-card">
<div class="front">
<span class="icon-digital-marketing"></span>
<h3>Digital Marketing</h3>
</div>
<div class="hidden">
<p>Marketing experts Lorem ipsum dolor sit amet consectetur adipisicing elit.</p>
<a href="#">Read more</a>
</div>
</div>
</div>
</div>
</body>
</html>
Сервис-карта-контейнер имеет 4 разные карты. Каждая карточка состоит из значка, заголовка, некоторого текста и ссылки на соответствующую информацию на сайте. Текст и ссылка будут отображаться при наведении курсора на карточку, в противном случае они будут скрыты.
Шаг 3. - Основные стили CSS
- Создайте файл CSS и назовите его style.css — в HTML-коде уже есть ссылка на этот файл и на Google Fonts.
- Скопируйте и вставьте эти стили, чтобы изменить стили оформления и цвет фона карточек:
/* BASIC RESET */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
list-style: none;
text-decoration: none;
}
/* TYPOGRAPHY */
body {
font-family: 'Quattrocento', serif;
}
h1,
h2,
h3,
h4,
h5,
h6,
a {
font-family: 'Oswald', sans-serif;
}
/* BACKGROUND */
.service-card {
background-color: #0a1128;
color: white;
}
.service-card a {
color: white;
}
/* BASIC RESET */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
list-style: none;
text-decoration: none;
}
/* TYPOGRAPHY */
body {
font-family: 'Quattrocento', serif;
}
h1,
h2,
h3,
h4,
h5,
h6,
a {
font-family: 'Oswald', sans-serif;
}
/* BACKGROUND */
.service-card {
background-color: #0a1128;
color: white;
}
.service-card a {
color: white;
}
Шаг №4. - Стили макета
Давайте воспользуемся CSS Grid, чтобы создать карточки и расположить их горизонтально.
- Отредактируйте код CSS:
/* LAYOUT */
.experts {
margin-top: 36px;
}
.experts h2 {
text-align: center;
}
.service-card-container {
display: grid;
grid-template-columns: repeat(4, 1fr);
}
.service-card {
display: grid;
grid-template-columns: 1fr;
grid-template-rows: auto auto;
grid-row-gap: 18px;
justify-items: center;
align-content: center;
height: 320px;
}
Контейнер карты услуги представляет собой горизонтальную сетку с 4 столбцами. Каждая карта была объявлена также как контейнер сетки с 2 строками. Обратите внимание, что мы объявили фиксированную высоту для каждой карты.

Шаг № 5. - Спрайт изображения
Согласно W3Schools, спрайт изображения представляет собой набор изображений, объединенных в одно изображение. Вы экономите пропускную способность, поскольку странице не нужно будет запрашивать сервер для каждого загружаемого изображения. Он запросит изображение один раз, а затем вы сопоставите необходимую часть изображения в коде CSS.
Изображение имеет ширину 240 пикселей и высоту 480 пикселей. Каждая из иконок занимает площадь 120x120px. Чтобы сопоставить каждое из изображений, мы начинаем с верхнего левого угла изображения с координатами (0px 0px) — следуя порядку «слева — сверху».
Таким образом, изображения в левом столбце спрайта расположены по адресу:
- 0 пикселей 0 пикселей
- 0px -120px
- 0px -240px
- 0px -360px
Это изображения, которые будут использоваться перед наведением.
Изображения в правом столбце спрайта расположены по адресу:
- 120 пикселей 0 пикселей
- 120 пикселей -120 пикселей
- 120 - 240 пикселей
- 120 пикселей -360 пикселей
- Отредактируйте код CSS:
.service-card span {
display: inline-block; /* to be able to apply width and height to the element */
}
.icon-strategy {
background: url(./sprite.png) 0px 0;
width: 120px;
height: 120px;
}
.icon-ui-ux-design {
background: url(./sprite.png) 0px -120px;
width: 120px;
height: 120px;
}
.icon-development {
background: url(./sprite.png) 0px -240px;
width: 120px;
height: 120px;
}
.icon-digital-marketing {
background: url(./sprite.png) 0px -360px;
width: 120px;
height: 120px;
}
/* LAYOUT */
.experts {
margin-top: 36px;
}
.experts h2 {
text-align: center;
}
.service-card-container {
display: grid;
grid-template-columns: repeat(4, 1fr);
}
.service-card {
display: grid;
grid-template-columns: 1fr;
grid-template-rows: auto auto;
grid-row-gap: 18px;
justify-items: center;
align-content: center;
height: 320px;
}
Контейнер карты услуги представляет собой горизонтальную сетку с 4 столбцами. Каждая карта была объявлена также как контейнер сетки с 2 строками. Обратите внимание, что мы объявили фиксированную высоту для каждой карты.
Шаг № 5. - Спрайт изображения
Согласно W3Schools, спрайт изображения представляет собой набор изображений, объединенных в одно изображение. Вы экономите пропускную способность, поскольку странице не нужно будет запрашивать сервер для каждого загружаемого изображения. Он запросит изображение один раз, а затем вы сопоставите необходимую часть изображения в коде CSS.
Изображение имеет ширину 240 пикселей и высоту 480 пикселей. Каждая из иконок занимает площадь 120x120px. Чтобы сопоставить каждое из изображений, мы начинаем с верхнего левого угла изображения с координатами (0px 0px) — следуя порядку «слева — сверху».
Таким образом, изображения в левом столбце спрайта расположены по адресу:
- 0 пикселей 0 пикселей
- 0px -120px
- 0px -240px
- 0px -360px
Это изображения, которые будут использоваться перед наведением.
Изображения в правом столбце спрайта расположены по адресу:
- 120 пикселей 0 пикселей
- 120 пикселей -120 пикселей
- 120 - 240 пикселей
- 120 пикселей -360 пикселей
- Отредактируйте код CSS:
.service-card span {
display: inline-block; /* to be able to apply width and height to the element */
}
.icon-strategy {
background: url(./sprite.png) 0px 0;
width: 120px;
height: 120px;
}
.icon-ui-ux-design {
background: url(./sprite.png) 0px -120px;
width: 120px;
height: 120px;
}
.icon-development {
background: url(./sprite.png) 0px -240px;
width: 120px;
height: 120px;
}
.icon-digital-marketing {
background: url(./sprite.png) 0px -360px;
width: 120px;
height: 120px;
}
Неплохо, правда? Давайте добавим некоторые косметические штрихи, чтобы закончить эту часть с некоторыми отступами.
- Отредактируйте код CSS:
.service-card-container {
display: grid;
grid-template-columns: repeat(4, 1fr);
padding: 0.9em 0 1.8em 0;
}
.service-card {
display: grid;
grid-template-columns: 1fr;
grid-template-rows: auto auto;
grid-row-gap: 18px;
justify-items: center;
align-content: center;
height: 320px;
padding: 0 2.75em;
}
.service-card-container {
display: grid;
grid-template-columns: repeat(4, 1fr);
padding: 0.9em 0 1.8em 0;
}
.service-card {
display: grid;
grid-template-columns: 1fr;
grid-template-rows: auto auto;
grid-row-gap: 18px;
justify-items: center;
align-content: center;
height: 320px;
padding: 0 2.75em;
}
Шаг №6. - CSS-переходы
Свойство перехода CSS имеет 4 разных дочерних свойства:
- transition-property (свойство элемента, к которому будет применяться переход)
- Продолжительность перехода
- временная функция перехода
- задержка перехода
Сокращение:
переход: [свойство перехода] [продолжительность перехода] [функция времени перехода] [задержка перехода]
- Отредактируйте код CSS:
/* TRANSITIONS */
.service-card {
transition: margin-top 0.2s ease-out, height 0.2s ease-out, background 0.2s ease-out;
}
.service-card:hover {
margin-top: -5em;
height: 25em;
background: #006e9c;
}
Как вы можете заметить, можно применять несколько переходов к разным свойствам элемента, разделяя их запятой. Ни один из этих переходов не имеет задержки.
Чтобы карта катилась вверх, вы устанавливаете отрицательное поле сверху и добавляете абсолютное значение этого поля к высоте элемента (320px == 20em).
Пришло время нацелиться на изображения и заставить их меняться с помощью перехода.
- Отредактируйте код CSS:
.icon-strategy,
.icon-ui-ux-design,
.icon-development,
.icon-digital-marketing {
transition: background 0.4s step-end;
}
.service-card:hover .icon-strategy {
background: url(./sprite.png) 120px 0;
width: 120px;
height: 120px;
}
.service-card:hover .icon-ui-ux-design {
background: url(./sprite.png) 120px -120px;
width: 120px;
height: 120px;
}
.service-card:hover .icon-development {
background: url(./sprite.png) 120px -240px;
width: 120px;
height: 120px;
}
.service-card:hover .icon-digital-marketing {
background: url(./sprite.png) 120px -360px;
width: 120px;
height: 120px;
}
Снова:
- свойство перехода: фон
- продолжительность перехода: 0,4 с
- функция времени перехода: шаг-конец
Остальное просто сопоставляется с точной координатой (подробно описанной выше) на спрайте изображения.
Наконец, давайте нацелимся на контейнер .hidden.
- Отредактируйте код CSS:
.hidden,
.hidden a {
transition: color 0.4s ease-out 0.2s;
}
.service-card:hover .hidden {
height: auto;
}
.service-card:hover .hidden,
.service-card:hover .hidden a {
color: white;
}
Здесь нужно обратить внимание на две детали:
- Переход по цвету текста имеет задержку перехода 0,2 с.
- Свойство высоты элемента изменяется при наведении без перехода
Переходы поддерживаются всеми основными браузерами.
Надеюсь, вам понравилось это упражнение. Спасибо за чтение!
Код можно найти здесь.